以前并没有发现串口状态机的好处,以至于忘记了到底怎么用到底是干什么的,最近用到了这种指定格式的数据包解析,才发现这东西非常的好用,可以增加数据传输的鲁棒性,可以对串口的数据包进行过滤只解出符合协议的数据包。这个呢其实就是一种思想,不仅仅局限于串口之间的数据传输,我认为可以用在很多指定数据协议的数据包传输解析当中。大致代码思想写在下面,希望对大家有帮助。
/*
主要的变量声明在这边
/* 串口状态机宏 */
#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 &#