OpenEdv-开源电子网

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

串口通信协议

[复制链接]

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-11-16
在线时间
1 小时
发表于 2016-6-12 13:26:40 | 显示全部楼层 |阅读模式
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;          //接收状态标记



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就认为数据已经完成了,但实际上你的数据还没有发送完成。改进的办法就是:使用定时器超时,判断串口数据接收完成
累吗?累就对啦,至少证明你还活着
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2016-6-12 13:26:41 | 显示全部楼层
这个不是协议,只是通过\r\n来判断数据包是否已经发送完成,但这种方式有一个弊端就是:当你的自定义协议的有效数据里面有这两个字节的时候,MCU就认为数据已经完成了,但实际上你的数据还没有发送完成。改进的办法就是:使用定时器超时,判断串口数据接收完成
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2016-6-12 13:43:59 | 显示全部楼层
那个协议是原子开发板定的,只认\r\n,只要抓到这俩,就认为数据通信结束。实际应用中,自己按照自己的需求设定协议
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-6-12 13:47:16 | 显示全部楼层
是自己定义的

0x0D,0x0A是回车换行符,就是  回车,一般字符串都是以回车结束

就是说接收到回车就结束

串口软件不带协议的,看自己怎么定义
回复

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-11-16
在线时间
1 小时
 楼主| 发表于 2016-6-12 14:24:22 | 显示全部楼层
jermy_z 发表于 2016-6-12 13:43
那个协议是原子开发板定的,只认\r\n,只要抓到这俩,就认为数据通信结束。实际应用中,自己按照自己的需求 ...

谢谢,懂啦
累吗?累就对啦,至少证明你还活着
回复

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-11-16
在线时间
1 小时
 楼主| 发表于 2016-6-12 14:25:14 | 显示全部楼层
止天 发表于 2016-6-12 13:47
是自己定义的

0x0D,0x0A是回车换行符,就是  回车,一般字符串都是以回车结束

谢谢指导
累吗?累就对啦,至少证明你还活着
回复

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-11-16
在线时间
1 小时
 楼主| 发表于 2016-6-12 14:25:50 | 显示全部楼层
小温 发表于 2016-6-12 13:52
这个不是协议,只是通过\r\n来判断数据包是否已经发送完成,但这种方式有一个弊端就是:当你的自定义协议的 ...

多谢指导
累吗?累就对啦,至少证明你还活着
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
发表于 2016-6-12 15:58:02 | 显示全部楼层
小温 发表于 2016-6-12 13:26
这个不是协议,只是通过\r\n来判断数据包是否已经发送完成,但这种方式有一个弊端就是:当你的自定义协议的 ...

你的意思是还是用\r\n来判断帧尾,再加上定时器超时判断?
如果是的话,感觉还是无法解决数据中包含0d0a的情况啊。
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2016-6-12 16:33:48 | 显示全部楼层
any_014 发表于 2016-6-12 15:58
你的意思是还是用\r\n来判断帧尾,再加上定时器超时判断?
如果是的话,感觉还是无法解决数据中包含0d0a ...

不是的,只用定时器超时判断,不用\r\n判断
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 04:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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