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;
}
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』