您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子百科>通信技术>

如何提高串口通信速度

2018年02月01日 16:12 网络整理 作者: 用户评论(0

  串口通信简介

  串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

  串口通信结构

  串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

  串口是计算机上一种非常通用的设备通信协议。大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

  RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

  如何提高串口通信速度

  串口通信原理

  串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配:

  1、波特率

  这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

  2、数据位

  这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

  3、停止位

  用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

  4、奇偶校验位

  在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

  串口通信的传输速率与传输距离

  1、波特率

  在串行通信中,用 “ 波特率 ” 来描述数据的传输速率。所谓波特率,即每秒钟传送的二进制位数,其单位为 bps ( bits per second )。它是衡量串行数据速度快慢的重要指标。有时也用 “ 位周期 ” 来表示传输速率,位周期是波特率的倒数。国际上规定了一个标准波特率系列: 110 、 300 、 600 、 1200 、 1800 、 2400 、4800 、 9600 、 14.4Kbps 、 19.2Kbps 、 28.8Kbps 、 33.6Kbps 、 56Kbps 。 例如: 9600bps ,指每秒传送 9600 位,包含字符的数位和其它必须的数位,如奇偶校验位等。 大多数串行接口电路的接收波特率和发送波特率可以分别设置,但接收方的接收波特率必须与发送方的发送波特率相同。通信线上所传输的字符数据(代码)是逐为位传送的, 1 个字符由若干位组成,因此每秒钟所传输的字符数(字符速率)和波特率是两种概念。在串行通信中,所说的传输速率是指波特率,而不是指字符速率,它们两者的关系是:假如在异步串行通信中,传送一个字符,包括 12 位(其中有一个起始位, 8 个数据位, 2 个停止位),其传输速率是 1200b/s ,每秒所能传送的字符数是 1200/(1+8+1+2)=100 个。

  2、发送/接收时钟

  在串行传输过程中,二进制数据序列是以数字信号波形的形式出现的,如何对这些数字波形定时发送出去或接收进来,以及如何对发/收双方之间的数据传输进行同步控制的问题就引出了发送/接收时钟的应用。

  在发送数据时,发送器在发送时钟(下降沿)作用下将发送移位寄存器的数据按串行移位输出;在接收数据时,接收器在接收时钟(上升盐)作用下对来自通信线上串行数据,按位串行移入移位寄存器。可见,发送/接收时钟是对数字波形的每一位进行移位操作,因此,从这个意义上来讲,发送/接收时钟又可叫做移位始终脉冲。另外,从数据传输过程中,收方进行同步检测的角度来看,接收时钟成为收方保证正确接收数据的重要工具。为此,接收器采用比波特率更高频率的时钟来提高定位采样的分辨能力和抗干扰能力。

  3、波特率因子

  在波特率指定后,输入移位寄存器 / 输出移位寄存器在接收时钟 / 发送时钟控制下,按指定的波特率速度进行移位。一般几个时钟脉冲移位一次。要求:接收时钟/ 发送时钟是波特率的 16 、 32 或 64 倍。波特率因子就是发送/接收 1 个数据( 1 个数据位)所需要的时钟脉冲个数,其单位是个/位。如波特率因子为 16 ,则16 个时钟脉冲移位 1 次。 例:波特率 =9600bps ,波特率因子 =32 ,则接收时钟和发送时钟频率 =9600 × 32=297200Hz 。

  4、传输距离

  串行通信中,数据位信号流在信号线上传输时,要引起畸变,畸变的大小与以下因素有关:

  波特率 -- 信号线的特征(频带范围)

  传输距离 -- 信号的性质及大小(电平高低、电流大小) 当畸变较大时,接收方出现误码。

  在规定的误码率下,当波特率、信号线、信号的性质及大小一定时,串行通信的传输距离就一定。为了加大传输距离,必须加MODEM。

  如何提高串口通信速度(举例说明)

  硬件工程师开发了一块单片机板,只要按通信协议上位机发数据给下位机,下位机立即回数据,我用串口调试助手试过了,1分钟约可以收发最大6000,可是我用VB的MSCOMM编程,计时,1分钟约2400次,如何提高速度?要求是3600次以内。除出代码,计算机高速运行?

  你试的数据有多大啊?就一次一个字符那肯定快了。

  计算机高速运行,仅仅是消息处理的速度快了。

  速度也是受波特率限制的,你把波特率提高一点不就相对快很多了吗?

  发5个字节,收4个字节,串口调试助手1分钟最大约6000次,VB的MSCOMM编程2400次,

  是否API会快些?

  字节到缓冲区,出去串口?直接用底层的API快些?

  大哥,不要玩我呀?只是个EXE,哪有源程序?而且好像很慢????

  字节到缓冲区,到串口,不通过控件,直接从API走?

  那么波特率9600的话 就是能发6万个字符 跑去乱七八糟的时间 如果单片机程序写得再烂,发3600个字符没啥问题。

  所以你的问题应该出现在串口助手编写的有点对付不了这种高速发数的情况

  1、更改到更高的波特率

  2、 如果用VB的MSCOMM,可以:

  1)不要用查询方式,而应事件方式,使用OnComm事件,并且不要在里面使用界面处理代码,如不要用类似这样的代码:Text1.Text = Text1.Text & Recv_Char

  2)因为每次都收4个字节,所以可以设置Rthreshold=4,至少收到4个字符才触发一次OnComm事件,节省三次事件调用时间。

  3)收到数据后,立即发送,利用对方发送时间内做数据处理。

  1、应该不是波特率的问题。要改波特率,必须和底层一起改。现在的情况是,串口助手可以满足你的速率要求,而自己写的程序比较慢。

  2、不要用 Timer 这类方式去查询串口的接收状态。用 OnComm 事件或循环查询都可以。注意一下你接收到数据后再发命令是如何衔接的。

  3、对于串口这种低速接口,如果没有特殊的连续设置改变,我认为控件和 API 的差别不大。

  再次谢谢myjian,SupermanKing。现在是存在这个需求,目的是找最佳的方案去解决问题。因为我不熟驱动,所以采用编写驱动的方案从时效上来说,可行性不强。

  看来得考虑下方案三:RING3方案,把目标进程的ReadFile与WriteFile给HOOK了。。。。。。。

  其实有个简单的方法,找个虚拟串口的源码。运行此虚拟串口程序时建1个虚拟串口(如com10),把那个软件的串口号由com1改为com10,你就可接到数据了,然后此虚拟程序再将数据转发到com1去。

  反之则由com1接收,再转发到com10。就是用虚拟串口程序做个转发,顺便就监听了

  有个简单的想法,HOOK软的不如HOOK硬的简单点:

  直接作个串口一拖二的线,其中一个口反接成对联线,插到另一个串口上就可以监视串口事件了。

  对于3线通讯的串口来说应该是很简单的.

非常好我支持^.^

(1) 25%

不好我反对

(3) 75%

( 发表人:陈翠 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!