0、串口总线标准:RS-232C RS-422A RS-485
1、串口通讯,分为同步通讯和异步通讯,我们通常使用的都是异步串口。通讯时,双方先约定好数据帧的格式,即波特率,数据位,停止位,奇偶校验位等。
2、串口通信数据格式
3、串口接线
1)
两端的插头上有1-9的标号,如果用万用表测相对应号码的针都是短通的,就是直连线。
不是一对一通的就是交叉。
交叉就是收-发,发-收,一样设备用平行就会发-发,收-收
我们用的是交叉串口线。
2)
进行TTL与EIA电平转换:CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。
正逻辑:高电平---1 低电平----0 TTL 大于0.4规定为“1”, 小于0.4为0
RS-232-C标准:RS-232-C采用负逻辑规定逻辑电平,信号电平与通常的TTL电平也不兼容,RS-232-C将-5V~-15V规定为“1”,+5V~+15V规定为“0”
3)
发送: TXD0—》MAX232—》RSTXD0-à串口线---》PC
接收: PC-à串口线---》RSRXD0-- MAX232-àRXD0-à嵌入式CPU
4、串口驱动程序设计
5、串口通信原理方框图
6、程序实现
/***********************************************
Function name : uart_init
Description : 串口0初始化
Input parameter : none
Return : none
Others :
*************************************************/
void uart_init()
{
//设置GPHCON:GPH2、GPH3配置为串口发送和接收功能
rGPHCON &= ~(0xf << 4);
rGPHCON |= (0xa << 4);
//不使能上拉电阻
GPHUP |= 1<<3|1<<2;
//设置uart行寄存器:正常模式、无校验、1停止位、8数据位
rULCON0 = 0x3;
//设置uart控制寄存器:时钟选择PCLK、使能超时中断、
//收发方式为中断和轮询、其他默认
rUCON0 = 0x5;
//设置uartFIFO控制寄存器:中断触发深度、使能FIFO
rUFCON0 = 0x01;
//uart模式控制寄存器:不使能自动流控制模式
rUMCON0 = 0x0;
//设置波特率为115200:UBRDIV = PCLK/(115200 * 16) - 1
rUBRDIV0 = PCLK/(BOUD * 16) - 1;
}
/***********************************************
Function name : uart_putc
Description : 串口0发送数据
Input parameter : ch:要发送的字符
Return : none
Others :
*************************************************/
void uart_putc(unsigned char ch)
{
if(ch == 'n')
{
//等待fifo不为满
while(rUFSTAT0 & (1 << 14));
rUTXH0 = 'r';
}
//等待fifo不为满
while(rUFSTAT0 & (1 << 14));
//向发送buffer写入数据
rUTXH0 = ch;
}
/***********************************************
Function name : uart_getc
Description : 串口0接收数据
Input parameter : none
Return : 接收到的字符
Others :
*************************************************/
unsigned char uart_getc(void)
{
unsigned char ret;
while ((rUFSTAT0 & 0x7f) == 0); /* 如果RX FIFO空,等待 */
ret = rURXH0; /* 取数据 */
return ret;
}
/***********************************************
Function name : uart_putstr
Description : 串口0发送字符串
Input parameter : ptr:字符串指针
Return : none
Others :
*************************************************/
void uart_putstr(char *ptr)
{
while(*ptr)
{
uart_putc(*ptr++);
}
}
/***********************************************
Function name : uart_getstr
Description : 串口0接收字符串
Input parameter : ptr:字符串指针
Return : none
Others :
*************************************************/
void uart_getstr(char *ptr)
{
char ch;
while((ch = uart_getc()) != 'r')
{
if(ch == 'b')
{
ptr--;
uart_putstr("b b");
}
else
{
*ptr++ = ch;
uart_putc(ch);
}
}
*ptr = '