×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-26 发布时间:
|

1:驱动简述;


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


2:代码示例;


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


uart.h文件



#define COM_TX1_Lenth 20

#define COM_RX1_Lenth 20

 

typedef struct

unsigned char TX_read;   //发送读指针

unsigned char TX_write;   //发送写指针

unsigned char B_TX_busy; //忙标志

 

unsigned char RX_Cnt; //接收字节计数

unsigned char RX_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!=';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;

}

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会