最近空闲时间教几个小师弟时写的例子,用到了串口协议解析,状态机。仅限于入门萌新,大牛请给意见~
所有资料51hei提供下载:
单片机返回字符.rar
(19.41 KB, 下载次数: 59)
串口接收数据(帧头 数据长度 数据 帧尾部) .rar
(43.67 KB, 下载次数: 87)
串口接收数据(帧头 数据 帧尾部)可自动下载2.rar
(48.87 KB, 下载次数: 96)
单片机源程序如下:
- #include "cmmu.h"
- uchar COM_State = FIND_HEADER;
- uchar UART_Recv_BUF[UART_BUF_LEN]; //串口数据缓冲区
- uchar UART_Recv_Count;
- bit UART_Overflow_Flag = 0;
- void CMD_Init(void)
- {
- UartInit();
- }
- void CMD_Send(void)
- {
- uchar i;
- if(UART_Overflow_Flag)
- {
- // UART_Send_Byte(COMMAND_HEADER);
- for (i=0; i<UART_BUF_LEN; i++)
- {
- UART_Send_Byte(UART_Recv_BUF[i]);
- UART_Recv_BUF[i] =0;
- }
- UART_Send_Byte(COMMAND_FRAME);
- // UART_Overflow_Flag = 0;
- }
- }
- /*串口中断接收程序,帧头帧尾判断,固定数据长度UART_BUF_LEN*/
- void UART_Int(void) interrupt INT_UART1
- {
- if (RI)
- {
- RI = 0;
- if (!UART_Overflow_Flag)
- {
- Check_DownLoda_Data(SBUF);
- switch(COM_State)
- {
-
- case FIND_HEADER :
- UART_Recv_Count=0;
- if(SBUF == COMMAND_HEADER)
- {
- COM_State = GETTING_DATA;
- }
- break;
-
- case GETTING_DATA:
- UART_Recv_BUF[UART_Recv_Count++] = SBUF;
- if (UART_Recv_Count==(UART_BUF_LEN))
- {
- COM_State = FIND_FRAME;
- }
- break;
- case FIND_FRAME:
- if(SBUF == COMMAND_FRAME)
- {
- UART_Overflow_Flag=1;
- }
- COM_State = FIND_HEADER;
- break;
- default:
- COM_State = FIND_HEADER;
- break;
-
- }
- }
- }
- if (TI)
- {
- TI = 0;
- }
- }
复制代码
|