基于未知上位机串行通信波特率检测
随着计算机应用的日益普及,与计算机进行信息交互的终端也越来越多,其中串行通信是终端与计算机之间的主要通信方式。通常情况下,接收方必须知道发送方的发送速率,帧结构,并采用相同的速率及帧结构进行接收,才能保证接收到正确的信息。帧结构信息包括起始位、停止位、数据位的个数,及是否有校验位,若有,是以何种形式校验,这样才能在接收到正确信息的基础上进行校验,并把起始位、停止位、校验位剔除掉,将有用信息识别出来。在不知道发送速率的情况下,下位机无法采用传统的方法进行通信信号的正确接收和数据提取。很多情况下,终端设备通信时都没有使用校验位。本文提供了一种没有校验位的情况下波特率的检测算法。此方法适用于黑匣子终端波特率的检测,尤其间断串口通讯的情况(如果是连续发送,只对最后一个字节使用两个波特率接收)。
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)/2560.125。故通常情况下,很快就可锁定波特率。对于相差一倍的情况,只要发送一个小于80的字符就可确定了,即接收一个字符就可确定波特率的概率是50%。若是57 600 b/s,接收到flag_count合法的字符后就可认为是57 600 b/s,理论上flagcount越大越可靠。
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)/2560.125。故通常情况下,很快就可锁定波特率。对于相差一倍的情况,只要发送一个小于80的字符就可确定了,即接收一个字符就可确定波特率的概率是50%。若是57 600 b/s,接收到flag_count合法的字符后就可认为是57 600 b/s,理论上flagcount越大越可靠。
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码