串口状态机的应用
2018-03-01 17:15
85 查看
以前并没有发现串口状态机的好处,最近用到了这种指定格式的数据包解析,才发现这东西非常的好用,可以对串口的数据包进行过滤只解出符合协议的数据包。这个呢其实就是一种思想,不仅仅局限于串口之间的数据传输,我认为可以用在很多指定数据协议的数据包传输解析当中。大致代码思想写在下面,希望对大家有帮助。
/* 主要的变量声明在这边 */ /* 串口状态机宏 */ #define DATA_HEAD 3 #define DATA_LEN 4 #define DATA_COM 5 #define DATA_NUM 6 #define DATA_CRC 7 #define DATA_TAIL 8 #define DATA_ADD 9 #define COMMAND_SIZE 20 int g_count = 0; //状态机缓冲区下标 int g_uart_state = DATA_HEAD;//串口状态机状态标志 unsigned char data; //串口数据 //状态机缓冲区 unsigned char command_buf[COMMAND_SIZE] = {0}; unsigned char *bufptr = &data; while (1) { /* 从串口中一次只读取一个字符 */ retv = read(fd, bufptr, 1); if (-1 == retv) { printf("read error!\n"); exit(1); } /* ---------------- 串口状态机----------------- 数据包格式 BYTE | BYTE | BYTE | BYTE | BYTE 包头 长度 命令 数据 包尾 */ switch (g_uart_state) { /* 查找包头状态 */ case DATA_HEAD: { /* 找到包头 */ if (data == 包头) { /* 将包头存入指令数组 */ command_buf[g_count++] = data; /* 改变串口状态机状态为长度 */ g_uart_state = DATA_LEN; } else { //包头匹配错误 g_count = 0; } break; } /* 检查数据长度 */ case DATA_LEN: { if (data == 长度) { //长度匹配 command_buf[g_count++] = data; //改变状态机的状态为命令 g_uart_state = DATA_COM; } else { //长度匹配错误 g_count = 0; //改变状态机的状态为包头 g_uart_state = DATA_HEAD; } break; } /* 检查命令是否合法 */ case DATA_COM: { if (data == 命令) { //合法存入 command_buf[g_count++] = data; //改变状态机的状态为数据 g_uart_state = DATA_NUM; } else { //不合法改变状态机状态为包头 g_count = 0; g_uart_state = DATA_HEAD; } break; } /* 检查数据是否合法 */ case DATA_NUM: { if (data是合法的数据) { //合法存入 command_buf[g_count++] = data; //改变状态机的状态为包尾 g_uart_state = DATA_TAIL; } else { //不合法改变状态机状态为包头 g_count = 0; g_uart_state = DATA_HEAD; } break; } /* 检查包尾*/ case DATA_TAIL: { if (data == 包尾) { command_buf[g_count++] = data; //成功的解析到一个完整的符合传输协议的串口数据 } /* 完成一次数据包的解析读取 */ g_count = 0; g_uart_state = DATA_HEAD; break; } default: { g_count = 0; g_uart_state = DATA_HEAD; memset(command_buf, '\0', sizeof(command_buf)); } } }
相关文章推荐
- 状态机在嵌入式串口通信编程中的应用
- 串口状态机的应用[转载]
- 串口编程中SerialPort类介绍以及应用
- 嵌入式Linux串口应用编程之串口配置
- 简单串口应用(C源码)
- 深入浅出VC++串口编程之短信应用开发
- 【cocos2dx】状态机应用场景及原理
- 基于proteus的51单片机仿真实例七十一、并口转串口器件74HC165应用实例
- linux下串口gps应用
- STM32 DMA 应用之(二) DMA 串口 数据传输--发送
- linux基础复习(7)串口应用开发
- Linux 程序设计学习笔记----终端及串口编程及实例应用
- 远程串口应用在实验数据采集
- QT5 串口应用
- 状态机的应用
- LINUX下(虚拟机中的LINUX系统)串口通讯 part3------fedora 9下USB转串口的应用和minicom的设置(转载)
- 状态机思路在程序设计中的应用
- STM32 USART 普通串口应用,调试总结
- s5p4418 android 驱动 hal 应用之led 串口 rs485 can总线应用(app 有源码)
- linux串口应用编程入门,文档胜于一切教程