DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1154|回复: 0
打印 上一主题 下一主题

[待整理] 基于未知上位机串行通信波特率检测

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 12:46:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
随着计算机应用的日益普及,与计算机进行信息交互的终端也越来越多,其中串行通信是终端与计算机之间的主要通信方式。通常情况下,接收方必须知道发送方的发送速率,帧结构,并采用相同的速率及帧结构进行接收,才能保证接收到正确的信息。帧结构信息包括起始位、停止位、数据位的个数,及是否有校验位,若有,是以何种形式校验,这样才能在接收到正确信息的基础上进行校验,并把起始位、停止位、校验位剔除掉,将有用信息识别出来。在不知道发送速率的情况下,下位机无法采用传统的方法进行通信信号的正确接收和数据提取。很多情况下,终端设备通信时都没有使用校验位。本文提供了一种没有校验位的情况下波特率的检测算法。此方法适用于黑匣子终端波特率的检测,尤其间断串口通讯的情况(如果是连续发送,只对最后一个字节使用两个波特率接收)。

1 串口通信

串口通信是以帧为单位。帧由4部分组成:起始位,停止位,数据位及校验位。其校验位可有可无,通常终端设置为无。如回车符的发送,回车符的ASC II值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是先传低位再传高位。此时回车符的二进制表示方式如图1所示。


利用单片机的串口或串口调试工具接收数据时,如果帧格式不正确,通常只会将此帧数据丢弃,不报告出错,并且不允许单片机做其他的工作,同样,不能同时用不同的波特率接收数据。若在电平跳变时采样,则采样其前一时刻的电平,当停止位是0时,等待一个其1/2波特率是电平应持续的时间后再判断起始位。本方案基于此方法利用软件实现普通管脚的串口使用。

串行通信是终端和主机之间的主要通信方式,通信波特率一般选择110 b/s,300×2n(n=0,…,7)b/s,利用串口协议及接收数据的特点,采用高速接收的方法进行波特率的自动识别与检测。

2 基于波特率串口通讯分析

串行通信中一个二进制位的传输时间T取决于通信的波特率,如9 600 b/s时一个二进制位的传输时间是19 200 b/s时一个二进制位传输时间的两倍,即2×T19200=T9600。在串行通信中,若主机设定接收波特率为9 600 b/s,终端只能以9 600 b/s发送数据,只有这样才能保证主机正确地接收数据。表1中列举不同发送、接收波特率情况下接收的数据。


以n b/s发送序列m:Ox1x2x3x4x5x6x7x81,则2n b/s接收到的序列mm:00 x1x1x2x2x3x3x4x4x5x5x6x6x7x7x8x811。若n b/s接到的数是oxf0~oxf8的字节, 即序列m是0x1x2x3x411111, 则mm是00x1x1x2x2x3x3x4x1111111111。

以n/2 b/s发送序列m:0x1x2x3x4x5x6x7x81,n b/s接到的序列mm:00 x1x1x2x2x3x3x4x4x5x5x6x6x7x7x8x811,2π b/s接到韵第一个字符序列:x2x1x1x1x1000,欲使帧结构正确,x2须是1。同样欲使x4x4 x3x3x2x2 x1x1 0不小于oxf0且帧结构正确,x4,x3,x2必须是1时收到的数才不大于oxf8。假设x5,x6,x7,x8有一个是0,则还能接收数据,例如x6是0,则还能收到一个字节,此字节是11x8x8x7x7x6x60,在保证接收到的数据不小于oxf0的情况下,必须使x8x7是1,此数据大于oxf8。若x5是1,x6是0,收到的第二个字节是1111x8x8 x7x70,若使其不小于oxf0,则x8须是1,测试仍大于oxf8。若x5,x6是1,x7是0,此时收到的字符是11111x8x80,不大于oxf8。若x5,x6,x7是1,x8是0,收到的字符是11111110,是oxfe。

以同样的分析方法,可以得出n/3 b/s,n/4 b/s,3n b/s发送序列情况下,所接收的序列及数据。

3 算法设计

由上面分析可设计出检测算法:首先,从高的波特率逐个尝试,判断波特率是不是发送的波特率,若不是尝试其二分之一的波特率,重复上面的过程。其次57 600 b/s与38 400 b/s不是相差一倍,需要单独测试。最后,115 200 b/s与57 600 b/s单独测试,若均被排除,从38 400 b/s开始新一轮的测试。若57 600 b/s不能被排除,多次则比较是57 600 b/s与38 400 b/s,以确定其中一个。若能排除57 600 b/s,从38 400 b/s开始测试。若均被排除,从19 200 b/s开始测试。检测算法示意图如图2所示。

若接收波特率是发送波特率的16倍或16倍以上,因起始位是0,将会接到10个以上的连续0,帧格式不正确,只需接收一个字符就可否定当前波特率。若接收波特率是发送波特率的8倍,若想使其发送的波特率的4倍与8倍波特接收的字符合法,不能有两个或两个以上的连续的0出现,且最低位为1又要使4倍波特接收的数不小于f0,可能发送的字节只有DB BB 7B B7 776F FB F7 EF DF BF 7F FF这13种。即接收一个字节不能排除当前波特率的概率约为5%。接收波特率分别是发送波特率的2倍与4倍时,若使2倍波特接收的字节不小于f8,则发送的格式须为0x111,故有13种情况,与上轮相同。若接收波特率分别为发送的2倍与相同时,符合条件的字符有F8 F9 FA FB FC FD FE FF8种,接收一个字符不抛弃2倍波特率的概率为1/32。若是38 400 b/s,接收一个字符就可排除57 600 b/s的概率:(ff-eo)/256<0.125。故通常情况下,很快就可锁定波特率。对于相差一倍的情况,只要发送一个小于80的字符就可确定了,即接收一个字符就可确定波特率的概率是50%。若是57 600 b/s,接收到flag_count合法的字符后就可认为是57 600 b/s,理论上flagcount越大越可靠。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-1-12 06:58 , 耗时 0.090142 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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