一、硬件层次上的同步与异步
1.异步通信
在异步通信中,CPU与外设之间有两项约定:
(1)字符格式---字符的编码形式及规定,每个串行字符由以下四个部分组成:
⑴ 1个起始位,低电平;
⑵ 5--8个数据位;
⑶ 1个奇偶校验位;
⑷ 1--2个终止位(停止位)高电平;
(2)波特率
波特率是指单位时间内传送二进制数据的位数,以位/秒位单位,它是衡量串行数据传送速度快慢的重要标志和参数。
例如:假如数据出送速率是120位/秒,则传送的波特率为:120波特。
注意:异步通信的传送速度一般在50波特-----19200波特之间。
2.同步通信
在异步通信中,每个字符要用起始位和终止位作为字符开始和结束的标志,占用了一些时间,为了提高数据块的传送速度,就要设法去掉这些标志,就采用同步通信。
同步通信的速度可达500千波特。但是它的硬件电路比较复杂。
3.优缺点比较
1)异步通信简单,双方时钟可允许一定误差。同步通信较复杂,双方时钟的允许误差较小。
2)通信效率:异步通信低,同步通信高。
3)同步通信取消了每个字节的同步位,从而使数据位在传送为中所占比率增大,提高了传送效率。
4)同步通信容许用户传送没有意义的二进制数据,即在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。
二、软件层次的同步与异步
1.同步通信:
一般使用单线程,读操作和写操作都在同一个线程里面,读操作时不会写,写操作时不会读,此时硬件处于半双工模式。
2.异步通信
一般使用多线程,读操作和写操作在不同的线程里面,读操作和写操作同时进行,当读或写完成时使用事件通知,此时硬件处于全双工模式。
用异步方式操作串口必须要定义 OVERLAPPED 结构,其中的 hEvent 必须自己建立,要定义两个 OVERLAPPED 结构,一个用于读一个用于写,当然也必须建立两个 Event,把它们放入 OVERLAPPED.hEvent。
一般我们是在主线程中写数据,因为写是我们可以控制的,而读的时候我们不知道数据什么时候会到,所以要建立一个线程专门用来读数据,在这个线程中,我们循环地用 ReadFile 读串口,同时用 WaitCommEvent 检测线路状态。
例如:Socket的同步模式和异步模式
如果应用程序在执行期间只需要一个线程,请使用下面的方法,这些方法适用于同步操作模式。
-
如果当前使用的是面向连接的协议(如 TCP),则服务器可以使用 Listen 方法侦听连接。Accept 方法处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的 Socket。可以使用此返回的 Socket 来调用 Send 或 Receive 方法。如果要指定本地 IP 地址和端口号,请在调用 Listen 方法之前先调用 Bind 方法。如果您希望基础服务提供程序为您分配可用端口,请使用端口号 0。如果希望连接到侦听主机,请调用 Connect 方法。若要进行数据通信,请调用 Send 或 Receive 方法。
-
如果当前使用的是无连接协议(如 UDP),则根本不需要侦听连接。调用 ReceiveFrom 方法可接受任何传入的数据报。使用 SendTo 方法可将数据报发送到远程主机。
若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。
-
如果当前使用的是面向连接的协议(如 TCP),则可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。可以使用 BeginAccept 和 EndAccept 处理传入的连接请求。
-
如果您使用的是 UDP 等无连接协议,则可以使用 BeginSendTo 和 EndSendTo 来发送数据报,而使用 BeginReceiveFrom 和 EndReceiveFrom 来接收数据报。
三、软件层次的阻塞和非阻塞模式
1.阻塞模式:
阻塞模式执行I/O操作完成前会一直进行等待,不会将控制权交给程序,一般可以设置一个超时结构,超时时间到则返回超时,可以通过多线程技术进行处理。
2.非阻塞模式
非阻塞模式执行I/O操作后会立即返回,而不管读写有没有成功,一般在进行I/O操作前可以通过一些异步模型(如socket通信里面的select模型)来查询通信口的当前状态是否可读或可写。