中级会员
 
- 积分
- 237
- 金钱
- 237
- 注册时间
- 2016-6-26
- 在线时间
- 29 小时
|
作为一个新人,只会模仿,学习,程序中的任何一点不理解都会带来一连串的问号,导致步履维艰。
问题可能很幼稚,但是经过了思考,希望能得到解答。(帮忙看看,这四个思考对不对)
对这个协议还是有点堵得慌。
为了方便有同样问题的人搜索到,这里贴出源代码。
主要看图,图里面有很多标记。
#define USART_REC_LEN 200 //定义最大接收字节数 200 ???小于2^14就行(16384)
//????只存储200个“字节数”,与可以存储16384个“字节数”相比,是不是太小了?
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
//???这里应该是最大缓冲 USART_REC_LEN 个“字节数”而非“字节”
extern u16 USART_RX_STA; //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
#endif
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
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 //还没收到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_REC_LEN-1”,因为末字节为换行符。
USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
|
-
-
|