共3条
1/1 1 跳转至页
请问一个串口测试的问题,望高手指点!!(在线等待)
问
有两个单片机主机A满负荷的发送数据,从机B一接到数据就立马发给A,A再看收到的数据是否为它发送的数据,统计发送的个数,正确接收的个数,错误的个数和丢失的个数,以此来判断通信链路的质量。要说明的是,在两个单片机之间有两个通讯转换模块,我们的目的是测试该模块的通信质量。都采用串口模式1,8位异步收发。
主机A里开辟一个10byte的发送缓冲区,顺序循环发送。
问题是我收到的数据和上面发送缓冲区的哪个数据比较?
我想方法有两种:
1、开辟一个接收缓冲区,收到的数据依次放在里面,将接收到的数据和发送缓冲区对应序号的数据比较。这个方法可以解决收发不同步的问题,不管发送的数据过多久才收到,我都可以比较出来,缺点是一但中间有一个数据丢失,后面的排序就全部错了,也就会认为接收全部错误。
2、假设主机A发送从0到N号数据后,才收到从机B发回的第0个数据,我就将收到的数据和当前发送指针减N所指向的数据比较。这样就能避免一但有数据丢失后面全错的问题,但问题是这个N的怎么确定,对于一个系统,这个N是个常数吗?
希望各位同仁不吝赐教!
假如在数据传送中不会出现丢失就好弄了,呵呵。 答 1: 回复一般情况下,在两个系统中,收发的数据个数,自己都要有明确的个数确定,这样才便于收发控制 答 2: 我需要的是满负荷的测试,收发个数是无穷的。收发个数应该是无穷的,否则就达不到我要的效果。
问问,PC机的串口测试是怎么样的? 答 3: 我觉得1、单片机的运行速度应该是比串口收发速度快得多。
2、发送的10个数据各不相同并且有固定顺序。
3、接收到的数据应该和发送缓冲中的每一个数据比较。
4、A知道下一个接收数据应该是什么,以此为基础进行比较。
5、做一个计时周期比较长的定时器,记住每个数据的发送接收时间,以防范严重超时的情况。
答 4: 谢谢camelbox!1、单片机的运行速度应该是比串口收发速度快得多。
认同。问题是数据在发出到接收之间经过了两个通信转接模块和一个从机 B ,这个时间不确定。
2、发送的10个数据各不相同并且有固定顺序。
认同。有序才能对应比较。
3、接收到的数据应该和发送缓冲中的每一个数据比较。
不明白,是收到的每个数据要和发送缓冲区的十个数据都比较吗?那样可能会产生错误的判断。我想的是将发送的数据尽量和对应接收的数据比较。
4、A知道下一个接收数据应该是什么,以此为基础进行比较。
错了我可以判断,但丢了后面的次序全部打乱就会全判错。
5、做一个计时周期比较长的定时器,记住每个数据的发送接收时间,以防范严重超时的情况。
认同。考虑到传送会超时,方法2就行不通了。
再考虑到从机也会超时,方法1也行不通,问题就无法预测,很严重了。
答 5: 你的收发操作是不确定的?象IP路由一样?比如:A发送二个字节,A可能先收到第二个字节吗?
如果是简单通讯这样作不现实,且过于复杂。
如果不是,那你的思路个人认为应该正确! 答 6: to:mabaoqiu这个通讯里不会出现A发送二个字节,先收到第二个字节的情况。
发送是顺序的,接收也是顺序的,但是收发时间差不确定,并接收可能出现丢失和错误,这个“接受到的数据和对应发送的数据比较”中的“对应”实现起来比较麻烦,这里面又有一次错误和连续多次错误,再考虑到通信各环节可能的超时,更加无法预测,难以“对应”。
PC机测试下位设备,比如测试硬件仿真器时候是用的什么办法?满负荷的吗?我觉得这里满负荷是不是要求很高?
答 7: 增加一层简单协议加上你自己的帧结构信息,以帧为你判断数据是不是丢失的依据 答 8: to:水星我的目的是测试那两个转接模块。
这里目标不是判断是不是丢失,而是统计错误,丢失多少个数据。
所以我认为加帧结构没有多大的帮助。 答 9: 发送用一个2 or 4 bytes 的loop buffers 做历史记录,接到数据比较如误码就停4个bytes时间, 显示没次成功发送的byte数 答 10: 你不找到是不是丢失你怎么知道你的数据是不是对应地比较了呢?没有定位你的丢失情况你只能接受错位的现实了…… 答 11: 小小愚建!!我觉得要全面测试这个转换模块应该分几步来:
第一步:先测试在不同的波特率延迟时间,过程如下,A发一个字节(启动定时器),B收到后立即转发回A,A收到后停止定时器,判断数据是否正确(错误则误码计算器加一),计算好时间后存起来,如果A在某一设定时间内还没有收到,则丢码计数器加一,这次统计时间丢掉,不保存,然后开始第二次发送……,可以设定一共发N次,这样就可以计算出在此波特率下单工通讯的平均延迟时间和误码率和丢码率,然后再改变的波特率再测。
第二步:用同一数据在不同的波特率作满负荷测试,如连续发送1000个或更多的数据(如0x55,用同一数据就不会出现丢码而造成的错乱顺序),统计收到数据的误码率和丢码率,再改变的波特率再测,可得出双工通讯时误码率和丢码率。得出一个较佳的通讯波特率。
第三步:真实数据满负荷测试,如A连续发送10个相邻码距为5的数据(如0xaa,0xa5,0x55,40xb,0x77,0x0f,0xff,0xf0,0xee,,0xd2),A接收全部数据后可作分析统计,丢码率可以直接算出,如果没有丢码,则发送缓冲区和接收缓冲区顺序一个一个比较就可以得出误码率,如果出现丢码,则从两个缓冲区第一个数据开始比较,如当比较到第i个数据不同,则判断接收到的数据是否和发送缓冲区的第i+1数据相同,(1)如果相同,则可以较肯定说第i个数据丢失了(因为码距为5时,当数据传输受干扰,只有同时4个bits都被取反才可能得到相邻的数据,这种情况发生的几率小得很,所以不可能误码而得出下一个数据),(2)如果不同,则是误码,如此比类推比较完,则可得出误码率和丢码率。
不知道我说的方法可行不!空想的,见笑了。 答 12: 谢谢gordon1977的建议!!谢谢gordon1977的建议!你的方法很全面,我相信也会是很有效的。
我觉得你的第三点就可以基本达到我的目的了,如果测试需要,再考虑一、二点。
非常感谢你的指点!! 答 13: 我认为测试误包率才有实用价值 答 14: to:dengm你是说丢包的情况不应太在意吗?
我这里目的是测试通信线路的质量,丢包和误报都可能发生,而且上面也讨论了,要判断误包还得很好检测出“丢包”做前提。否则会大面积的判错。 答 15: re: no. 丢包是最严重的误包现象。 答 16: to:dengm你认为通信线路上误包才是主要的问题吗?
丢包是最严重的误包,也就是说丢包的事情应该很少发生才对。
一般的通信线路上错包和误包发生的几率是多大?
我的意思是希望你能给我一个感性的认识。
我们做这个的目的是想测试电力载波模块。 答 17: 对于电力载波模块错包和丢包率,我认为应控制在75%以下。注意:数据包越大,错/丢包率越大。
在设计阶段,测试出通信线路在满负荷下平均多少bytes后才误码,
有了这个结果就可以决定系统的:
1。数据包大小的上界
2。数据包的效验位数(建议>=16bits)
主机A里开辟一个10byte的发送缓冲区,顺序循环发送。
问题是我收到的数据和上面发送缓冲区的哪个数据比较?
我想方法有两种:
1、开辟一个接收缓冲区,收到的数据依次放在里面,将接收到的数据和发送缓冲区对应序号的数据比较。这个方法可以解决收发不同步的问题,不管发送的数据过多久才收到,我都可以比较出来,缺点是一但中间有一个数据丢失,后面的排序就全部错了,也就会认为接收全部错误。
2、假设主机A发送从0到N号数据后,才收到从机B发回的第0个数据,我就将收到的数据和当前发送指针减N所指向的数据比较。这样就能避免一但有数据丢失后面全错的问题,但问题是这个N的怎么确定,对于一个系统,这个N是个常数吗?
希望各位同仁不吝赐教!
假如在数据传送中不会出现丢失就好弄了,呵呵。 答 1: 回复一般情况下,在两个系统中,收发的数据个数,自己都要有明确的个数确定,这样才便于收发控制 答 2: 我需要的是满负荷的测试,收发个数是无穷的。收发个数应该是无穷的,否则就达不到我要的效果。
问问,PC机的串口测试是怎么样的? 答 3: 我觉得1、单片机的运行速度应该是比串口收发速度快得多。
2、发送的10个数据各不相同并且有固定顺序。
3、接收到的数据应该和发送缓冲中的每一个数据比较。
4、A知道下一个接收数据应该是什么,以此为基础进行比较。
5、做一个计时周期比较长的定时器,记住每个数据的发送接收时间,以防范严重超时的情况。
答 4: 谢谢camelbox!1、单片机的运行速度应该是比串口收发速度快得多。
认同。问题是数据在发出到接收之间经过了两个通信转接模块和一个从机 B ,这个时间不确定。
2、发送的10个数据各不相同并且有固定顺序。
认同。有序才能对应比较。
3、接收到的数据应该和发送缓冲中的每一个数据比较。
不明白,是收到的每个数据要和发送缓冲区的十个数据都比较吗?那样可能会产生错误的判断。我想的是将发送的数据尽量和对应接收的数据比较。
4、A知道下一个接收数据应该是什么,以此为基础进行比较。
错了我可以判断,但丢了后面的次序全部打乱就会全判错。
5、做一个计时周期比较长的定时器,记住每个数据的发送接收时间,以防范严重超时的情况。
认同。考虑到传送会超时,方法2就行不通了。
再考虑到从机也会超时,方法1也行不通,问题就无法预测,很严重了。
答 5: 你的收发操作是不确定的?象IP路由一样?比如:A发送二个字节,A可能先收到第二个字节吗?
如果是简单通讯这样作不现实,且过于复杂。
如果不是,那你的思路个人认为应该正确! 答 6: to:mabaoqiu这个通讯里不会出现A发送二个字节,先收到第二个字节的情况。
发送是顺序的,接收也是顺序的,但是收发时间差不确定,并接收可能出现丢失和错误,这个“接受到的数据和对应发送的数据比较”中的“对应”实现起来比较麻烦,这里面又有一次错误和连续多次错误,再考虑到通信各环节可能的超时,更加无法预测,难以“对应”。
PC机测试下位设备,比如测试硬件仿真器时候是用的什么办法?满负荷的吗?我觉得这里满负荷是不是要求很高?
答 7: 增加一层简单协议加上你自己的帧结构信息,以帧为你判断数据是不是丢失的依据 答 8: to:水星我的目的是测试那两个转接模块。
这里目标不是判断是不是丢失,而是统计错误,丢失多少个数据。
所以我认为加帧结构没有多大的帮助。 答 9: 发送用一个2 or 4 bytes 的loop buffers 做历史记录,接到数据比较如误码就停4个bytes时间, 显示没次成功发送的byte数 答 10: 你不找到是不是丢失你怎么知道你的数据是不是对应地比较了呢?没有定位你的丢失情况你只能接受错位的现实了…… 答 11: 小小愚建!!我觉得要全面测试这个转换模块应该分几步来:
第一步:先测试在不同的波特率延迟时间,过程如下,A发一个字节(启动定时器),B收到后立即转发回A,A收到后停止定时器,判断数据是否正确(错误则误码计算器加一),计算好时间后存起来,如果A在某一设定时间内还没有收到,则丢码计数器加一,这次统计时间丢掉,不保存,然后开始第二次发送……,可以设定一共发N次,这样就可以计算出在此波特率下单工通讯的平均延迟时间和误码率和丢码率,然后再改变的波特率再测。
第二步:用同一数据在不同的波特率作满负荷测试,如连续发送1000个或更多的数据(如0x55,用同一数据就不会出现丢码而造成的错乱顺序),统计收到数据的误码率和丢码率,再改变的波特率再测,可得出双工通讯时误码率和丢码率。得出一个较佳的通讯波特率。
第三步:真实数据满负荷测试,如A连续发送10个相邻码距为5的数据(如0xaa,0xa5,0x55,40xb,0x77,0x0f,0xff,0xf0,0xee,,0xd2),A接收全部数据后可作分析统计,丢码率可以直接算出,如果没有丢码,则发送缓冲区和接收缓冲区顺序一个一个比较就可以得出误码率,如果出现丢码,则从两个缓冲区第一个数据开始比较,如当比较到第i个数据不同,则判断接收到的数据是否和发送缓冲区的第i+1数据相同,(1)如果相同,则可以较肯定说第i个数据丢失了(因为码距为5时,当数据传输受干扰,只有同时4个bits都被取反才可能得到相邻的数据,这种情况发生的几率小得很,所以不可能误码而得出下一个数据),(2)如果不同,则是误码,如此比类推比较完,则可得出误码率和丢码率。
不知道我说的方法可行不!空想的,见笑了。 答 12: 谢谢gordon1977的建议!!谢谢gordon1977的建议!你的方法很全面,我相信也会是很有效的。
我觉得你的第三点就可以基本达到我的目的了,如果测试需要,再考虑一、二点。
非常感谢你的指点!! 答 13: 我认为测试误包率才有实用价值 答 14: to:dengm你是说丢包的情况不应太在意吗?
我这里目的是测试通信线路的质量,丢包和误报都可能发生,而且上面也讨论了,要判断误包还得很好检测出“丢包”做前提。否则会大面积的判错。 答 15: re: no. 丢包是最严重的误包现象。 答 16: to:dengm你认为通信线路上误包才是主要的问题吗?
丢包是最严重的误包,也就是说丢包的事情应该很少发生才对。
一般的通信线路上错包和误包发生的几率是多大?
我的意思是希望你能给我一个感性的认识。
我们做这个的目的是想测试电力载波模块。 答 17: 对于电力载波模块错包和丢包率,我认为应控制在75%以下。注意:数据包越大,错/丢包率越大。
在设计阶段,测试出通信线路在满负荷下平均多少bytes后才误码,
有了这个结果就可以决定系统的:
1。数据包大小的上界
2。数据包的效验位数(建议>=16bits)
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |