打印

喜欢串口辅助调试的进(8月19日《串口猎人》V31发布在484楼)

[复制链接]
楼主: 程序匠人
手机看帖
扫描二维码
随时随地手机跟帖
501
三、高级收码功能
        1、支持按帧接收数据。
        2、能自动进行帧结束判定(方式非常灵活,可以按帧头、帧尾、帧长或时间)。
...
程序匠人 发表于 2011-8-19 16:07


帧长检测好像有点问题
如:
帧长 ,功能码 ,帧长 ,数据 ,帧尾
0xa5 ,  0xa0,  0x05,  0xaa ,  0xaa,

每当数据为 0xa50xaa 时,出错,帧自动结束。
无法传送 16进制数,只能转换成 BCD 传送。

建议:
能否增加 ASCII码 接收?这样,传送的数据比较可靠,避免和命令码 0xa50xaa 之类的抢跑道。

使用特权

评论回复
502
程序匠人|  楼主 | 2011-9-13 19:59 | 只看该作者
匠人,你黑我啊!安装软件一路狂奔,不小心按了最后的确定,半天的工作都悲剧了。。。。。。。。。
carl_lee 发表于 2011-9-9 14:31

? 神马情况?

使用特权

评论回复
503
程序匠人|  楼主 | 2011-9-13 20:03 | 只看该作者
帧长检测好像有点问题
如:
帧长 ,功能码 ,帧长 ,数据 ,帧尾
0xa5 ,  0xa0,  0x05,  0xaa ,  0xaa,

每当数据为 0xa5 或 0xaa 时,出错,帧自动结束。
无法传送 16进制数,只能转换成 BCD 传送。

建议:
能 ...



Cortex-M0 发表于 2011-9-9 20:54



在“高级收码”标签页右侧的“帧结束判定”框中,把“帧头”“帧尾”的选项去掉,即不会根据 0xa50xaa 判断结束了。


可以按照 ASCII码 接收的呀

使用特权

评论回复
504
Cortex-M0| | 2011-9-13 20:33 | 只看该作者
1.  假如把“帧头”“帧尾”的选项去掉,不知能否设别地址码,能否识别多个“高级收码”通道?

2.  “按照 ASCII码 接收”:我指的是,除了“帧头”“帧尾”等命令字节,其他均按 ASCII码 接收,并且能在“高级收码”中解码显示。

使用特权

评论回复
505
程序匠人|  楼主 | 2011-9-14 00:55 | 只看该作者
1.  假如把“帧头”“帧尾”的选项去掉,不知能否设别地址码,能否识别多个“高级收码”通道?

2.  “按照 ASCII码 接收”:我指的是,除了“帧头”“帧尾”等命令字节,其他均按 ASCII码 接收,并且能在“高级收码 ...
Cortex-M0 发表于 2011-9-13 20:33


“帧头”“帧尾”的选项只是判断一帧是否结束的两种规则而已,不是必须的,因为还有其它的规则可用,比如可以按照固定长度来识别,或者每一帧的首字节代表帧长,或者根据两帧之间的间隔时间来分割。

“能否识别多个“高级收码”通道?”——不明白需求。。

使用特权

评论回复
506
hotpower| | 2011-9-14 06:26 | 只看该作者
ASCII码和UUCODE是可以很方便地同步,其他就有很多具体问题了。

使用特权

评论回复
507
程序匠人|  楼主 | 2011-9-14 08:40 | 只看该作者
2.  “按照 ASCII码 接收”:我指的是,除了“帧头”“帧尾”等命令字节,其他均按 ASCII码 接收,并且能在“高级收码”中解码显示。Cortex-M0 发表于 2011-9-13 20:33



你的意思是指:每个字节只传递一个“0~9”的字符的ASCII码?
这样的传输效率是不是差了点?

如果用ASCII码,一个字节可以表示“0~9”
如果用BCD码,一个字节可以表示“0~99”
如果用HEX码,一个字节可以表示“0~255”

所以,我的高级收码中没有做ASCII码的解码。(我觉得在单片机中预先把ASCII转换成HEX码或BCD码很方便呀)
如果只是为了“避免和命令码 0xa50xaa 之类的抢跑道。”,建议用BCD码传输,效率比ASCII高。

征询一下,大家都很喜欢ASCII码这种传递方式吗?

使用特权

评论回复
508
程序匠人|  楼主 | 2011-9-14 08:51 | 只看该作者
运行错误
btiger2000 发表于 2011-8-29 14:01


你有没有正常安装?

使用特权

评论回复
509
Cortex-M0| | 2011-9-14 09:09 | 只看该作者
“帧头”“帧尾”的选项只是判断一帧是否结束的两种规则而已,不是必须的,因为还有其它的规则可用,比如可以按照固定长度来识别,或者每一帧的首字节代表帧长,或者根据两帧之间的间隔时间来分割。

“能否识别多个“高级收码”通道?”——不明白需求。。 ...
程序匠人 发表于 2011-9-14 00:55



关键点:
在《串口猎人》程序中,对 0xa50xaa 的判断优先级高于对 数据长度 判断的优先级。这样,在接收数据过程中,凡是碰到数据 0xa50xaa  就提前结束接收数据,使得当前数据接收不完整。

俺的意思是,将对 0xa50xaa 的判断优先级 改为低于 对 数据长度 判断的优先级。这样,只有在接收完当前全部数据后,才作“帧头”“帧尾”识别,这样,能保证HEX数据的接收完整。也就不存在这个“能否识别多个“高级收码”通道?”问题了~~~

使用特权

评论回复
510
程序匠人|  楼主 | 2011-9-14 09:18 | 只看该作者
关键点:
在《串口猎人》程序中,对 0xa50xaa 的判断优先级高于对 数据长度 判断的优先级。这样,在接收数据过程中,凡是碰到数据 0xa50xaa  就提前结束接收数据,使得当前数据接收不完整。

俺的意思是,将对 0xa50xaa 的判断优先级 改为低于 对 数据长度 判断的优先级。这样,只有在接收完当前全部数据后,才作“帧头”“帧尾”识别,这样,能保证HEX数据的接收完整。也就不存在这个“能否识别多个“高级收码”通道?”问题了~~~Cortex-M0 发表于 2011-9-14 09:09


《串口猎人》中判断帧结束的规则是这样的:
1、帧头
2、帧尾
3、固定帧长
4、可变帧长
5、超时
以上5条规则的关系是“或”的关系,即:只要满足任意一个规则,就认为一帧的结束。所以一般不建议同时采用所有的规则。(我个人比较喜欢用规则4,即由发送方负责传递帧长)

需要指出的是,这里给出规则的目的,只是为了帮助判断帧结束,而不进行帧的校验,《串口猎人》并不关心下位机发过来的帧内容是否正确。

建议:

1、要么去掉帧头帧尾规则。
2、要么把固定帧长设置到最大99,让其失效。
这样可以避免两种规则竞争。

另外,如果用了帧头帧尾规则,那么帧内数据内容最好采用BCD码,这样可以避开A5、AA之类。

使用特权

评论回复
511
程序匠人|  楼主 | 2011-9-14 09:30 | 只看该作者
前一个20楼?
我就502楼?WHY?
renjf 发表于 2011-9-9 15:12


因为你只看到第一页,而没有留意到后面还有N多页。:)

使用特权

评论回复
512
Cortex-M0| | 2011-9-14 09:49 | 只看该作者
《串口猎人》中判断帧结束的规则是这样的:
1、帧头
2、帧尾
3、固定帧长
4、可变帧长
5、超时
以上5条规则的关系是“或”的关系,即:只要满足任意一个规则,就认为一帧的结束。所以一般不建议同时采用所有的规则 ...
程序匠人 发表于 2011-9-14 09:18


谢谢匠人答复。

俺现在只能用BCD码,以避开A5、AA之类数据。

为了编写 HEX-->BCD码 转换程序,还特意改写了 《中颖MCU专用8-32位混合运算》定点运算程序库  ,欢迎各位盆友帮助测试,谢谢~~~


中颖定点运算补充库.rar (41.83 KB)

使用特权

评论回复
513
dengm| | 2011-9-14 09:51 | 只看该作者
bin 通信要用: 转义规则
     ESC CODE                     --- 0FFH
        ESC XOR                       --- 080H
        Frame B CODE (帧头)   ----055H
     Frame E code   (帧尾)    ----0AAH
;-----------------------------------------
在数据中如等于:   
       <ESC CODE> ------>    <Esc_Code XOR Esc_Xor> + <Esc_Code>
       <Frame B CODE> ------>    <Frame_B_CODE XOR Esc_Xor> + <Esc_Code>
       <Frame E CODE> ------>    <Frame_E_CODE XOR Esc_Xor> + <Esc_Code>

使用特权

评论回复
514
dengm| | 2011-9-14 09:54 | 只看该作者
后转义, MCU只要一个bit的ram,   F_Esc

使用特权

评论回复
515
xuepiaojiangu| | 2011-9-18 07:29 | 只看该作者
匠人先生,我最近下载使用了你编写的串口猎人V31。我是用usb模拟串口的。在没有插usb转串口线时串口猎人可以识别出我的usb转串口,能发现com3。可是我把usb转串口线连接到我焊制的电路板后,串口猎人立即提示错误,错误代码8020,Run-time error '8020':Error reading comm device。然后一点确定软件立即自动关闭。但是我换用别的串口调试工具就能收到数据(我焊制的板子一直在给上位机发送数据)。我是个新手,呵呵,或许是**作有误,还望您能解答我的疑问。

使用特权

评论回复
516
wanenlai| | 2011-9-19 17:52 | 只看该作者
匠人可否把源代码共亨下源代码,给我们这些菜鸟参照学习下

使用特权

评论回复
517
程序匠人|  楼主 | 2011-9-19 19:58 | 只看该作者
匠人先生,我最近下载使用了你编写的串口猎人V31。我是用usb模拟串口的。在没有插usb转串口线时串口猎人可以识别出我的usb转串口,能发现com3。可是我把usb转串口线连接到我焊制的电路板后,串口猎人立即提示错误, ...
xuepiaojiangu 发表于 2011-9-18 07:29


嗯,这个问题我自己没有遇到过。也没有听别的网友反映过。让我找一下原因。。。。

使用特权

评论回复
518
xuepiaojiangu| | 2011-9-22 14:24 | 只看该作者
521# 程序匠人 匠人先生,我把win7系统换成了xp上面说的问题就没有了。

使用特权

评论回复
519
afei9527| | 2011-9-22 14:53 | 只看该作者
很就没更新了,马上下载试用!顶! :)

使用特权

评论回复
520
21ele| | 2011-9-25 10:12 | 只看该作者
用了一下,感觉这个应该是目前最好用的一款基于帧的串口调试软件,但是也还有需要改进的地方,因为帧的定义和识别机制不同,所以调试时的需求也不同。

   先说帧定义的几种常用形式:
   1.帧长度识别机制。
     一般发送帧长度和接收帧长度是不同的,一般用在比较简单的通讯场合,比如温度,湿度传感器,感应卡读卡器等,发送帧一般是用来触发的,有用的数据在接收帧中,如果发送帧长度为零,就只有接收帧了,比如有的id卡读读头。虽然定长帧的是按长度识别帧的,但是因为帧通常不是连续发送的,帧间有较长的时间间隔,其实这个也可以算到时间间隔识别帧的类型里,而且用时间识别帧更好,如果单纯按长度识别帧,有异常时会出现帧内容错位,只有引入间隔时间的判断,才可以识别错位,恢复错位。

   2.字符间隔时间识别机制。
     这是最常用的一种帧识别机制,靠连续发送数据流时,判断连续两个字符之间的间隔时间大于设定时间,来判断为帧的起始和结束。 这种机制的原理是通常mcu或pc等硬件串口发送数据事,字符和字符间隔通常很小,或是完全是连续的。modbus rtu格式就是一典型的这种帧识别机制,rtu中规定,如果发送一个字符时间为t的话,连续两个字符间隔时间>3.5t则认为一个帧结束了。
    这种模式对于时间是极度敏感的,对于一般的电缆连接的rs232或rs485或电流环,这个没有问题,间隔时间是可以保证的。但是随着各种各样串口透传设备的出现,比如以usb转串、太网转串透传、无线串口透传、gprs串口透传(dtu)等,问题出现了。这些透传设备,可以保证数据传输的正确性,但是大部分透传都丢失了原串口上数据传输的时间特性,就是字符间间隔时间,并且由于透传大部分是先接收,然后打包发送,从而引入了新的字符间隔时间,这个在原串口数据流中是没有的。
    如果引入的字符间隔时间大到一定程度,就会识别为错误的帧,导致通讯错误。
    这里的一个关键就是透传设备打包再转发的时间,如果这个速度够快,就会基本无影响,比如usb转串。

   3.转义字符识帧识别机制。
     最典型的就是SLIP协议(Serial Line Internet Protocol,串行线路网际协议),可能很多人并不熟悉,但是它确实很有参考性,原理就是定义0xC0为帧头帧尾识别标志,数据中如果出现了0xC0,就发送两个字节的数据0xDB,0xDC代替,数据中如果出现了0xDB,就发两个字节的数据0xDB,0xDD代替。这是一种牺牲时间换取性能的做法,就是以发送,0xC0和0xDB需要发送两个字符为代价,换取了一个独立于数据00-FF之外的一个帧识别标志0xC0。这样,当数据大量发送是,损失的性能不大大,因为数据中0xC0和0xDB出现的概率通常并不多,但却实现了有效的帧识别。
     作为转义字符的一个特例,一个极端,就是ascii码格式的数据通讯,相当于所有的数据都要转义,每一个字节数据都要分成两个ascii码传送,效率变为原来的一半,但是换来的优势是,有大量的ascmii码可以用来做帧头、帧尾甚至其他特殊功能定义。
     常见的有modbus ascii 格式和AT指令格式。
     在所有的转义字符识别帧的机制了,帧识别完全不再依赖时间,所以可以有效的适用在各种串口透传设备下。但是,有时候,仍然会检测字符间隔时间,但这个只是用来检测物理链路是否被断开,而不是被用来识别帧的。

使用特权

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

本版积分规则