串口通信与握手
串口通信的基本概念
1,什么是串口?
2,什么是RS-232?
3,什么是RS-422?
4,什么是RS-485?
5,什么是握手?
1,什么是串口?
串口是计算机上一种非常通用设备通信的协议〔不要与通用串行总线Universal Serial Bus或者USB混淆〕.大多数计算机包含两个基于RS232的串口.串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS- 232口.同时,串口通信协议也可以用于获取远程采集设备的数据.

串口通信的概念非常简单,串口按位〔bit〕发送和接收字节.尽管比按字节〔byte〕的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远
距离通信.比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米.

典型地,串口用于ASCII码字符的传输.通信使用3根线完成:〔1〕地线,〔2〕发送,〔3〕接收.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据.其他线用于握手,但是不是必须的.串口通信最重要的参数是波特率、数据位、停止位和奇偶校验.对于两个进行通行的端口,这些参数必须匹配:
a,波特率:这是一个衡量通信速度的参数.它表示每秒钟传送的bit的个数.例如300波特表示每秒钟发送300个bit.当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz.这意味着串口通信在数据线上的采样率为4800Hz.通常  线的波特率为 14400,28800和36600.波特率可以远远大于这些值,但是波特率和距离成反比.高波特率常常用于放置的很近的仪器间的通信,典型的例子就是 GPIB设备的通信.
b,数据位:这是衡量通信中实际数据位的参数.当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位.如何设置取决于你想传送的信息.比如,标准的ASCII码是0~127〔7位〕.扩展的ASCII码是0~255〔8位〕.如果数据使用简单的文本〔标准 ASCII码〕,那么
每个数据包使用7位数据.每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位.由于实际数据位取决于通信协议的选取,术语 "包"指任何通信的情况.
c,停止位:用于表示单个包的最后一位.典型的值为1,1.5和2位.由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步.因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会.适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢.
d,奇偶校验位:在串口通信中一种简单的检错方式.有四种检错方式:偶、奇、高和低.当然没有校验位也是可以的.对于偶和奇校验的情况,串口会设置校验位〔数据位后面的一位〕,用一个值确保传输的数据有偶个或者奇个逻辑高位.例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个.如果是奇校验,校验位位1,这样就有3个逻辑高位.高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验.这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步.

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

DB-9针连接头
-------------
\ 1 2 3 4 5 /
\ 6 7 8 9 /
-------
从计算机连出的线的截面.
RS-232针脚的功能:

数据:
TXD〔pin 3〕:串口数据输出
RXD〔pin 2〕:串口数据输入


握手:
RTS〔pin 7〕:发送数据请求
CTS〔pin 8〕:清除发送
字符串截取后面三位DSR〔pin 6〕:数据发送就绪
DCD〔pin 1〕:数据载波检测
DTR〔pin 4〕:数据终端就绪

地线:
GND〔pin 5〕:地线

其他
RI〔pin 9〕:铃声指示

3,什么是RS-422?
RS -422〔EIA RS-422-A Standard〕是Apple的Macintosh计算机的串口连接标准.RS-422使用差分信号,RS-232使用非平衡参考地的信号.差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离.在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点.

4,什么是RS-485?
RS -485〔EIA-485标准〕是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压.有了多个设备的能力,你可以使用一个单个RS-422口建立设备网络.出抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485.RS-485是RS-422的超集,因此所有的RS-422设备可以被 RS-485控制.RS-485可以用超过4000英尺的线进行串行通行.

DB-9 引脚连接

-
------------
\ 1 2 3 4 5 /
\ 6 7 8 9 /
-------

从计算机连出的线的截面.

RS-485和RS-422的引脚的功能
数据:TXD+〔pin 8〕,TXD-〔pin 9〕,RXD+〔pin 4〕,RXD-〔pin 5〕
握手:RTS+〔pin 3〕,RTS-〔pin 7〕,CTS+〔pin 2〕,CTS-〔pin 6〕
地线:GND 〔pin 1〕

5,什么是握手?
RS -232通行方式允许简单连接三线:Tx、Rx和地线.但是对于数据传输,双方必须对数据定时采用使用相同的波特率.尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情
况这种使用受到限制.这时需要串口的握手功能.在这一部分,我们讨论三种最常用的RS-232握手形式:软件握手、硬件握手和 Xmodem.

a,软件握手:我们讨论的第一种握手是软件握手.通常用在实际数据是控制字符的情况,类似于GPIB使用命令字符串的方式.必须的线仍然是三根:Tx, Rx和地线,因为控制字符在传输线上和普通字符没有区别,函数SetXModem允许用户使能或者禁止用户使用两个控制字符XON和OXFF.这些字符在通信中由接收方发送,使发送方暂停.
例如:假设发送方以高波特率发送数据.在传输中,接收方发现由于CPU忙于其他工作,输入buffer已经满了.为了暂时停止传输,接收方发送XOFF,典型的值是十进制19,即十六进制13,直到输入buffer空了.一旦接收方准备好接收,它发送XON,典型的值是十进制17,即十六进制11,继续通信.输入buffer半满时,LabWindows发送XOFF.此外,如果XOFF传输被打断,LabWindows会在buffer达到75%和 90%时发送XOFF.显然,发送方必须遵循此守则以保证传输继续.

b,硬件握手:第二种是使用硬件线握手.和Tx和Rx线一样,RTS/CTS和DTR/DSR一起工作,一个作为输出,另一个作为输入.第一组线是RTS 〔Request to Send〕和CTS〔Clear to Send〕.
当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据.另一组线是DTR〔Data Terminal Ready〕和DSR〔Data Set Ready〕.这些现主要用于Modem通信.使得串口和Modem通信他们的状态.例如:当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和  线的连接已经建立.读取DSR线置高,PC机开始发送数据.一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输.

在LabWindows,函数SetCTSMode使能或者禁止使用硬件握手.如果CTS模式使能,LabWindows使用如下规则:
当PC发送数据:
RS-232库必须检测CTS线高后才能发送数据.

当PC接收数据:
如果端口打开,且输入队列有空接收数据,库函数置高RTS和DTR.
如果输入队列90%满,库函数置低RTS,但使DTR维持高电平.
如果端口队列近乎空了,库函数置高RTS,但使DRT维持高电平.
如果端口关闭,库函数置低RTS和DTR.

c,XModem握手:最后讨论的握手叫做XModem文件传输协议.这个协议在Modem通信中非常通用.尽管它通常使用在Modem通信中,XModem协议能够直接在其他遵循这个协议的设备通信中使用.在LabWindows中,实际的XModem应用对用户隐藏了.只要PC和其他设备使用XModem协议,在文件传输中就使用LabWindows的XModem函数.函数是XModemConfig,XModemSend和XModemReceive.

XModem使用介于如下参数的协议:start_of_data、end_of_data、neg_ack、wait_delay、start_delay、max_tries、packet_size.这些参数需要通信双方认定,标准的XModem有一个标准的定义:然而,可以通过XModemConfig函数修改,以满足具体需要.这些参数的使用方法由接收方发送的字符neg_ack确定.这通知发送方其准备接收数据.它开始尝试发送,有一个超时参数start_delay;当超时的尝试超过max_ties次数,或者收到接收方发送的start_of_data,发送方停止尝试.如果从发送方收到start_of_data,接收方将读取后继信息数据包.包中含有包的数
目、包数目的补码作为错误校验、packet_size字节大小的实际数据包,和进一步错误检查的求和校验值.在读取数据后,接收方会调用wait_delay,然后想发送方发送响应.如果发送方没有收到响应,它会重新发送数据包,直到收到响应或者超过重发次数的最大值max_tries.如果一直没有收到响应,发送方通知用户传输数据失败.
由于数据必须以pack_size个字节按包发送,当最后一个数据包发送时,如果数据不够放满一个数据包,后面会填充ASCII码NULL〔0〕字节.这导致接收的数据比原数据多.在XModem情况下一定不要使用XON/XOFF,因为XModem发送方发出包的数目很可能增加到XON/OFF控制字符的值,从而导致通信故障.
串口通信握手协议--XON/XOFF方法
假设电脑A和电脑B通过RS232串口通信
A 和 B协商使用软件握手协议<dcb.fOutX = TRUE>, 定义XonChar / XoffChar 比如XonChar = 1, XoffChar = 2.
现在, A向B发送字符2, B向A发送字符串"helloworld". A能收到字符串"helloworld"吗? 不行的.
B向A发送字符1后, A将会收到字符串"helloworld".
问题:是A向B发XoffChar? 还是B向A发XoffChar?
举个形像例子,李四有很多书,现在一本本的传递给张三,张三突然要去厕所,想李四暂停一会儿,于是
张三对李四说:"暂停!",李四听到后,就停下来不再把书传给张三.
"张三"就是通信的接收端,"李四"是通信的发送端.
XoffChar的传送方向是 接收端 ——> 发送端
当张三从厕所回来后,对李四说:"我回来了,开始吧".于是,李四把剩余的书一本一本的传递给张三.
同理,XonChar的传送方向也是 接收端 ——> 发送端.
问题:发送端接收到XoffChar之后,还没有发送成功的字符由谁保管?
答:  操作系统.
串口发送信息使用WriteFile<>, 如果是overlap方式,发送端收到XoffChar后,WriteFile<>会返回FAILE,
GetLastError<> ==  ERROR_IO_PENDING.
如果是非overlap方式,程序会在WriteFile<>在停下来, 等待发送成功,当然,还要考虑到Timeout的设置.
接下来继续深入WriteFile的Overlap原理. 
 RS-232-C是美国电子工业协会EIA〔Electronic Industry Association〕制定的一种串行物理接口标准.采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加.传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信.           
       RS-232C规定了自己的电气标准,由于它是在TTL电路之前研制的,所以它的电平不是+5 V和地,而是采用负逻辑,即逻辑"0":+5 V~+15 V;逻辑"1":-5 V~-15 V.[TTL电平:逻辑"0:<0.4V;逻辑"1":+3 V~+5 V ] 因此,RS-232C不能和TTL电平直接相连,使用时必须进行电平转换,否则将使TTL电路烧坏,实际应用时必须注意!一种常用的电平转换电路是使用M
AX232 
一:9针串口〔DB9〕常用信号脚说明       
  1 数据载波检测 DCD 8 数据载波检测 DCD     
  2 接收数据 RXD 3 接收数据 RXD     
  3 发送数据 TXD 2 发送数据 TXD     
  4 数据终端准备 DTR 20 数据终端准备 DTR     
  5 信号地 GND 7 信号地 GND     
  6 数据准备好 DSR  6 数据准备好 DSRk   
  7 请求发送 RTS 4 请求发送 RTS     
  8 清除发送 CTS 5 清除发送 CTS     
  9 振铃指示 DELL 22 振铃指示 DELLW     
二:.RS232C串口通信接线方法〔三线制〕 首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连   
 · 同一个串口的接收脚和发送脚直接用线相连 对9针串口和25针串口,均是2与3直接相连;   
 
 · 两个不同串口〔不论是同一台计算机的两个串口或分别是不同计算机的串口〕 上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚〔或线〕与发送数据针脚〔或线〕相连,彼此交叉,信号地对应相接,就能百战百胜.     
三:串口通讯流控制Z 我们在串行通讯处理中,常常看到RTS/CTSXON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的.那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题.     
1.流控制在串行通讯中的作用 
        这里讲到的"流",当然指的是数据流.数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失.现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出.流控制能解决这个问题,当接收端数据处理不过来时,就发出"不再接收"的信号,发送端就停止发送,直到收到"可以继续发送"的信号再发送数据.因此流控制可以控制数据传输的进
程,防止数据的丢失. PC机中常用的两种流控制是硬件流控制〔包括RTS/CTS、DTR/CTS等〕和软件流控制XON/XOFF〔继续/停止〕,下面分别说明.   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。