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
- 51内核UART串行总线环形缓冲区驱动实现
- SPI、I2C、UART串行总线
- linux内核环形缓冲区
- 环形缓冲区的实现
- 环形缓冲区的实现
- 环形缓冲区的实现
- 环形缓冲区的实现
- 通用串行总线驱动失效
- 环形缓冲区的实现原理
- 环形缓冲区的实现原理
- 环形缓冲区的c实现
- 环形缓冲区的实现原理
- android如何实现环形缓冲区
- 环形缓冲区的实现原理
- FIFO环形缓冲区的实现
- 环形缓冲区的实现原理
- 环形缓冲区的实现原理
- SPI、I2C、UART三种串行总线协议的区别
- dcm4chee-arc-light-5.4.1-mysql安装步骤
- 跳台阶
- 进程控制
- 面试心得与总结---BAT、网易、蘑菇街
- Android Studio常用快捷键
- 51内核UART串行总线环形缓冲区驱动实现
- Android学习记录(二十七)--ListView刷新记录滑动位置的实现。
- 线程与进程的比较
- STL hashtable
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- CodeForces 371C Hamburgers制造汉堡包二分查找
- Android抽象布局——include、merge 、ViewStub
- PixelFormat(像素格式)以及view的高度getX(),getRawX()以及Path所用
- jdk自带线程池详解