社区
单片机/工控
帖子详情
串口通信 那样的协议最稳定
zynh1020
2011-01-06 09:27:34
现在我涉及到一个产品的开发,上位机和下位机之间通过串口通信,本来已经实现了一种简单的串口通信,但是感觉还是有消息会丢失,我想问问大家,有关于串口方面很稳定的串口协议没有?
我们的串口通信解决的问题很简单,就是下位机将采集到的数据传递给上位机,首先发送一个8位的index,然后发送两次16位的data。
谢谢
...全文
515
15
打赏
收藏
串口通信 那样的协议最稳定
现在我涉及到一个产品的开发,上位机和下位机之间通过串口通信,本来已经实现了一种简单的串口通信,但是感觉还是有消息会丢失,我想问问大家,有关于串口方面很稳定的串口协议没有? 我们的串口通信解决的问题很简单,就是下位机将采集到的数据传递给上位机,首先发送一个8位的index,然后发送两次16位的data。 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
MCUEL_21
2011-01-18
打赏
举报
回复
采用Xmodem协议来通讯吧!纠错率高达99.9984%
保证你最放心了!
of123
2011-01-10
打赏
举报
回复
它是丢包,又不是传输错误。
如果 Index 和 数据都是二进制数的话,用回车等结束符就没有用,那是针对字符编码传输设计的。
对于楼主这种固定长度传输,也没有必要搞什么含数据长度域的包头。
丢包的问题,应该出在主机端接收机制。最好 5 字节触发接收事件,同时每次从串口缓冲区取 5 字节。
如果担心有传输错误,附加校验码也是可以的。但那是另外一个问题了。
ga6840
2011-01-09
打赏
举报
回复
[Quote=引用 6 楼 dreamjack 的回复:]
引用 2 楼 knate 的回复:
串口比较容易丢包.
有可能10个字节只接受到9个,这个得考虑进去.
只要有可能就把两次的数据包发送的时间设置有足够长的间隔时间.
把两个数据包隔开,
PC机采用事件触发方式,有时会丢失数据
[/Quote]
pc端可以用异步(overlap)也可以用同步 ,不一定用event触发
再有 对于二楼 我觉得串口的错误率是与波特率、单片机busclk 相关的 没有一定的比率 再说
串口232协议 一开始就是为了应用与工控领域 设计的时候就具有传输长 、稳定的特征 在一定波特绿下是可以保证成功率的 而且和发的间隔没神码关系吧?
「已注销」
2011-01-09
打赏
举报
回复
Modbus协议,Modbus协议有两种,编程方法如下
Modbus两种协议的编程方法:
1、LRC校验
LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。
LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。下面是它对应的代码:
BYTE GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码
{
BYTE byLrc = 0;
char pBuf[4];
int nData = 0;
for(i=1; i<end; i+=2) //i初始为1,避开“开始标记”冒号
{
//每两个需要发送的ASCII码转化为一个十六进制数
pBuf [0] = pSendBuf [i];
pBuf [1] = pSendBuf [i+1];
pBuf [2] = '\0';
sscanf(pBuf,"%x",& nData);
byLrc += nData;
}
byLrc = ~ byLrc;
byLrc ++;
return byLrc;
}
2、CRC校验
CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。下面是它对应的代码:
WORD GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码
{
WORD wCrc = WORD(0xFFFF);
for(int i=0; i<nEnd; i++)
{
wCrc ^= WORD(BYTE(pSendBuf[i]));
for(int j=0; j<8; j++)
{
if(wCrc & 1)
{
wCrc >>= 1;
wCrc ^= 0xA001;
}
else
{
wCrc >>= 1;
}
}
}
return wCrc;
}
对于一条RTU协议的命令可以简单的通过以下的步骤转化为ASCII协议的命令:
1、 把命令的CRC校验去掉,并且计算出LRC校验取代。
2、 把生成的命令串的每一个字节转化成对应的两个字节的ASCII码,比如0x03转化成0x30,0x33(0的ASCII码和3的ASCII码)。
3、 在命令的开头加上起始标记“:”,它的ASCII码为0x3A。
4、 在命令的尾部加上结束标记CR,LF(0xD,0xA),此处的CR,LF表示回车和换行的ASCII码。
掌握两种协议的编程方法,剩下的就是C语言的问题了。
贝隆
2011-01-08
打赏
举报
回复
丢包与否主要还是看硬件是否可靠,比如,电气稳定性,干扰?
昨夜星辰_明日黄花
2011-01-08
打赏
举报
回复
建议LZ看看 modbus 和 电总 协议,这是比较成熟且广泛使用的协议
色郎中
2011-01-08
打赏
举报
回复
上面的基本差不多了
引导码,命令码,长度,数据,校验码 这样基本就可以了
zhyt_213
2011-01-07
打赏
举报
回复
给一个简单实用的协议:
每次数据传输采用如下格式:包头字节 —— 有效数据长度+1 —— 有效数据 —— 校验和字节 —— 包尾字节
上位机下位机每次都检测包头、长度、校验字节和包尾是否正确
azmao
2011-01-07
打赏
举报
回复
建议看看成熟的协议,例如modbus。
knate
2011-01-06
打赏
举报
回复
串口比较容易丢包.
有可能10个字节只接受到9个,这个得考虑进去.
只要有可能就把两次的数据包发送的时间设置有足够长的间隔时间.
把两个数据包隔开,
Peasant_Lee
2011-01-06
打赏
举报
回复
发完数据后,添加多一个校验机制。发多一个字节的校验数据,,接收到的数据经过校验后,与发过来的校验数不相等,舍去该次接收的数据,要求主机重发。。。。一般做法是这样的,
dreamjack
2011-01-06
打赏
举报
回复
[Quote=引用 2 楼 knate 的回复:]
串口比较容易丢包.
有可能10个字节只接受到9个,这个得考虑进去.
只要有可能就把两次的数据包发送的时间设置有足够长的间隔时间.
把两个数据包隔开,
[/Quote]
PC机采用事件触发方式,有时会丢失数据
_三皮_
2011-01-06
打赏
举报
回复
采用CRC校验,校验不通过可以申请对方重发,可以根据通讯距离选择232或者485
zynh1020
2011-01-06
打赏
举报
回复
[Quote=引用 2 楼 knate 的回复:]
串口比较容易丢包.
有可能10个字节只接受到9个,这个得考虑进去.
只要有可能就把两次的数据包发送的时间设置有足够长的间隔时间.
把两个数据包隔开,
[/Quote]
谢谢你
zynh1020
2011-01-06
打赏
举报
回复
[Quote=引用 1 楼 peasant_lee 的回复:]
发完数据后,添加多一个校验机制。发多一个字节的校验数据,,接收到的数据经过校验后,与发过来的校验数不相等,舍去该次接收的数据,要求主机重发。。。。一般做法是这样的,
[/Quote]
谢谢你,
Uart 串口通訊協議接收設計
该博文介绍了一个UART
串口通信
协议
的接收模块设计,针对工业环境中的干扰,通过接收中间6个最
稳定
的采样点来判断数据是1还是0,确保数据的准确性。设计包括状态机、波特率设置、分频计数器、亚稳态消除、边沿检测、数据采样等部分。
【Iot】什么是串口?什么是
串口通信
?
串口通信
(串口通讯)原理,常见的
串口通信
方式有哪些?
本文详细介绍了
串口通信
的基础概念,包括串口的作用、
串口通信
的工作方式、波特率与比特率的区别、帧格式示例以及RS232和RS485两种常用的串口通讯
协议
,强调了
协议
选择对通信
稳定
性和距离的影响。
DSP
串口通信
协议
本文介绍了一种基于DSP2833x设备的
串口通信
协议
实现方法,通过发送和接收固定长度的数据包,确保了数据的完整性和通信的
稳定
性。代码详细展示了初始化过程、数据发送与接收的逻辑。
【FPGA】八、UART
串口通信
本文详细介绍了UART
串口通信
的基本概念、
协议
和波特率,重点解析了UART串口回环实验的设计思路和Verilog代码实现,包括串口接收、发送模块,以及仿真验证过程,展示了如何在FPGA中实现
串口通信
功能。
串口通信
协议
数据接收处理的深度探索与实践
本文深入探讨
串口通信
协议
数据接收处理问题。介绍了
串口通信
基础与
协议
数据格式,分析断包、脏数据、多包及多
协议
并存等问题的成因,并给出解决策略,如缓存重组、数据校验过滤、分包识别重组、
协议
识别分类等,还结合 C 语言代码实现,确保通信
稳定
可靠。
单片机/工控
27,522
社区成员
28,798
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章