打印

MCU串口多字节数据解析问题

[复制链接]
1674|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
28335通过串口发送16位数据到PC。数据位是8位。PC能收到数据,但解析有问题。出现前一个字节高8位与后一个字节低8位组成16位现象。
如待发送数据(28335转成8位送出):0x00ff、0xee00、0x00dd、……
PC接收到:0x00、0xff、0xee、0x00、0x00、0xdd、……
但PC程序读接收缓冲区时,可能刚好从0xff开始读,还原成16位后:0xffee、0x0000……
不知道说明白没有,还请给位大侠给指点一下,这个问题该怎么解决。
要求串口以最大速率,连续不断的传。

相关帖子

沙发
dirtwillfly| | 2015-11-18 13:46 | 只看该作者
楼主的串口通讯没有起始位么?

使用特权

评论回复
板凳
打着哈欠说| | 2015-11-18 15:22 | 只看该作者
数据类型的处理中出现的问题。仔细单步调试看看

使用特权

评论回复
地板
warcraftiii|  楼主 | 2015-11-19 10:59 | 只看该作者
回2楼:“起始位”指什么,是每帧中、8个数据位前面那一位么? 还是指28335发送的16位数据应该添加自己的起始标志?
------------------------------------------------------------------------------
回3楼:数据类型的问题注意了。最终要用的是16位整型,但内存中是8位。没头没尾。


如下图:28335连续发送 32767(0x7ffff)。PC接收缓冲区起始地址0x004192a4。上图是正确的,下图是错位的情况。
每次启动PC程序,对齐、错位随机的



使用特权

评论回复
5
baimiaocun2015| | 2015-11-19 14:02 | 只看该作者
这个是需要根据一定的协议进行解析的吧

使用特权

评论回复
6
warcraftiii|  楼主 | 2015-11-19 15:12 | 只看该作者
协议怎么搞,能说下思路吗?
数据是16位AD采上来的,要连续传到PC。0x0000 - 0xffff都是有效数据。
搞成socket那种,先建立连接,再传数据。太麻烦的。

pc串口程序自发自收,发一遍,总是收到两遍,错误也没找到......

使用特权

评论回复
7
精彩人生sun| | 2015-11-19 15:21 | 只看该作者
warcraftiii 发表于 2015-11-19 10:59
回2楼:“起始位”指什么,是每帧中、8个数据位前面那一位么? 还是指28335发送的16位数据应该添加自己的起 ...

好奇怪的问题,估计涉及到指令的区别了吧。用官方的例程试试

使用特权

评论回复
8
warcraftiii|  楼主 | 2015-11-19 16:50 | 只看该作者
28335的例程?官方好像只是SCI模块单字节的收发演示。现在28335发送8位字节数据,PC接收,都是对的。就是PC收到数据后,无**确还原为原始的16位数据

使用特权

评论回复
9
huyuezhan| | 2015-11-19 18:27 | 只看该作者
本帖最后由 huyuezhan 于 2015-11-19 18:31 编辑

建议设计个通讯协议,比如发数据之前先发几个字节当字头,这时候PC用8位收,匹配之后再发数据。就像GPS数据前面的$GPGGA之类的

使用特权

评论回复
10
dirtwillfly| | 2015-11-20 10:15 | 只看该作者
warcraftiii 发表于 2015-11-19 16:50
28335的例程?官方好像只是SCI模块单字节的收发演示。现在28335发送8位字节数据,PC接收,都是对的。就是PC ...

这种情况是上位机的问题

使用特权

评论回复
11
warcraftiii|  楼主 | 2015-11-20 13:45 | 只看该作者
感谢版主大人和各位的回复!
个人觉得9楼和5楼的方法更适合些。比如以两个连续的最大值和最小值表示起始或对齐标志(0x7fff,0x8000,0x7fff,0x8000)。28335发送缓冲区起始4个U16就是这个四个值,在PC缓冲区(char)buf[]中查找这个字符串(7fff80007fff8000)即可。
代价是收发效率降低一些。

使用特权

评论回复
12
android2| | 2015-11-24 20:19 | 只看该作者
用官方的例程运行一下试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

56

帖子

1

粉丝