精华内容
下载资源
问答
  • 串口通信基本概念(一)——串行与并行通信,同步异步通信 一、串口通信简介 串口通信,顾名思义也就是利用串行接口进行通信。串行接口指串口按位(bit)发送和接收字节。尽管比按字节(byte)传输的并行通信慢,...

    一、串口通信简介

    串口通信,顾名思义也就是利用串行接口进行通信。串行接口指串口按位(bit)发送和接收字节。尽管比按字节(byte)传输的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

    串口通信中比较重要的参数包括波特率、数据位、停止位及校验位,通讯双方需要约定一致的数据格式才能正常收发数据。串行通讯可以进一步分为单工、半双工和全双工三种。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。它们的主要区别在于其各自的电平范围不相同。

    二、串行和并行通信

    刚说到串口通信是通过接口进行串行通讯。那么什么是串行通讯呢?

    1 串行通信:

    串行通信:计算机与I/O设备之间,同一时刻,只能传输一个bit位的信号。传输数据按顺序依次一bit位接一bit位进行传输,通常数据在一根数据线或一对差分线上传输。

    比如,当传输1字节信息时,并行通讯有8根信号线实现同时传输,假如耗时为1T,而串行是在一根信号线上,把数据排成一行、一位一位传输,需要传8次,因此耗时为8T。因此可总结出二者的特性:

    2 并行通信:

    并行通信是和串行通信相对的数据传输的方式。

    并行通信:计算机与I/O设备之间,通过多条传输线,可以同时传输多个bit位的信号。

    • 并行通讯的效率高,但是成本高、对信号线路要求高,一般应用于快速设备之间近距离传输,譬如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。

    • 串行通讯效率较低,但是对信号线路要求低,抗干扰能力强,同时成本也相对较低,一般用于计算机与计算机、计算机与外设之间远距离通讯。

    3 串口通信和串行通信的区别

    串口通信和串行通信的区别在于:串行通信是一种概念,串口通信是一种具体的通信手段。

    串行通信是一种概念,是指一比特一比特的收发数据,相对于并行通信可同时传输多个bit位而言。包括一般的的串口通信、I2C、SPI等等。

    串口通信是外设和计算机间的一种通信手段,是相对于以太网通信等通信手段而言的。

    二者一个是一种概念,一个是一种实际的通信方式。

    三、同步和异步通信

    在设备之间传送数据,不管是同步通信还是异步通信,都是为了保证数据被正确的发送和接收,即发送方和接收方的“同步”。即接收方可以确定什么时候发送方开始或者结束发送数据以及每一个数据单位(例如bit,字符)的开始和结束的位置,这样接收方才能在正确的时间对发送方的数据进行采样,以接收正确的数据,否则接收到的数据就是错误的。

    根据“同步方式”的不同,由此分出两种同步信号得方法:
    (1)同步通信(比特位同步)
    (2)异步通信(字符间同步,字符内比特位异步)

    同步通信会利用一根额外的信号线,其实也就是时钟信号线,它往往是发送设备提供的时钟信号,发送设备和接收设备在发送设备提供的同一时钟频率下完成同步。(实际上,基本所有的并行通信采用同步通信。)

    异步通信没有额外的一根信号线用于同步,接收者和发送者使用各自的时钟信号,接收者根据与发送者按事先约定的规来确定数据发送的开始与结束以及数据单位的持续时间。例如异步串行通信中,一般接收双方会确定一致的停止位,数据位的个数、波特率的大小以及是否采用奇偶校验位。接收方可以根据这些信息推测出准确的数据采样时间以接收正确的数据。如果是同步通信则不需要这些额外的用于同步的数据位(开始位,结束位,奇偶校验位)。

    1 同步通信

    同步通信要求发送和接收双方在进行数据传输时,保持完全的同步,因此,要求发收双方必须使用同频同相的同步时钟信号。只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后在同步时钟的控制下逐位发送/接收。这样,信息传输完全可以确定传输过程中每1位的位置。因此同步通信是一种比特同步通信技术。

    如下图所示:
    在这里插入图片描述

    同步通信是一种连续传送数据的通信方式,一次通信传送一帧数据,每个信息帧用同步字符作为开始,字符间不加标识位。(这里的数据帧比异步通信中的字符帧要大得多,通常含有若干个数据字符)。当检测到有一串数位和同步字符相匹配时,就认为开始一个信息帧,于是,把此后的数位作为实际传输信息来处理。

    同步通信以数据帧为单位,其格式包括:同步字符+数据+校验字符CRC。

    (a)单同步数据帧结构

    同步字符数据字符1数据字符2数据字符3数据字符nCRC1CRC1

    (b)双同步数据帧结构

    同步字符1同步字符2数据字符1数据字符2数据字符nCRC1CRC1

    没有数据发送时,接收方要时刻做好接收数据的准备。在每组信息(通常称为帧)传输的开始,发送方先发送一个或两个特殊字符,该字符称为同步字符。当接收方收到同步字符,并和发送方达到同步后,就可以以固定的节奏一个字符接一个字符地发送一大块数据,而不再需要用起始位和停止位了,这样可以明显地提高数据的传输速率。同步通信更加适合对速度要求高的传输,对时序的要求很高,当然对硬件要求也更高。

    在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。在同步传输过程中,一个字符可以对应5~8位。当然,对同一个传输过程,所有字符对应同样的数位,比如说n位。这样,传输时,收发双方用一个时钟进行协调,按每n位划分为一个时间片,发送端在一个时间片中发送一个字符,接收端则在一个时间片中接收一个字符,这样就可以确定传输中每一位的位置。接收数据时,接收方利用同步字符使内部时钟与发送方保持同步,然后将同步字符后面的数据逐位移入,并转换成并行格式,供CPU读取,直至收到结束符为止。

    2 异步通信

    异步通信是按字符帧传输的,相对于同步通信,异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,接收方并不知道数据什么时候会到达,因此接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,时间间隔可以是任意的,在一字符帧中的所有比特是连续发送的。

    发送端不需要在发送字符之前和接收端进行协调(不需要先进行比特同步)。接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。内部处理器在完成了相应的操作后,通过一个回调的机制,以便通知发送端发送的字符已经得到了回复。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的字符间同步,字符内比特位异步)

    因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。通信双方需要对采用的信息格式(字符的位数、停止位的位数、有无校验位及校验方式等)和数据的传输速率作相同的约定。接收方是在数据的起始位和停止位的帮助下实现字符传送时的同步。这种传输通常是很小的分组,比如一个字符为一组,为这个组配备起始位和结束位。所以这种传输方式的效率是比较低的,毕竟额外加入了很多的辅助位作为负载,常用在低速的传输中。

    在这里插入图片描述
    异步通信以字符为单位,其格式包括:起始位+数据+奇偶校验位+停止位。
    以起止式异步协议为例,如下图所示
    在这里插入图片描述
      起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以"起始位"开始,以"停止位"结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位低电平起始位(逻辑值0),字符本身由5-8位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位。停止位和空闲位都规定为高电平(逻辑值1),这样就保证起始位开始处一定有一个下跳沿。由此就可以标志一个字符传输的起始。而根据起始位和停止位也就很容易的实现了字符的界定和同步。
      如上图中所示,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为起止式协议。
      
    (1)起始位:发送数据时,先发持续一个bit时间的逻辑”0”信号,表示字符传输的开始,接收端可根据起始位使自己的接收时钟与发送方的数据同步。

    (2)数据位:起始位后是数据位,异步传送规定低位在前,高位在后,数据位的位数一般可以是5~8位。

    (3)奇偶校验位:奇偶位紧跟在数据最高位之后,占用一位(也可省去)。加上这一位后,使得逻辑“1”信号的位数得到偶校验或奇校验,以此来校验数据传送的正确性。
      如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。举例来说,假设传输的数据位为01001100,如果是奇校验,则奇校验位为0(要确保总共有奇数个1),如果是偶校验,则偶校验位为1(要确保总共有偶数个1)。
      由此可见,奇偶校验位仅是对数据进行简单的置逻辑高位或逻辑低位,不会对数据进行实质的判断,这样做的好处是接收设备能够知道一个位的状态,有可能判断是否有噪声干扰了通信以及传输的数据是否同步。

    (4)停止位:数据发送完后,再发1位、1.5位、2位的高电平(逻辑”1”信号)代表停止位,表示一帧数据结束,同时为接收下一帧数据做准备。

    (5)空闲位:在没有数据发送时,即下一帧的起始位“0”到来之前,数据线保持默认的“1”状态,即由高电平来填充。

    异步通信字符帧格式总结如下表:

    逻辑信号数据位数
    起始位01位
    数据位0或15~8位
    校验位0或11位或无
    停止位11位,1.5位或2位
    空闲位1任意数量

    :位数的本质含义是信号持续的时间,故可有分数位,如停止位1.5位,1.5是它的长度,即停止位的电平保持1.5个单位时间长度。一个单位时间就是波特率的倒数,例如波特率为9600bps,则一个单位时间长为1/9600s,1.5个停止位,即停止位电平保持1.5/9600s。

    3 同步通信和异步通信比较

    (1)同步通信要求接收端时钟频率和发送端时钟频率一致;异步通信时不要求接收端时钟和发送端时钟同步。

    (2)同步通信数据传输是以字节块(多个字节)传输的;异步通信数据传输是以字符(一个字节)传输的。

    (3)同步通信传输效率高,但复杂、要求高,双方时钟的允许误差较小;异步通信传输效率低,但简单、要求低,双方时钟可允许一定误差。

    (4)同步通信的字节传输是没有间隔的发送端发送连续的比特流;异步通信字节传送的间隔是任意的,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。

    同步通信和异步通信的差异总结如下表:

    同步通信异步通信
    传送单位信息帧(由若干字符组成的数据块)字符(由若干bit组成)
    单位格式同步字符+数据+校验字符CRC起始位+数据位+奇偶校验位+停止位
    传送间隔一个数据块(信息帧)内,字符与字符间无间隔相邻两字符之间隔任意长
    时钟信号时序要求高,使用同频同相的时钟线路时序要求较低,使用各自的时钟信号
    优点效率高简单,要求低
    缺点复杂,要求高效率低(传送一个字符,要增加约20%的附加信息位)
    展开全文
  • java异步通信

    2021-03-01 10:47:38
    因为输入输出都必须同步.这样,对于多客户端客户/服务器模式,不得不使用多线程.即为每个连接的客户都分配一个线程来处理输入输出.由此而带来的问题是可想而知的.程序员不得不为了避免死锁,线程安全等问题,进行大量的...

    在Merlin之前,编写Socket程序是比较繁琐的工作.因为输入输出都必须同步.这样,对于多客户端客户/服务器模式,不得不使用多线程.即为每个连接的客户都分配一个线程来处理输入输出.由此而带来的问题是可想而知的.程序员不得不为了避免死锁,线程安全等问题,进行大量的编码和测试.很多人都在抱怨为什么不在Java中引入异步输入输出机制.比较官方的解释是,任何一种应用程序接口的引入,都必须兼容任何操作平台.因为Java是跨平台的.而当时支持异步输入输出机制的操作平台显然不可能是全部.自Java 2 Platform以后,分离出J2SE,J2ME,J2EE三种不同类型的应用程序接口,以适应不同的应用开发.Java标准的制订者们意识到了这个问题,并且支持异步输入输出机制的操作平台在当今操作平台中处于主流地位.于是,Jdk(J2SE)的第五次发布中引入了异步输入输出机制.

    以前的Socket进程通信程序设计中,一般客户端和服务器端程序设计如下:

    1.服务器端:

    //服务器端监听线程

    while (true) {

    .............

    Socket clientSocket;

    clientSocket = socket.accept(); //取得客户请求Socket,如果没有//客户请求连接,线程在此处阻塞

    //用取得的Socket构造输入输出流

    PrintStream os = new PrintStream(new  BufferedOutputStream(clientSocket.getOutputStream(),

    1024), false);

    BufferedReader is = new BufferedReader(new  InputStreamReader(clientSocket.getInputStream()));

    //创建客户会话线程,进行输入输出控制,为同步机制 new ClientSession();

    .......

    }

    1.客户端:

    ............

    clientSocket = new Socket(HOSTNAME, LISTENPORT);//连接服务器套接字

    //用取得的Socket构造输入输出流

    PrintStream os = new PrintStream(new  BufferedOutputStream(clientSocket.getOutputStream(),  1024), false);

    BufferedReader is = new BufferedReader(new  InputStreamReader(clientSocket.getInputStream()));  //进行输入输出控制 .......

    1.以上代码段只是用同步机制编写Socket进程通信的一个框架,实际上要考虑的问题要复杂的多(有兴趣的读者可以参考我的一篇文章《Internet实时通信系统设计与实现》)。将这样一个框架列出来,只是为了与用异步机制实现的Socket进程通信进行比较。下面将介绍使用异步机制的程序设计。

    用异步输入输出流编写Socket进程通信程序

    在Merlin中加入了用于实现异步输入输出机制的应用程序接口包:

    java.nio(新的输入输出包,定义了很多基本类型缓冲(Buffer)),

    java.nio.channels(通道及选择器等,用于异步输入输出),

    java.nio.charset(字符的编码解码)。通道(Channel)首先在选择器(Selector)中注册自己感兴趣的事件,当相应的事件发生时,选择器便通过选择键(SelectionKey)通知已注册的通道。然后通道将需要处理的信息,通过缓冲(Buffer)打包,编码/解码,完成输入输出控制。

    通道介绍:

    这里主要介绍ServerSocketChannel和SocketChannel.它们都是可选择的(selectable)通道,分别可以工作在同步和异步两种方式下

    (注意,这里的可选择不是指可以选择两种工作方式,而是指可以有选择的注册自己感兴趣的事件)。可以用channel.configureBlocking(Boolean )来设置其工作方式。与以前版本的API相比较,ServerSocketChannel就相当于ServerSocket (ServerSocketChannel封装了ServerSocket),而SocketChannel就相当于Socket(SocketChannel封装了Socket)。当通道工作在同步方式时,编程方法与以前的基本相似,这里主要介绍异步工作方式。

    所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞(None Blocking)。在服务器端,ServerSocketChannel通过静态函数open()返回一个实例serverChl。然后该通道调用serverChl.socket().bind()绑定到服务器某端口,并调用register(Selector sel, SelectionKey.OP_ACCEPT)注册OP_ACCEPT事件到一个选择器中(ServerSocketChannel只可以注册OP_ACCEPT事件)。当有客户请求连接时,选择器就会通知该通道有客户连接请求,就可以进行相应的输入输出控制了;在客户端,clientChl实例注册自己感兴趣的事件后(可以是OP_CONNECT,OP_READ,OP_WRITE的组合),调用clientChl.connect (InetSocketAddress )连接服务器然后进行相应处理。注意,这里的连接是异步的,即会立即返回而继续执行后面的代码。

    选择器和选择键介绍:

    选择器(Selector)的作用是:将通道感兴趣的事件放入队列中,而不是马上提交给应用程序,等已注册的通道自己来请求处理这些事件。换句话说,就是选择器将会随时报告已经准备好了的通道,而且是按照先进先出的顺序。那么,选择器是通过什么来报告的呢?选择键(SelectionKey)。选择键的作用就是表明哪个通道已经做好了准备,准备干什么。你也许马上会想到,那一定是已注册的通道感兴趣的事件。不错,例如对于服务器端serverChl来说,可以调用key.isAcceptable()来通知serverChl有客户端连接请求。相应的函数还有:SelectionKey.isReadable(),SelectionKey.isWritable()。一般的,在一个循环中轮询感兴趣的事件(具体可参照下面的代码)。如果选择器中尚无通道已注册事件发生,调用Selector.select()将阻塞,直到有事件发生为止。另外,可以调用selectNow()或者select(long timeout)。前者立即返回,没有事件时返回0值;后者等待timeout时间后返回。一个选择器最多可以同时被63个通道一起注册使用。

    应用实例:

    下面是用异步输入输出机制实现的客户/服务器实例程序�D�D程序清单1(限于篇幅,只给出了服务器端实现,读者可以参照着实现客户端代码):

    程序类图  程序清单1

    public class NBlockingServer {

    int port = 8000;

    int BUFFERSIZE = 1024;

    Selector selector = null;

    ServerSocketChannel serverChannel = null;

    HashMap clientChannelMap = null;//用来存放每一个客户连接对应的套接字和通道

    public NBlockingServer( int port ) {

    this.clientChannelMap = new HashMap();

    this.port = port;

    }

    public void initialize() throws IOException {

    //初始化,分别实例化一个选择器,一个服务器端可选择通道

    this.selector = Selector.open();

    this.serverChannel = ServerSocketChannel.open();

    this.serverChannel.configureBlocking(false);

    InetAddress localhost = InetAddress.getLocalHost();

    InetSocketAddress isa = new InetSocketAddress(localhost, this.port );

    this.serverChannel.socket().bind(isa);//将该套接字绑定到服务器某一可用端口

    }

    //结束时释放资源

    public void finalize() throws IOException {

    this.serverChannel.close();

    this.selector.close();

    }

    //将读入字节缓冲的信息解码

    public String decode( ByteBuffer byteBuffer ) throws  CharacterCodingException {

    Charset charset = Charset.forName( "ISO-8859-1" );

    CharsetDecoder decoder = charset.newDecoder();

    CharBuffer charBuffer = decoder.decode( byteBuffer );

    String result = charBuffer.toString();  return result;

    }

    //监听端口,当通道准备好时进行相应操作

    public void portListening() throws IOException, InterruptedException {

    //服务器端通道注册OP_ACCEPT事件

    SelectionKey acceptKey =this.serverChannel.register( this.selector,  SelectionKey.OP_ACCEPT );

    //当有已注册的事件发生时,select()返回值将大于0

    while (acceptKey.selector().select() > 0 ) {

    System.out.println("event happened");

    //取得所有已经准备好的所有选择键

    Set readyKeys = this.selector.selectedKeys();

    //使用迭代器对选择键进行轮询

    Iterator i = readyKeys.iterator();

    while (i.hasNext()) {

    SelectionKey key = (SelectionKey)i.next();

    i.remove();//删除当前将要处理的选择键

    if ( key.isAcceptable() ) {//如果是有客户端连接请求

    System.out.println("more client connect in!");

    ServerSocketChannel nextReady =  (ServerSocketChannel)key.channel();

    //获取客户端套接字

    Socket s = nextReady.accept();

    //设置对应的通道为异步方式并注册感兴趣事件

    s.getChannel().configureBlocking( false );

    SelectionKey readWriteKey =  s.getChannel().register( this.selector,  SelectionKey.OP_READ|SelectionKey.OP_WRITE );

    //将注册的事件与该套接字联系起来

    readWriteKey.attach( s );

    //将当前建立连接的客户端套接字及对应的通道存放在哈希表//clientChannelMap中

    this.clientChannelMap.put( s, new  ClientChInstance( s.getChannel() ) );

    }  else if ( key.isReadable() ) {//如果是通道读准备好事件

    System.out.println("Readable");

    //取得选择键对应的通道和套接字

    SelectableChannel nextReady =  (SelectableChannel) key.channel();

    Socket socket = (Socket) key.attachment();

    //处理该事件,处理方法已封装在类ClientChInstance中

    this.readFromChannel( socket.getChannel(),  (ClientChInstance)  this.clientChannelMap.get( socket ) );  }

    else if ( key.isWritable() ) {//如果是通道写准备好事件

    System.out.println("writeable");

    //取得套接字后处理,方法同上

    Socket socket = (Socket) key.attachment();

    SocketChannel channel = (SocketChannel)  socket.getChannel();

    this.writeToChannel( channel,"This is from server!");

    }

    }

    }

    }

    //对通道的写操作

    public void writeToChannel( SocketChannel channel, String message )

    throws IOException {

    ByteBuffer buf = ByteBuffer.wrap( message.getBytes() );

    int nbytes = channel.write( buf );

    }

    //对通道的读操作

    public void readFromChannel( SocketChannel channel, ClientChInstance clientInstance )  throws IOException, InterruptedException {

    ByteBuffer byteBuffer = ByteBuffer.allocate( BUFFERSIZE );

    int nbytes = channel.read( byteBuffer );

    }

    展开全文
  • 同步传输和异步传输的区别及优缺点同步传输以数据块为单位进行数据传输,数据块与数据块之间的时间间隔是固定的,每个数据块带有时序信息,接收方可以用时序信息进行校验。异步传输一般以字符为单位,接收方通过字符...

    同步传输和异步传输的区别及优缺点

    同步传输以数据块为单位进行数据传输,数据块与数据块之间的时间间隔是固定的,每个数据块带有时序信息,接收方可以用时序信息进行校验。

    异步传输一般以字符为单位,接收方通过字符起始和停止码确定接收信息,不需要与发送方按照同一时序工作。

    同步传输是一种以数据块为传输单位的数据传输方式,该方式下数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时间关系。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列,以便对数据块进行差错控制。

    同步传输是以同步的时钟节拍来发送数据信号的,因此在一个串行的数据流中,各信号码元之间的相对位置都是固定的(即同步的)。

    在同步传输的模式下,数据的传送是以一个数据区块为单位,因此同步传输又称为区块传输。

    在传送数据时,需先送出2个同步字符,然后再送出整批的数据。

    同步传输的比特分组要大得多。它不是独立地发送每个字符,每个字符都有自己的开始位和停止位,而是把它们组合起来一起发送。我们将这些组合称为数据帧,或简称为帧。

    数据帧的第一部分包含一组同步字符,它是一个独特的比特组合,类似于前面提到的起始位,用于通知接收方一个帧已经到达,但它同时还能确保接收方的采样速度和比特的到达速度保持一致,使收发双方进入同步。

    帧的最后一部分是一个帧结束标记。与同步字符一样,它也是一个独特的比特串,类似于前面提到的停止位,用于表示在下一帧开始之前没有别的即将到达的数据了。

    同步传输对收发两端对时间的精确度要求高。 “同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。

    同步传输通常要比异步传输快速得多。接收方不必对每个字符进行开始和停止的操作。一旦检测到帧同步字符,它就在接下来的数据到达时接收它们。另外,同步传输的开销也比较少。例如,一个典型的帧可能有500字节(即4000比特)的数据,其中可能只包含100比特的开销。这时,增加的比特位使传输的比特总数增加2.5%,这与异步传输中25 %的增值要小得多。随着数据帧中实际数据比特位的增加,开销比特所占的百分比将相应地减少。但是,数据比特位越长,缓存数据所需要的缓冲区也越大,这就限制了一个帧的大小。另外,帧越大,它占据传输媒体的连续时间也越长。在极端的情况下,这将导致其他用户等得太久。

    综上,介绍了同步传输,同步传输是以同步的时钟节拍来发送数据信号的,因此在一个串行的数据流中,各信号码元之间的相对位置都是固定的(即同步的)。同步传输通常要比异步传输快速得多。

    异步传输将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。一个常见的例子是计算机键盘与主机的通信。按下一个字母键、数字键或特殊字符键,就发送一个8比特位的ASCII代码。键盘可以在任何时刻发送代码,这取决于用户的输入速度,内部的硬件必须能够在任何时刻接收一个键入的字符。

    异步传输是数据传输的一种方式。由于数据一般是一位接一位串行传输的,例如在传送一串字符信息时,每个字符代码由7位二进制位组成。但在一串二进制位中,每个7位又从哪一个二进制位开始算起呢?异步传输时,在传送每个数据字符之前,先发送一个叫做开始位的二进制位。当接收端收到这一信号时,就知道相继送来7位二进制位是一个字符数据。在这以后,接着再给出1位或2位二进制位,称做结束位。接收端收到结束位后,表示一个数据字符传送结束。这样,在异步传输时,每个字符是分别同步的,即字符中的每个二进制位是同步的,但字符与字符之间的间隙长度是不固定的。

    异步传输一般以字符为单位,不论所采用的字符代码长度为多少位,在发送每一字符代码时,前面均加上一个“起”信号,其长度规定为1个码元,极性为“0”,即空号的极性;字符代码后面均加上一个“止”信号,其长度为1或者2个码元,极性皆为“1”,即与信号极性相同,加上起、止信号的作用就是为了能区分串行传输的“字符”,也就是实现了串行传输收、发双方码组或字符的同步。

    使用异步串口传送一个字符的信息时,对数据格式有如下约定:规定有空闲位、起始位、数据位、奇偶校验位、停止位。

    其中各位的意义如下:

    起始位:先发出一个逻辑”0”信号,表示传输字符的开始。

    数据位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCⅡ码。从最低位开始传送,靠时钟定位。

    奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

    空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

    波特率:是衡量数据传送速率的指针。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200位/秒=1200波特。

    注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。

    异步传输存在一个潜在的问题,即接收方并不知道数据会在什么时候到达。在它检测到数据并做出响应之前,第一个比特已经过去了。这就像有人出乎意料地从后面走上来跟你说话,而你没来得及反应过来,漏掉了最前面的几个词。因此,每次异步传输的信息都以一个起始位开头,它通知接收方数据已经到达了,这就给了接收方响应、接收和缓存数据比特的时间;在传输结束时,一个停止位表示该次传输信息的终止。按照惯例,空闲(没有传送数据)的线路实际携带着一个代表二进制1的信号,异步传输的开始位使信号变成0,其他的比特位使信号随传输的数据信息而变化。最后,停止位使信号重新变回1,该信号一直保持到下一个开始位到达。例如在键盘上数字“1”,按照8比特位的扩展ASCⅡ编码,将发送“00110001”,同时需要在8比特位的前面加一个起始位,后面一个停止位。

    异步传输的实现比较容易,由于每个信息都加上了“同步”信息,因此计时的漂移不会产生大的积累,但却产生了较多的开销。在上面的例子,每8个比特要多传送两个比特,总的传输负载就增加25%。对于数据传输量很小的低速设备来说问题不大,但对于那些数据传输量很大的高速设备来说,25%的负载增值就相当严重了。因此,异步传输常用于低速设备。

    同步传输方式中发送方和接收方的时钟是统一的、字符与字符间的传输是同步无间隔的。

    异步传输方式并不要求发送方和接收方的时钟完全一样,字符与字符间的传输是异步的。

    区别点

    1,异步传输是面向字符的传输,而同步传输是面向比特的传输。

    2,异步传输的单位是字符而同步传输的单位是帧。

    3,异步传输通过字符起始和停止码抓住再同步的机会,而同步传输则是在数据中抽取同步信息。

    4,异步传输对时序的要求较低,同步传输往往通过特定的时钟线路协调时序。

    5,异步传输相对于同步传输效率较低。

    简单形容

    同步传输就是,数据没有被对方确认收到则调用传输的函数就不返回。

    接收时,如果对方没有发送数据,则你的线程就一直等待,直到有数据了才返回,可以继续执行其他指令

    异步传输就是,你调用一个函数发送数据,马上返回,你可以继续处理其他事,

    接收时,对方的有数据来,你会接收到一个消息,或者你的相关接收函数会被调用。

    形象形容

    异步传输: 你传输吧,我去做我的事了,传输完了告诉我一声

    同步传输: 你现在传输,我要亲眼看你传输完成,才去做别的事

    所有传输介质都易受干扰和由介质本身引进的问题的影响,如电阻和信号衰减。外来干扰可以由背景噪声、大气辐射、机器甚至故障设备引起。受干扰影响的比特数随传输速率的增力而增加,因为在干扰的时帧中涉及到更多的比特。要更正这些问题,需使用检错与纠错方法。

    在奇偶校验时,各组中1的数目必须总是相同(无论奇或偶),以表示一组比特正确无误地传输。逐个字符的检查叫做VRC (垂直冗余校验)。逐块检查叫做LRC(纵向冗余校验)。在传输开始之前,两个系统的奇偶校验方法必须达成一致。有偶校验(1的数目必须为偶数)、奇校验(1的数目必须为奇数)、空号奇偶校验(校验位始终为0)和传号奇偶校验(校验位始终为1)。

    异步通信指两个互不同步的设备通过计时机制或其他技术进行数据传输。异步通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。基本上,发送方可以随时传输数据,而接收方必须在信息到达时准备好接收。相反,同步传输是一个精确同步的位流,其中字符的起始是由计时机制来定位的。

    在大量使用异步与同步传输的大型机/终端环境中,异步传输用于传输来自用户周期性按键的终端的字符。接收系统知道等待下一次按键,即使这会花费较多的时间。相反,同步传输用作定期传输大量信息的大型系统之间的数据链路。协议为在公用电话系统上利用慢速链路而进行了优化,因此无关位将从传输中删除,并且时钟用于隔开字符。

    在异步通信中,字符作为比特串编码,由起始位(start bit)、数据位(data bit)、奇偶校验位(parity)和停止位(stop bit)组成。这种用起始位开始,停止位结束所构成的一串信息称为帧(frame)。校验比特有时用于检错和纠错。传输的“起始一停止”模式意味着对于每个新字符,传输都重新从头开始,而消除在上次传输过程中可能出现的任意计时差异。当差异确实出现时,检错和纠错机制能够请求重传。

    在传送一个字符时,由一位低电平的起始位开始,接着传送数据位,数据位的位数为5~8。在传输时,按低位在前,高位在后的顺序传送。奇偶校验位用于检验数据传送的正确性,也可以没有,可由程序来指定。最后传送的是高电平的停止位,停止位可以是1位、1.5位或2位。停止位结束到下一个字符的起始位之间的空闲位要由高电平2来填充(只要不发送下一个字符,线路上就始终为空闲位)。

    异步通信中典型的帧格式是:1位起始位,7位(或8位)数据位,1位奇偶校验位,2位停止位。

    在异步通信中,每接收一个字符,接收方都要重新与发送方同步一次,所以接收端的同步时钟信号并不需要严格地与发送方同步,只要它们在一个字符的传输时间范围内能保持同步即可,这意味着对时钟信号漂移的要求要比同步信号低得多,硬件成本也要低的多,但是异步传送一个字符,要增加大约20%的附加信息位,所以传送效率比较低。异步通信方式简单可靠,也容易实现,故广泛地应用于各种微型机系统中。

    综上,介绍了异步传输,异步传输是数据传输的一种方式。由于数据一般是一位接一位串行传输的,在传送每个数据字符之前,先发送一个叫做开始位的二进制位。当接收端收到这一信号时,就知道相继送来7位二进制位是一个字符数据。在这以后,接着再给出1位或2位二进制位,称做结束位。接收端收到结束位后,表示一个数据字符传送结束。这样,在异步传输时,每个字符是分别同步的,即字符中的每个二进制位是同步的,但字符与字符之间的间隙长度是不固定的。

    展开全文
  • 同步通信:要求发收双方具有同频同的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。 异步通信异步通信在发送字符时,所发送的字符...

    通信原理(百度)

    同步通信:要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。

    异步通信:异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。内部处理器在完成了相应的操作后,通过一个回调的机制,以便通知发送端发送的字符已经得到了回复。


    Ajax

    Ajax技术的独到之处是它在服务器端使用了异步(asynchronous)处理技术。

    同步执行(Synchronous Execution):一次只能执行一条指令,只有当前指令执行完才能去执行另一条指令。

    异步执行(Asynchronous Execution):一次可以执行多条指令。


    同步通信,就是送快递的面对面给交你,交互完成即完在,但双方都需要在同一时间内反应,否则会造成另一方阻塞等待。

    异步通信,就是送快递的放在门卫或快递箱,你自己去取,中间不是同步完成的。

    在网络上看到以上对同步异步通信的解释,因此对两个概念产生混肴,甚至觉得两者对于同步异步的定义是完全相反的,以致产生疑惑。


    表面上看通信中的同步在同一时间段完成,而异步则不是;执行中的同步是一种顺序性行为,而异步则可以在同一时间段执行多条指令。

    但从主体来看,通信是涉及通信双方的行为,而执行不涉及双方,只有单线程多线程之分,对于两者的理解还需从这个角度加以区分。

    展开全文
  • --------------------------------------------------------------------------------------------------------------------举个例子 打电话时同步 发消息是异步综述版:异步通信”是一种很常用的通信方式。异步通信...
  • 网上有很多网友用很通俗的比喻 把同步异步讲解的很透彻 转过来举个例子:普通B/S模式(同步)AJAX技术(异步)同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事异步: 请求通过...
  • 同步异步的区别及优缺点 学习编程,同步异步是必须要理解学习的知识点,接下来让我们一起通过举例来理解同步异步的区别,以及同步异步的优缺点吧 同步异步的区别 程序里面的同步异步和我们现实生活...
  • 本文主要三大块:一,串口同步异步在底层通信上的区别(这部分点到为止,不是主要探讨内容,有个基本理解即可)。 二,串口同步异步编程实例及详解(主要部分)。 三,串口同步异步的作用(着眼当下,理解...
  • 1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其...
  • ajax异步通信机制

    2021-08-07 06:57:56
    ajax异步通信机制 内容精选换一换对于磁盘文件,文件的读取是同步的,导致线程读取文件时,属于阻塞状态。程序为了提升性能和磁盘的吞吐,程序会创建几个单独的磁盘读写线程,并通过信号量等机制进行线程间通信(同时...
  • 但是在面对超高吐吞量的场景下,异步处理就比同步处理有比较大的优势了,这就好像一个人不可能同时接打很多电话,但是他可以同时接收很多的电子邮件一样。 同步调用虽然让系统间只耦合于接口,而且实时性也会比
  • 1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其...
  • 小白搞懂异步通讯、同步通讯;全双工通讯,半双工通讯。 自己一开始的时候很容易弄混,在此记录一下,这几个分属不同的概念; 首先全双工/半双工通讯类似于有几个传输线的问题:全双工两根...同步通信类似于打电话,时
  • 异步输入输出流编写Socket进程通信程序在Merlin中加入了用于实现异步输入输出机制的应用程序接口包:java.nio(新的输入输出包,定义了很多基本类型缓冲(Buffer)),java.nio.channels(通道及选择器等,用于异步输入...
  • 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞先验知识此处的异步指的是什么同步异步、阻塞、非阻塞同步阻塞、同步非阻塞、异步阻塞、异步非阻塞一个生动的例子 先验知识   在解释这几个概念之前,需要注意的是:...
  • 同步异步、阻塞和非阻塞同步异步关注的是消息通信机制.同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式. 就是在发出一个调用时, 在没有得到结果之前, 该调用就不返回, 但是一旦...
  • 同步异步,阻塞,非阻塞,IO 同步异步 同步就是在发出一个调用时,在没有得到结果之前,该调用就不会返回。但是一旦调用返回,就得到返回值了,换句话说,同步是指调用者主动等到这个调用的结果。 异步是指...
  • 当进程发起一个IO操作,会向内核注册一个 /O操作(synchronousIO):导致请求进程阻塞,直到I/O操作完成异步I/O操作(asynchronousIO):不导致请求进程阻塞先说说同步异步同步异步关注的是双方的消息通信机制:同...
  • 同步异步相对于操作结果来说,会不会等待结果返回。 阻塞和非阻塞 阻塞就是说在烧水的过程中,你不可以去干其他的事情,非阻塞就是在同样的情况下,可以同时去干其他的事情。阻塞和非阻塞是相对于线程是否被...
  • 数据通信的基本概念

    2021-06-12 23:50:11
    通信和通讯是一个意思,网上多有两词混用的,没什么区分的必要,都指的是数据/信息的传输。本文使用通信一词。 一.通信分类 1.1 串行通信和并行通信 串行通信和并行通信都是计算机科学中的概念,指的都是计算机内部...
  • 微服务.进程间通信

    2021-03-26 23:28:34
    因此,如图 3-1 所示,服务必须使用进程间通信(IPC)机制进行交互。 稍后我们将了解到多种 IPC 技术,但在此之前,我们先来探讨一下涉及到的各种设计问题。 交互方式 当为服务选择一种 IPC 机制时,首先需要...
  • 杨健 (ytjcopy@263.net)中南工业大学代码号为”Merlin”的J2SE1.4带来了一些激动人心的新特性,诸如对正则表达式的支持,异步输入输出流,通道(Channel),字符集等.虽然该版本还处在测试阶段,但这些新特性早已让开发人员...
  • 同步异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。 前言 线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...
  • 【Verilog】 同步复位和异步复位比较    同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效。 无论时钟沿是否到来,只要复位信号有效,就进行复位。 Verilog描述 ...
  • socket阻塞与非阻塞,同步异步、I/O模型 标签:socketsocketswindowsapi服务器 2012-04-12 16:35148613人阅读评论(56)收藏举报 本文章已收录于: 分类: c/c++(22) 作者同类文章X socket网络编程(7) ...
  • 同步异步是线程的通信模式 堵塞和非堵塞是线程的处理模式 先给出总结性的定义,看不懂没关系,请继续往下看。 堵塞和非堵塞 首先我们举个简单的例子: 张三要去买菜,买菜的路上突然看到了一家奶茶店,于是他决定...
  • 同时,很多时候,线程相对于进程属于轻量级的,更便于创建和销毁。 ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对...
  • IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端...
  • 异步 1.谈到并发,就不得不提串行和并行了。这三点容易混淆。 如下图所示, 串行:一个时间段内,执行一个任务的同时不能执行其他任务,只能等到第一个任务完成后才能进行第二个。 并行:一个时间段内有多个任务,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,685
精华内容 21,874
关键字:

同步通信相对于异步通信