打印

关于自适应波特率算法问题。

[复制链接]
4552|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenlung|  楼主 | 2008-11-20 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在有个问题,经过FSK解调后的一组码,是按串口组构的,包括起始位,8位数据位,一个校验位,一个停止位。同时因为不是标准的串口传输,FSK解出来的码,停止位后面仍有一些乱码跟随。
另外,波特率不是标准的9600,19200,之类的,可能是19800,9200。而且传输的码是未知的。不象网上介绍的,还可以发个55,AA之类的给你判断一个码元宽度。
想了好久,不知这种情况怎么做波特率判别算法。

相关帖子

沙发
xhtxzxw| | 2008-11-20 11:33 | 只看该作者

嘿嘿

有没有试试这个软件?Serial Monitor
我用这个把STC的ISP协议基本上整出来了

使用特权

评论回复
板凳
chenlung|  楼主 | 2008-11-20 11:48 | 只看该作者

这位老大,我是想在单片机上自已做算法

不是想用什么分析出波特率。让单片机算出波特率,好为后续数据解码做准备。

使用特权

评论回复
地板
xhtxzxw| | 2008-11-20 12:12 | 只看该作者

嘿嘿

可以借鉴它的思路啊!

1.能比较精确的实现位时间测定
2.不知道所谓"停止位后仍有一些乱码跟随", 应该是"乱码位"吧? 
  这里说的"一些"要能够确定出有多少个码位

1,2整好了,就没问题了.因为11位结构已经知道了.

使用特权

评论回复
5
chenlung|  楼主 | 2008-11-20 13:26 | 只看该作者

所谓乱码位,指不确定的,位宽随机的干扰信号类的。

使用特权

评论回复
6
xxdcq| | 2008-11-20 13:54 | 只看该作者

想要得出原始数据准确的波特率是件很难的事!

不过能够区分出未知波特率而得到已知的数据倒是可以实现
可以看看这种模块
http://www.yofeng.com/LrComCtr.asp

使用特权

评论回复
7
zuoyou| | 2008-11-20 14:10 | 只看该作者

re

测脉宽,找最小公约数

使用特权

评论回复
8
xhtxzxw| | 2008-11-20 15:15 | 只看该作者

嘿嘿

5楼:

考虑起始位,数据位,校验位,停止位相互之间的约束关系。

约束1:起始位停止位的电平高低是死规定;
约束2:校验位和数据位之间有运算关系;

另外,如果数据本身有特定的规定,比如都是ASCII字符,或者都是BCD码,或者有其他的约定,也应该作为一个约束条件。

借助这些约束条件,对全部位序列做测试,就行了。

使用特权

评论回复
9
chenlung|  楼主 | 2008-11-20 16:31 | 只看该作者

re

起始位好判,按信号特点没问题,关键就是停止位不好判断.因为真正的停止位发出后,不是正常情况下的电平拉高,而是后面会跟很多无序的高低电平.
所谓的最大公约数法,指能正确判断一帧信号起始和结束才好用.
如果数据本身有特点,那也好做了,关键是信号根本不知道来得是什么.
不知改进硬件能不能把停止位后面那些干扰电平去掉.如果可以,那就好办了.

另:多谢xhtxzxw及其它参与讨论的朋友。

使用特权

评论回复
10
xxdcq| | 2008-11-20 17:07 | 只看该作者

所谓的最大公约数法根本就不严谨!

比如0x00这个数就是连续9个比特的低电平
摆在面前的就是一个很宽的负脉冲,关键是你并不知道这里面有9个比特的数据,也就没办法得到单个比特的时间宽度

使用特权

评论回复
11
xxdcq| | 2008-11-20 17:14 | 只看该作者

比如连续n个0x00数据

每个字节间隔时间也是随意的,这个时间间隔并不一定是单个比特的时间宽度,很有可能是n个比特的时间宽度,甚至小数个比特的时间宽度
你如何从这些数据串找到准确的波特率
它们的最大公约数也好,最小公约数也好都不一定是单个比特的时间宽度
就没有办法确定波特率

使用特权

评论回复
12
chenlung|  楼主 | 2008-11-20 18:00 | 只看该作者

re

因为现在解调出来的数据都不会一样。所以我想,能不能这样:检测一帧中,一个高电平最小的时间和一个低电平电小的时间,多检测几帧数据。然后取这些时间中,最小电平时间做码元宽度(因为我知道,连续的8帧中,肯定有单码元出现)。然后跟据这个宽度,解出下一帧数据,根据数据的校验位看是否正确。

不知这个办法行不行。

使用特权

评论回复
13
xhtxzxw| | 2008-11-20 22:40 | 只看该作者

嘿嘿

LS:
就是这个意思.
1.假定捕捉到1000ms的高低电平组合;
2.测算所有的低电平脉冲宽度(Tl0,Tl1,...,Tln)和所有的高电平脉冲的宽度(Th0,Th1,...,Thm);
3.归一化所有的脉冲宽度Txy(a.宽度相近者都归一化到同样的宽度, b.不同宽度有整倍数关系);
4.找出出现概率在合理范围内且宽度最小的低电平脉冲,它应该是起始位或0;
5.假定某个低电平脉冲在开始位置包括一个起始位,
  如果这个假定成立,那么:
  a.在这个起始位之后,包括了8个数据位和一个校验位一共9个位宽度,紧接着必须是高点平的停止位! 
  b.数据位之后的那个校验位必须满足校验算法的要求!
  (c.如果数据有特定的格式要求,比如一定是ASCII码,一定是BCD码,....)
  如果a. b. (或c.)任意之一不成立,那么假定不成立.
6.对每一个低点平脉冲按5.检测,并综合之.

使用特权

评论回复
14
xxdcq| | 2008-11-21 13:01 | 只看该作者

关键是来的数据流具有很大的不确定性!

使用特权

评论回复
15
xxdcq| | 2008-11-21 13:02 | 只看该作者

如果来的是连续的0x00数据又如何确定最小码元时间?

使用特权

评论回复
16
chenlung|  楼主 | 2008-11-21 13:26 | 只看该作者

如果全00最好办

首先,停止位肯定是低电平。然后全00就全低电平。然后奇偶校验确定,停止位是高电平。很容易捕获电平时间。

使用特权

评论回复
17
xhtxzxw| | 2008-11-22 00:28 | 只看该作者

嘿嘿

15楼:
汉语不过关

使用特权

评论回复
18
1011614272| | 2015-7-22 17:02 | 只看该作者
这位大哥你好,我现在也在做这一块,所以想请教你一下,请问你这个问题解决了吗?
我觉得在停止位后面会跟一串高电平,他可能是正常位宽的整数倍,也可能是小数倍,这样我根本就没办法判断出最小的位宽啊,又怎么去知道波特率呢?

使用特权

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

本版积分规则

5

主题

130

帖子

2

粉丝