初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2014-11-16
- 在线时间
- 1 小时
|
3金钱
战舰随STM32F103ZE的开发板,在老师讲的第27讲中,有一个协议不懂,那协议是自己定义的吗,它是怎么和串口软件协议的呢?【以下是课件PPT】l
l#define USART_REC_LEN 200 //定义最大接收字节数 200
l u8 USART_RX_BUF[USART_REC_LEN];
//接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
l u16 USART_RX_STA; //接收状态标记
| bit15
| bit14
| bit13~0
| 接收完成标志
| 接收到0X0D标志
| 接收到的有效数据个数
| 程序要求,发送的字符是以回车换行结束(0x0D,0x0A)
以下是代码:
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)//½óêÕμ½áË0x0d
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000;
}
else //»1ûêÕμ½0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
这个不是协议,只是通过\r\n来判断数据包是否已经发送完成,但这种方式有一个弊端就是:当你的自定义协议的有效数据里面有这两个字节的时候,MCU就认为数据已经完成了,但实际上你的数据还没有发送完成。改进的办法就是:使用定时器超时,判断串口数据接收完成
|