野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10094|回复: 8

串口通信的相关问题

[复制链接]
发表于 2017-3-7 10:33:10 | 显示全部楼层 |阅读模式
在主机与从机的串口通信过程,如果发送结尾的校验位设为0x0d 0x0a;接收到0x0d停止接收有效数据,接收到0x0a接收完成;如果有效数据里面也有0x0d,那我就没办法接收到0x0d后面的有效数据了,希望朋友们告诉我该怎么办;尝试想过在发送端避免发送校验字符,但这样不是个有效的解决方案,程序体量大的时候问题也来了;


回复

使用道具 举报

发表于 2017-3-7 10:53:39 | 显示全部楼层
你可以修改通信协议啊!
回复 支持 反对

使用道具 举报

发表于 2017-3-7 10:55:04 | 显示全部楼层
包的前面加个数据长度说明,接收方加上数据长度偏移后,再检测这个0x0d标志
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 10:59:17 | 显示全部楼层
flyleaf 发表于 2017-3-7 10:55
包的前面加个数据长度说明,接收方加上数据长度偏移后,再检测这个0x0d标志

可以说的稍微详细点吗?包前面的数据长度说明是用来存放什么的,还有数据长度偏移是做什么的;谢谢了,新手一个没能理解
回复 支持 反对

使用道具 举报

发表于 2017-3-7 11:28:14 | 显示全部楼层
yaojunjie 发表于 2017-3-7 10:59
可以说的稍微详细点吗?包前面的数据长度说明是用来存放什么的,还有数据长度偏移是做什么的;谢谢了,新 ...

接收端检测到长度说明符,就可以根据数据长度跳过数据部分的检测,只检测后面特定的位置的标志位,那就不会因为数据部分有标志而影响到了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 14:46:40 | 显示全部楼层
flyleaf 发表于 2017-3-7 11:28
接收端检测到长度说明符,就可以根据数据长度跳过数据部分的检测,只检测后面特定的位置的标志位,那就不 ...

我在接收到端通过一个占两个字节的状态位USART_RX_STA来判断,其中高15bit表示接收完成标志,高14bit表示接收到了0x0d,bit13-bit0表示接收到了有效字节数,我是每一个字节都要读取进来作比较,如果在发送端有一位记录数据的长度,那怎么分辨这位是数据还是协议的内容呢?感觉自己还是没有明白你的意思呢
回复 支持 反对

使用道具 举报

发表于 2017-3-7 15:23:08 | 显示全部楼层
例如:
数据包头, 0xCC 0XDD +两个字节表示数据段的长度N
数据段,N个字节
数据包尾 ,0xAA 0XBB +可自己加校验码

接收端一开始检测到0xCC 0XDD 就当是开始接收数据,并且根据其后的两个字节知道数据段长度为N
接收N个字节的数据,不检测
判断第N+1个数据N+2数据是不是0xAA 0XBB

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 16:37:01 | 显示全部楼层
flyleaf 发表于 2017-3-7 15:23
例如:
数据包头, 0xCC 0XDD +两个字节表示数据段的长度N
数据段,N个字节

谢谢呢耐心的讲解,我的位是0x0d 0x0a,可以参考ModBus Ascll的通用标准来写吗?自己琢磨的协议格式觉得问题好多,也想不明白!
回复 支持 反对

使用道具 举报

发表于 2017-3-7 17:05:59 | 显示全部楼层
yaojunjie 发表于 2017-3-7 16:37
谢谢呢耐心的讲解,我的位是0x0d 0x0a,可以参考ModBus Ascll的通用标准来写吗?自己琢磨的协议格式觉得问 ...

那就直接移植
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-15 07:44 , Processed in 0.029136 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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