51内核UART串行总线环形缓冲区驱动实现

来源:互联网 发布:冒泡排序c语言 编辑:程序博客网 时间:2024/06/16 17:22

目录:

1:驱动简述;

2:代码示例;

3:串口波形;

正文:

1:驱动简述;

驱动实现串口中断接收和发送数据,缓冲区使用环形缓冲区。发送:手动置RI中断标志位为1,发生中断,在中断发送函数中将需要发送的数据一一发送出去,具体见示例;接收:在中断接收函数中保存接收到满足协议的数据,后置接收成功标志位,最终在main函数while循环中轮询接收成功标志位是否置1,如果置1,处理接收到的数据。

2:代码示例;

以下代码模仿modbus协议,贴串口发送函数和中断处理函数,适用于51系列单片机,具体的串口协议可参考modbus协议或者自己根据需求定义。

uart.h文件

#define COM_TX1_Lenth 20#define COM_RX1_Lenth 20typedef struct{ unsigned charTX_read;  //发送读指针unsigned charTX_write;  //发送写指针unsigned charB_TX_busy;//忙标志unsigned char RX_Cnt;//接收字节计数unsigned charRX_read;      //接收读指针unsigned char RX_write;    //接收写指针 }COMx_Define;

uart.c文件

//串口发送函数  发送一个字节void Usart_Tx_Func(unsigned char Data){Usart1_Tx_Buffer[COM1.TX_write] = Data;//装发送缓冲if(++COM1.TX_write >= COM_TX1_Lenth)COM1.TX_write = 0;if(COM1.B_TX_busy == 0)//空闲{  COM1.B_TX_busy = 1;//标志忙TI = 1;        //手动触发发送中断}}//串口发送函数void Usart_Send(unsigned char *ptr,unsigned char num){if(num == 0){for(;*ptr!='\0';ptr++){IO_485 = 1;Usart_Tx_Func(*ptr);}}else{for(;num>0;num--){IO_485 = 1;Usart_Tx_Func(*ptr++);}}}/********************* UART1中断函数************************/void UART1_int (void) interrupt 4{if(RI){RI = 0;TH0 = Modbus_Time_Out>>8;TL0 = Modbus_Time_Out;TR0 = 1;         //定时器开始计时 Usart1_Rx_Buffer[COM1.RX_write] = SBUF;if(++COM1.RX_write >= COM_TX1_Lenth) COM1.RX_write = 0;}if(TI){TI = 0;if(COM1.TX_read != COM1.TX_write){ SBUF = Usart1_Tx_Buffer[COM1.TX_read];if(++COM1.TX_read >= COM_TX1_Lenth)COM1.TX_read = 0;}else{IO_485 = 0;COM1.B_TX_busy = 0;}}}

3:串口波形;


0 0
原创粉丝点击