OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5980|回复: 4

串口实验的中断协议里的if(Res==0x0d)要怎么理解额??

[复制链接]

33

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2014-12-11
在线时间
85 小时
发表于 2015-5-18 14:25:53 | 显示全部楼层 |阅读模式
5金钱

串口实验的if(Res==0x0d)是什么意思额,看不明白这里,求解.....

最佳答案

查看完整内容[请看2#楼]

就是个记号而已。 收到 a 时,做个记号 1,说明收到 a 了; 再收到 b 时,做个记号 2,说明已经按顺序收到 a、b 了; 再收到 c 时,做个记号 3,说明已经按顺序收到 a、b、c 了; 再收到 d 时,做个记号 4,说明已经按顺序收到 a、b、c、d 了; 。。。。。。 如此而已。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-5-18 14:25:54 | 显示全部楼层
就是个记号而已。

收到 a 时,做个记号 1,说明收到 a 了;
再收到 b 时,做个记号 2,说明已经按顺序收到 a、b 了;
再收到 c 时,做个记号 3,说明已经按顺序收到 a、b、c 了;
再收到 d 时,做个记号 4,说明已经按顺序收到 a、b、c、d 了;
。。。。。。

如此而已。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-5-18 15:12:25 | 显示全部楼层
这应当是协议的一部分,一般做末尾,表示一帧有效信息结束。

供参考。具体到你这里,也许不是这样。
回复

使用道具 举报

33

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2014-12-11
在线时间
85 小时
 楼主| 发表于 2015-5-18 15:15:08 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
 int main(void)
 {
  u8 t;
u8 len;
u16 times=0;
delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为9600
  LED_Init();      //LED端口初始化
KEY_Init();          //初始化与按键连接的硬件接口
  while(1)
{
if(USART_RX_STA&0x8000)
{    
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}
else
{
times++;
if(times%5000==0)
{
printf("\r\n战舰STM32开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");  
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);   
}
}  
 }>
回复

使用道具 举报

33

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2014-12-11
在线时间
85 小时
 楼主| 发表于 2015-5-18 15:16:33 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
//  USART_SendData(USART1,Res);
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_RX_STA=0;//接收数据错误,重新开始接收   
}  
}
}      
     } 
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();    
#endif

#endif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表