OpenEdv-开源电子网

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

stm32f103串口接收数据解析的问题

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
发表于 2018-7-25 18:47:51 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 Quantum 于 2018-7-25 18:47 编辑

描述:生产测试装备把多个命令通过串口发给CPU,这些命令是有头有尾的。CPU通过解析这些命令来调用相关函数从而控制外设做出相应的动作,也有的命令是返回给生产测试装备的。   

思考:先把接收到的指令放在接收缓冲区中,然后读取缓冲区中的内容,调用相关函数。

问题:现在,头、尾和命令字都给了。1. 具体该怎样搭建这个解析的框架?2. 如何从接收缓冲区里读出命令字?3. 接收缓冲区的大小是由什么决定的?


本人菜鸟一枚,一旦牵扯到存储的东西,就晕头转向。哪位大神解答,谢谢~


最佳答案

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

1、架构你其实已经有了,就差具体实现; 2、检查分析接收字符,核对头尾是否符合要求,符合则掐头去尾取出命令字; 3、接收缓冲不用太大,能够存储三五条命令足矣,串口速度不快或者传输不频繁的话,存储一两条就够了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-25 18:47:52 | 显示全部楼层
1、架构你其实已经有了,就差具体实现;
2、检查分析接收字符,核对头尾是否符合要求,符合则掐头去尾取出命令字;
3、接收缓冲不用太大,能够存储三五条命令足矣,串口速度不快或者传输不频繁的话,存储一两条就够了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

18

主题

155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3972
金钱
3972
注册时间
2016-7-8
在线时间
827 小时
发表于 2018-7-25 19:40:05 | 显示全部楼层
可以参考下原子哥的例程
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-25 20:56:11 | 显示全部楼层
warship 发表于 2018-7-25 20:21
1、架构你其实已经有了,就差具体实现;
2、检查分析接收字符,核对头尾是否符合要求,符合则掐头去尾取出 ...

谢谢您的回答。如果帧头是0xAA, 帧尾是0x0D, 那么依次左右移8位再赋给新的数组,然后对这个数组逐字节检查,如果0x0F是一个已经定义好的命令字,那检查到0x0F  CPU 就做出反应,是这样吗?
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-25 20:57:36 | 显示全部楼层
yanzhuangsongqi 发表于 2018-7-25 19:40
可以参考下原子哥的例程

谢谢,请问该参考哪个例程?例程我还没有学完
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-25 20:57:48 | 显示全部楼层
yanzhuangsongqi 发表于 2018-7-25 19:40
可以参考下原子哥的例程

谢谢,请问该参考哪个例程?例程我还没有学完
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-25 20:59:40 | 显示全部楼层
Quantum 发表于 2018-7-25 20:56
谢谢您的回答。如果帧头是0xAA, 帧尾是0x0D, 那么依次左右移8位再赋给新的数组,然后对这个数组逐字节检 ...

干嘛要左右移8位,
如果规定帧头是0xAA, 帧尾是0x0D
检查正确就丢弃不管了,
直接取命令0x0F执行相应的动作就行了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-26 12:05:11 | 显示全部楼层
warship 发表于 2018-7-25 20:59
干嘛要左右移8位,
如果规定帧头是0xAA, 帧尾是0x0D
检查正确就丢弃不管了,

//RX_BUF[MAX]是接收缓冲区,已经接收完了,就是说里面的东西已经写死,再按下面执行就达到了命令解析的目的了,对吗?
if(RX_BUF[0]!=0xAA)
{
     {printf("other\n");}//判断第一个元素不是0xAA
else
     {
      switch(RX_BUF[1]) //判断第二个元素是0x26还是0x0A
         {case 0x26:
              printf("0x26\n");
          break;
          case 0x0A:
              printf("0x0A\n");
          break;
          default:
          break;
     }
}
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-26 12:14:36 | 显示全部楼层
Quantum 发表于 2018-7-26 12:05
//RX_BUF[MAX]是接收缓冲区,已经接收完了,就是说里面的东西已经写死,再按下面执行就达到了命令解析的 ...

不行,缓冲区中的第一个数不一定就是命令头,你要自己找头和尾的,设置头尾的目的就是防止解析错误和传输误码的
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-26 14:23:01 | 显示全部楼层
warship 发表于 2018-7-26 12:14
不行,缓冲区中的第一个数不一定就是命令头,你要自己找头和尾的,设置头尾的目的就是防止解析错误和传输 ...

为什么不一定就是帧头,缓冲区不是协议已经定好的吗?另外,晚辈编程经验不足,不知道怎么掐头去尾怎么取命令,都停留在口头表述的层面,一旦写代码就懵。请不吝赐教,谢谢您~
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-26 15:16:34 | 显示全部楼层
原子的串口例程是接收字符串,它以接收0DH,0AH即回车、换行作为结束标志,这样才可以做到缓冲区的第一个字符就是字符串的第一个字符。对于二进制的接收处理则靠分析解析,缓冲区仅起缓冲作用。如果你所收数据全是工整的标准头尾,可以简化解析,仿一下原子的例程,收到头就舍弃,作标记已经收到头,后边收到的正文才放进缓存,直到收到尾,清标记,准备收下一帧。这样,缓存的内容就完全是纯正文了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

9

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-3-28
在线时间
64 小时
发表于 2018-7-26 15:40:14 | 显示全部楼层
提供个我的之前项目文件,希望能帮到你,可能有些写的过于简单,modbus.txt文件只是名字叫modbus,并没有去按modbus去写,不要理解错了。usart.txt跟原子哥的有点类似但不一样 我是以0xFD为帧头,0xFA 0xFA为帧尾

Modbus.rar

5.19 KB, 下载次数: 493

usart.rar

2.11 KB, 下载次数: 637

回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-26 15:44:11 | 显示全部楼层
warship 发表于 2018-7-26 15:16
原子的串口例程是接收字符串,它以接收0DH,0AH即回车、换行作为结束标志,这样才可以做到缓冲区的第一个字 ...

很赞,明白了,谢谢~
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-12-16
在线时间
17 小时
 楼主| 发表于 2018-7-26 15:45:38 | 显示全部楼层
zkevin8879 发表于 2018-7-26 15:40
提供个我的之前项目文件,希望能帮到你,可能有些写的过于简单,modbus.txt文件只是名字叫modbus,并没有去 ...

好的收到,我学习学习,谢谢您~
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-4-27
在线时间
2 小时
发表于 2019-5-22 16:10:47 来自手机 | 显示全部楼层
您好,我也想解析数据控制机械手
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-4-27
在线时间
2 小时
发表于 2019-5-22 16:11:22 来自手机 | 显示全部楼层
可以交流一下么
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 02:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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