精华内容
下载资源
问答
  • 异步同步通信数据帧格式

    千次阅读 2020-07-10 13:52:52
    1. 异步通信的特点及信息帧格式: 以起止式异步协议为例,下图显示的是起止式一帧数据的格式: 图1 起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以"起始位"开始,以...
    串口扫盲六:异步通信方式
    </div>
    

    串行通信可以分为两种类型:同步通信、异步通信.

    1. 异步通信的特点及信息帧格式:

    以起止式异步协议为例,下图显示的是起止式一帧数据的格式:

    图1

    起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以"起始位"开始,以"停止位"结束,字符之间没有固定的时间间隔要求.每一个字符的前面都有一位起始位(低电平,逻辑值),字符本身由5-7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位.停止位和空闲位都规定为高电平(逻辑值1),这样就保证起始位开始处一定有一个下跳沿.

    从图中可看出,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为起止式协议.

    异步通信可以采用正逻辑或负逻辑,正负逻辑的表示如下表所示:

     

    逻辑0

    逻辑1

    正逻辑

    低电平

    高电平

    负逻辑

    高电平

    低电平

    异步通信的信息格式如下边的表所示:

    起始位

    逻辑0

    1位

    数据位

    逻辑0或1

    5位、6位、7位、8位

    校验位

    逻辑0或1

    1位或无

    停止位

    逻辑1

    1位,1.5位或2位

    空闲位

    逻辑1

    任意数量

    注:表中位数的本质含义是信号出现的时间,故可有分数位,如1.5.

    例:传送8位数据45H(0100,0101B),奇校验,1个停止位,则信号线上的波形象图2所示那样:异步通信的速率:若9600bps,每字符8位,1起始,1停止,无奇偶,则实际每字符传送10位,则960字符/秒.

    图2

    2. 异步通信的接收过程

    接收端以"接收时钟"和"波特率因子"决定一位的时间长度.下面以波特率因子等于16(接收时钟每16个时钟周期,使接收移位寄存器移位一次),正逻辑为例说明,如图3所示.

    图3

    1. 开始通信时,信号线为空闲(逻辑1),当检测到由1到0的跳变时,开始对"接收时钟"计数.
    2. 当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是"起始位"B,而不是干扰信号.
    3. 接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据.若为逻辑1, 作为数据位1;若为逻辑0,作为数据位0.
    4. 再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据.….,直到全部数据位都输入.
    5. 检测校验位P(如果有的话).
    6. 接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置"帧错误"标志.若没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器中送数据输入寄存器.若校验错,在状态寄存器中置奇偶错标志.
    7. 本幀信息全部接收完,把线路上出现的高电平作为空闲位.

    当信号再次变为低时,开始进入下一幀的检测.

    3. 异步通信的发送过程

    发送端以"发送时钟"和"波特率因子"决定一位的时间长度.

     

    1. 当初始化后,或者没有信息需要发送时,发送端输出逻辑1,即空闲位,空闲位可以有任意数量.
    2. 当需要发送时,发送端首先输出逻辑0,作为起始位.
    3. 接着,发送端首先发送D0位,直到各数据位发送完.
    4. 如果需要的话,发送端输出校验位.
    5. 最后,发送端输出停止位(逻辑1).
    6. 如果没有信息需要发送时,发送端输出逻辑1,即空闲位,空闲位可以有任意数量.如果还有信息需要发送,转入第(2)步.

    对于以上发送、接收过程应注意以下几点:

    1. 接收端总是在每个字符的头部(即起始位)进行一次重新定位,因此发送端可以在字符之间插入不等长的空闲位,不影响接收端的接收.
    2. 发送端的发送时钟和接收端的接收时钟,其频率允许有一定差异,当频率差异在一定范围内,不会引起接收端检测错位,能够正确接收.并且这种频率差异不会因多个字符的连续接收而造成误差累计(因为每个字符的开始(起始位处)接收方均重新定位).只有当发送时钟和接收时钟频率差异太大,引起接收端采样错位,才造成接收错误.
    3. 起始位,校验位,停止位,空闲位的信号,由"发送移位寄存器"自动插入.在接收方,"接收移位寄存器"接收到一帧完整信息(起始,数据,校验,停止)后,仅把数据的各位送至"数据输入寄存器",即CPU从"数据输入寄存器"中读得的信息,只是有效数字,不包含起始位,校验位,停止位信息.
    展开全文
  • 异步串行通信的数据格式如图所示。  图 异步串行通信的数据格式  异步通信数据的第一位是开始位,在通信线上没有数据传送时处于逻辑“1”状态。当发送设备要发送一个字符数据时,首先发出一个逻辑“0”信号...
  • 1. 异步串行通信 异步串行通信是以字符为单位的间歇传输形式传送时按字符进行包装为此在数据位之外要增添起始位奇偶校验位和停止位构成一个通信帧下图为异步通信的帧格式 ; 几点说明 在串行通信中信息的两种状态分别...
  • 并行通信:是指数据的各位同时进行传送的通信方式。串行通信:是指数据一位一位顺序传送的通信方式...串行通信的两种基本形式:同步通信和异步通信。异步通信所传输的数据帧格式是由1个起始位、1~9个数据位、1~2个停
  • 主要内容:串行口结构、串行口4 种工作方式、多机...传送数据是以一帧一帧格式进行串行通信(英语:Serial communication)是指在计算机总线或其他数据通道上,每次传输一个位元数据,并连续进行以上单...

    主要内容:串行口的结构、串行口的4 种工作方式、多机通信、波特率的制定方法、串行口的应用。

    MCS-51单片机内部有一个全双工的异步串行口。

    全双工:双机通信之间可以同时实现发送数据和接收数据。

    异步:收发双方没有应用同一时钟来控制数据传送。传送的数据是以一帧一帧格式进行的。

    串行通信(英语:Serial communication)是指在计算机总线或其他数据通道上,每次传输一个位元数据,并连续进行以上单次过程的通信方式。与之对应的是并行通信,它在串行端口上通过一次同时传输若干位元数据的方式进行通信。

    简言之:串行通讯就是排成一队走,并行就是排成一列走。

    同步串行通信(Synchronous serial communication)和异步串行通信(Asynchronous serial communication)

    1)发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(例如在时钟信号的上升沿的时候,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号,以及大家的约定,接收数据。这就是常说的同步串行通信(Synchronous serial communication),I2C、SPI等有时钟信号的协议,都属于这种通信方式。

    2)发送端在数据发送之前和之后,通过特定形式的信号(例如START信号和STOP信号),告诉接收端,可以开始(或者停止)接收数据了。与此同时,收发两方会约定一个数据发送的速度(就是大名鼎鼎的波特率),发送端在发送START信号之后,就按照固定的节奏发送串行数据,与此同时,接收端在收到START信号之后,也按照固定的节奏接收串行数据。这就是常说的异步串行通信(Asynchronous serial communication)。

    串行异步通信是单片机中常用的方式:

    数据按帧传输,一包含 数据按帧传输,一包含 起始位 、数据校验和停止。依靠 起始位 、停止保持通信同步。因每帧传输都要建立一次同步 ,即需要额外两个附加位适用于工作速度较低的场合。

    b36fd396c258ee73d5acc428c0ed2065.png

    串行口的接口及基本原理:

    该单片机串行接口是一个可编程的全双工串行通信接口。它可用作异步通信方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通信协议进行全双工的8051多机系统也能通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。通过管脚RXD(P3.0,串行数据接收端)和管脚TXD(P3.1,串行数据发送端)与外界通信。

    两个物理上独立地接收和发送缓冲器,可同时收、发数据(全双工)。两个缓冲区公用一个特殊功能寄存器字节地址:SBUF(99H),它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。

    控制寄存器共两个:特殊功能寄存器SCON(控制寄存器)和PCON(状态寄存器)。

    串行口控制寄存器SCON :字节地址98H,可位寻址,格式如图所示

    103320da11e19d561e2ad77f249339b2.png

    (1)SM0、SM1——串行口4种工作方式的选择位

    SM0 SM1 方式 功 能 说 明

    0 0 0 同步移位寄存器方式(用于扩展I/O口)

    0 1 1 8位异步收发,波特率可变(由定时器控制)

    1 0 2 9位异步收发,波特率为fosc/64或fosc/32

    1 1 3 9位异步收发,波特率可变(由定时器控制)

    表1 串行口的4种工作方式

    7b137c6f3e4a3ac5607bd7781abb29bf.png

    其中fosc为晶体震荡器频率

    SM2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。

    REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。

    TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。

    RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。

    TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。

    RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。

    波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。

    波特率 :每秒钟传送码元数目,单位波特( Baud ) ( 位/秒( bps )

    假设波特率为: 1200b /s

    每一位代码的传送时间 Td (码元宽度 )为波特率的倒数。

    Td =1b /( 1200bs)= 0.833ms

    而每个字符格式包含 10 个代码位( 1个起始位、 1个终止位、 8个数据位),传送一字节需要 8.33ms 。

    传送距离随波特率增加而减少

    波特率制定方法:

    • 收、发双方的波特率必须一致。
    • 串口方式0和方式2的波特率是固定的;
    • 串口方式1和方式3的波特率是可变的,由T1溢出率确定。

    串口各种工作方式下波特率的计算

    1. 方式0时,波特率固定为时钟频率fosc的1/12。
    2. 方式2时,波特率仅与SMOD位的值有关。

    2 定时器T1产生波特率的计算

    (1)方式0波特率=时钟频率fosc×1/12,不受SMOD位的值的影响。若fosc=12MHz,波特率为fosc/12即1Mb/s。

    (2)方式2波特率=(2^SMOD/64)×fosc

    若fosc=12MHz: SMOD=0 波特率=187.5kb/s; SMOD=1 波特率=375kb/s

    (3)方式1或方式3时,波特率为:

    波特率=(2^SMOD/64)×T1的溢出率

    实际设定波特率时,T1常设置为方式2定时(自动装初值)这种方式不仅操作方便,也可避免因软件重装初值而带来的定时误差。

    由上式可见,波特率随fosc、SMOD和初值X而变化。

    73831d280df24f4a125a6f4e9340aa7b.png

    帧格式:

    5f04d9d3beae5a823ab8197ee48711fa.png

    起始位(1位)---低电平;

    数据位(8位);

    奇偶校验位(1位,可无校验位);

    停止位(1位)---高电平。

    空闲位

    串行口的四种工作方式:

    1、工作方式0

    工作方式0由SCON寄存器SM0SM1都为低电平决定,用于移位寄存器,I/O口扩展应用。一帧信息包括8位数据位、低位在前,高位在后。波特率固定为fosc/12。

    发送:TI=0时,执行MOV SBUF,A将数据写入发送缓冲寄存器,并启动发送。TXD端输出移位脉冲,串行口把SBUF中数据依次从低到高从RXD读出。一帧数据发送完毕,硬件自动将RI发送中断标志位置1,若再次发送需要用指令CLR TI清零。

    MOV SBUF,A;启动发送

    JNB TI,$;若TI=0则该指令原地踏步等待发送完毕

    CLR TI;请0,清发送中断标志位

    接收:在RI=0,REN=1时,开始串行接收数据,TXD输出移位脉冲。将数据以固定波特率接收到SBUF中去,一帧数据接收完毕后,硬件自动将RI置1,若再接收数据需要用MOV A,SBUF读出数据,然后用指令将RI清零。

    JNB RI,$;RI=0则软件原地踏步,等待接收

    CLR RI;清接收中断标志位

    MOV A,SBUF;将接收数据送入累加器A中

    2、工作方式1

    一帧信息包括起始位、8位数据位、停止位共10位,低位在前,高位在后。波特率可变,由定时器/计数器T1的输出率和SMOD(PCON.7)决定。

    基本的接收发送指令与方式0同,但是:

    (1)当SM2=0时,将接收的数据送入SBUF中,停止位送入RB8中,并置中断标志位RI=1.

    (2)当SM2=1时,接收停止位=1,将接收的数据送入SBUF并且停止位送入RB8,并置RI=1,否则丢弃接收到的数据。再次接收前需要将RI清0。

    波特率计算方法:波特率=(2^SMOD/32)*定时器T1的溢出率

    溢出率:定时器在1S内产生溢出的次数。

    定时器的溢出率与定时器的工作模式有关,可以改变TMOD寄存器T1方式字段中的M1M0两位。T1定时器工作在方式2时,作为8位定时器自动重载功能。

    3、方式2

    9位异步通信接口。每帧数据均为11位,1位起始位0,8位数据位(先低位),1位可程控的第9位数据和1位停止位。

    方式2波特率= (2^SMOD/64)×fosc

    发送前,先根据通讯协议由软件设置TB8(例如,双机通讯时的奇偶校验位或多机通讯时的地址/数据的标志位)。

    SM0、SM1=10,且REN=1。数据由RXD端输入,接收11位信息。当位检测到RXD从1到0的负跳变,并判断起始位有效后,开始收一帧信息。在接收器完第9位数据后,需满足两个条件,才能将接收到的数据送入SBUF。

    (1)RI=0,意味着接收缓冲器为空。

    (2)SM2=0或接收到的第9位数据位RB8=1时。

    当上述两个条件满足时,接收到的数据送入SBUF(接收缓冲器),第9位数据送入RB8,并置“1”RI。若不满足两个条件,接收的信息将被丢弃。

    4、方式3

    SM0、SM1=11,串口为方式3。波特率可变的9位异步通讯方式,除波特率外,方式3和方式2相同。

    多机通信(主动式结构)

    要保证主机与所选择的从机实现可靠地通信,必须保证串口具有识别功能。

    SCON中的SM2位就是满足这一条件而设置的多机通信控制位。

    原理:在串行口以方式2(或方式3)接收时,若SM2=1,表示置多机通信功能位,这时有两种可能:

    (1)接收到的第9位数据为1时,数据才装入SBUF,并置中断标志RI=1向CPU发出中断请求;

    (2)接收到的第9位数据为0时,则不产生中断标志,信息将抛弃。

    主机发送信息两类:一类是地址,用来需要和主机通信的从机,特征是串行发送的第9位数据TB8为1;另一种是数据,串行传送的第9位数据TB8=0.

    主从机通信的过程如下:

    1)使所有的从机工作方式2或3,且SM2=1,REN=1,以便主机发送地址信息,从机接收地址帧信息。

    2)主机发送要寻址的从机的地址信息,其中包括8位需要与之通信的从机地址,第9位TB8=1.

    3)所有从机接收到地址信息,置RI=1.

    4)各从机进行地址比较,对于接收到的地址和自己的地址相同的从机,使SM2=0,准备接收主机随后发来的数据,对于地址不符合的从机,仍保持SM2=1的状态,对主机随后的数据不予理睬,直至发现新的地址帧。

    备注:补充RS485差分传输特性,所谓差分传输,就是发送端在两条信号线上传输幅值相等相位相反的电信号,接收端对接受的两条线信号作减法运算,这样获得幅值翻倍的信号。

    特点:从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的。在某些系统里,"系统地"被用作电压基准点。当'地'当作电压测量基准时,这种信号规划被称之为单端的。我们使用该术语是因为信号是用单个导体上的电压来表示的。 另一方面,一个差分信号作用在两个导体上。信号值是两个导体间的电压差。尽管不是非常必要,这两个电压的平均值还是会经常保持一致。

    可以想象,这两个导体上被同时加入的一个相等的电压,也就是所谓共模信号,对一个差分放大系统来说是没有作用的,也就是说,尽管一个差分放大器的输入有效信号幅度只需要几毫伏,但它却可以对一个高达几伏特的共模信号无动于衷。这个指标叫做差分放大器的共模抑制比(CMRR),一般的运算放大器可以达到90db以上,高精度运放甚至达到120db。因为干扰信号一般是以共模信号的形式存在,所以差分信号的应用极大地提高了放大器系统的信噪比。

    单端传输就是对与地而言的。

    例:基本设置指令如下。

    b4fd3e61b7c0c6ed4bc98388e3e34227.png
    展开全文
  • 本篇文章介绍,串口协议数据帧格式串行通信的工作方式、电平标准、编码方式及Verilog实现串口发送一个字节数据和接收一个字节数据。对于MCU串口的发送接收,可能就是1行代码就能实现串口的发送和接收:STM32的串口...

    d34803a8700324ff9536d54a803e89c1.png

    详解串行通信协议及其FPGA实现

    前言

    好久没更新博客了,这篇文章写写停停,用了近一周的时间,终于写完了。本篇文章介绍,串口协议数据帧格式、串行通信的工作方式、电平标准、编码方式及Verilog实现串口发送一个字节数据和接收一个字节数据。

    对于MCU串口的发送接收,可能就是1行代码就能实现串口的发送和接收:

    STM32的串口接收和发送

    //STM32发送1个字节
    USART_SendData(USART1, 'A'); 
    while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
    
    //STM32接收1个字节:
    uint8_t Res;
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    Res = USART_ReceiveData(USART1);
    

    51单片机的发送和接收

    //51单片机发送1个字节
    SBUF = 'A;
    while(!TI);
    TI=0;
    
    
    //51单片机接收1个字节:
    char Res;
    if(RI)
    {
       Res = SBUF;
       RI = 0;
    }
    

    更方便一点的,通过重写C库fput函数和fgetc函数,还可以实现printf直接重定向到串口,用来输出一些调试信息再方便不过了。

    STM32实现输入输出重定向到串口发送接收

    //可重定向printf函数
    int fputc(int ch, FILE *f)
    {
            USART_SendData(DEBUG_USARTx, (uint8_t) ch);
            while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);     
            return (ch);
    }
    //可重定向scanf函数
    int fgetc(FILE *f)
    {
            while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
            return (int)USART_ReceiveData(DEBUG_USARTx);
    }
    

    而MCU上的串口是半导体厂商预先设计好的,几乎是MCU的标配,高度集成,使用起来十分方便,但是串口的引脚基本上是固定的,不可以更改。对于硬件橡皮泥——FPGA来说,需要使用HDL从底层串口数据帧来实现,可以直接在任意一个引脚实现串口功能。为了用Verilog HDL实现标准的串口通讯协议,我们有必要先来详细了解一下串口通讯协议。

    串口数据帧格式

    波特率

    波特率,即比特率(Baud rate),即通信双方“沟通的语言”,通信双方要设置为一样的波特率才可以正常通信。表示每秒发送的二进制位数,即传输1位的时间是:1/波特率 秒,如,波特率9600bps,即每秒传输9600bit,那么每一位的时间为:1/9600 s = 104.1666us,常用的波特率有:4800/9600/115200/12800等等,也可以根据需要自定义波特率大小,如1M或者3M,但是有的PC或者USB-TTL模块不支持太高速度的波特率,常用的USB-TTL芯片有:CH340,CP2102,PL2103,FT232等,其中FT232HL芯片最大支持12M的波特率,当然价格也比其他芯片高一些。

    起始位和停止位

    数据帧从起始位开始,到停止位结束。起始信号用逻辑0表示,而停止位是用逻辑1表示,一般有0.5位、1位、1.5位或2位停止位,常用的一般是1位停止位,只要通信双方约定一致即可。

    数据位

    起始位之后,紧跟着的是数据位,低位(LSB)在前,高位(MSB)在后,一般有5位、6位、7位和8位数据位,常用的是8位数据位,因为一个字节正好是8位。

    校验位

    校验位一般用来判断接收的数据位有无错误,校验方法有:奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)及无校验(noparity)。奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:01101001,此时共有4个“1”,为达到奇数个"1"的效果,校验位为“1”,让“1”的个数变成5个(奇数)。偶校验刚好相反,要求有效数据和校验位的“1”数量为偶数,则此时为达到偶校验效果,校验位为“0”。而0校验,即校验位总是为“0”,1校验校验位总是为“1”。奇偶校验逻辑相反,01校验逻辑相反。一般是奇偶校验或者是无校验位。

    奇偶校验的Verilog实现

    在Verilog中奇偶校验的计算非常简单,根据奇偶校验的原理,偶校验为数据位各位异或,奇校验是偶校验取反,通过使用单目运算符的缩减功能,可以非常简单的计算奇偶校验位:

    input [7:0] data_in,       //需要发送的8位数据
    
    wire even_bit;  //偶校验位 = 各位异或
    wire odd_bit;   //奇校验位 = ~偶校验位
    
    assign even_bit = ^data_in; //一元约简运算符,等效于data_in[0] ^ data_in[1] ^ .....
    assign odd_bit = ~even_bit;
    
    wire POLARITY_BIT = even_bit;  //偶校验
    

    关于波特率允许的误差

    经过我的实际测试,波特率是有一定的容错范围的,例如,STM32配置成115200波特率,每10ms发送一个30字节的字符串,串口芯片用的CH340,上位机波特率设置成113000-121000也可以接收,无乱码,差不多正负2000的波特率,这容错范围也太大了,当然如果发送频率太快,数据量太大,误码率肯定会大大增加,所以还是建议通信双方使用同样的波特率以减少误差。

    串口数据的实际波形

    使用串口上位机连接USB-TTL模块,发送一个字节数据:1位停止位+8位数据位+1位奇校验位+1位停止位,使用示波器的单次触发功能,可以在USB-TTL模块的TX引脚测得串口协议数据的实际波形,你知道这发送的是什么字符吗?

    一个字符的实际波形

    e18e5cbca23983f7c4b77d715a286f6a.png

    两个字符的实际波形

    acec0c291da324c34553e731ad0d2545.png

    单工、半双工、全双工、异步和同步的区别

    在介绍串口的电平标准之前,先来了解一下串行通信的工作方式,即单工、半双工、全双工,异步和同步的区别。

    单工

    单工,即数据传输只在一个方向上传输,只能你给我发送或者我给你发送,方向是固定的,不能实现双向通信,如:室外天线电视、调频广播等。

    半双工

    半双工比单工先进一点,传输方向可以切换,允许数据在两个方向上传输,但是某个时刻,只允许数据在一个方向上传输,可以基本双向通信,如:对讲机,IIC通信。

    f46aad03d2da6c9f0ebed098099a028e.png

    全双工

    比半双工更先进的是全双工,允许数据同时在两个方向传输。发送和接收完全独立,在发送的同时可以接收信号,或者在接收的同时可以发送。它要求发送和接收设备都要有独立的发送和接收能力,如:电话通信,SPI通信,串口通信。

    同步和异步的区别

    串行通信可以分为两种类型,一种叫同步通信,另一种叫异步通信。

    717c0a6b54b7d236e1387bd038cff2f1.png

    简单的说,就是同步通信需要时钟信号,而异步通信不需要时钟信号。

    • 同步:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
    • 异步:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

    SPI和IIC为同步通信,UART为异步通信,而USART为同步&异步通信。

    • USART:通用同步和异步收发器
    • UART:通用异步收发器

    即USART支持同步和异步收发,而UART只支持异步收发。

    如STM32的串口工作在同步模式时,即智能卡模式时,就需要连接同步时钟引脚。

    a924b944e725a46ac4e9af908b5883b5.png

    常用的串行通信协议/电平标准

    TTL电平

    即普通MCU芯片输出的串口电平,如各MCU输出的串口信号就是TTL电平。低电平为0-GND,高电平为1-VCC,标准的数字电路逻辑。特点是速度快,延迟低,但是功耗大。基本上用于板内两个芯片之间短距离通信。

    RS232

    RS232是工业上常用的串口标准,无论是PLC的232接口,还是工控机上的串口,输出的串口电平都是232电平标准,232标准采用负逻辑电平,即-15~-3v为逻辑1,+3~+15为逻辑0,这里的电平是指RX和TX相对于GND的电压,可见无论在电压范围还是电压极性上都和TTL不同,显然这两种电平不能直接连接,需要使用MAX232类似的电平转换芯片,对两种电平进行互相转换,全双工,传输距离一般控制在20m以内,原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题。

    d08ad17ece6d5713b20809966bbf8f3f.png

    RS485

    在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准。RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便,可以省掉许多信号线。应用RS-485 可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。

    RS422

    RS-422和RS-485电路原理基本相同,都是以差分方式发送和接受,不需要数字地线。RS-422通过两对双绞线可以全双工工作收发互不影响,而RS485只能半双工工作,发收不能同时进行,但它只需要一对双绞线。RS422和RS485在19kpbs下能传输1200米。RS-422的电气性能与RS-485完全一样。主要的区别在于:RS-422有4根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422的收与发是分开的所以可以同时收和发(全双工)。

    串行通信的编码方式

    RZ编码

    RZ编码也成为归零码,归零码的特性就是在一个周期内,用二进制传输数据位,在数据位脉冲结束后,需要维持一段时间的低电平。如图:

    ab6d4aaa451690e9a2bea366754d9361.png

    上图表示的是单极性归零码,即低电平表示0,正电平表示1。对于双极性归零码来说,则是高电平表示1,负电平表示0。如下图所示:

    bc872497f057f32f8735701524114dbd.png

    NRZ编码

    NRZ编码也成为不归零编码,也是我们最常见的一种编码,即正电平表示1,低电平表示0。它与RZ码的区别就是它不用归零,也就是说,一个周期可以全部用来传输数据,这样传输的带宽就可以完全利用。

    eb13e9688755e7ed2204cb8fe4297d66.png

    NRZI编码

    NRZI编码的全称为反向不归零编码,这种编码方式集成了前两种编码的优点,即既能传输时钟信号,又能尽量不损失系统带宽。对于USB2.0通信的编码方式就是NRZI编码。其实NRZI编码方式非常的简单,即信号电平翻转表示0,信号电平不变表示1。例如想要表示00100010(B),则信号波形如下图所示:

    8c9fd39c66606fb416953b8a144dfa9a.png

    例如有一段数据为:1111 1111 (B)要发送,则整个传输线上的电平状态是这样的:

    2aeb41b383425415e4f9d25009fd465f.png

    Manchester编码

    曼彻斯特编码,又称数字双向码、分相码或相位编码(PE),是一种常用的的二元码线路编码方式。常用在以太网通信,列车总线控制,工业总线等领域。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示“0”,从低到高跳变表示“1”。其中非常值得注意的是,在每一位的"中间"必有一跳变,根据此规则,可以得出曼彻斯特编码波形图的画法。例如:传输二进制信息0,若将0看作一位,我们以0为中心,在两边用虚线界定这一位的范围,然后在这一位的中间画出一个电平由高到低的跳变。后面的每一位以此类推即可画出整个波形图。举个图例吧,若要表示数据1001 1010(B),则信号波形图如下图所示:

    66a53cfe1a3ddf097990163c7842d625.png

    曼彻斯特编码方式也如前面所说,虽然传输了时钟信号,但也损失了一部分的带宽,主要表现在相邻相同数据上。但对于高速数据来说,这种编码方式无疑是这几种编码方式中最优的,相比NRZI编码,曼彻斯特编码不存在长时间信号状态不变导致的时钟信号丢失的情况,所以在这种编码方式在以太网通信中是十分常用的。

    串行和并行哪个速度快?

    串口,即串行通信接口,与之对应的是并行接口。在实际时钟频率比较低的情况下,并口因为可以同时传输若干比特,速率确实比串口快。但是,随着技术的发展,时钟频率越来越高,当时钟频率提高到一定的程度时,并行接口因为有多条并行且紧密的导线,导线之间的相互干扰越来越严重。而串口因为导线少,线间干扰容易控制,况且加上差分信号的加持,抗干扰性能大大提升,因此可以通过不断提高时钟频率来提高传输速率,这就是为什么现在高速传输都采用串行方式的原因。例如常见的USB、SATA、PCIe、以太网等。

    如果有人问关于串行传输与并行传输谁更好的问题,你也许会脱口而出:串行通信好!但是,串行传输之所以走红,是由于将单端信号传输转变为差分信号传输,并提升了控制器工作频率的原因,而“在相同频率下并行通信速度更高”这个基本道理是永远不会错的,通过增加位宽来提高数据传输率的并行策略仍将发挥重要作用。当然,前提是有更好的措施来解决并行传输过程中的种种问题。

    标准串口协议的Verilog实现

    基于Verilog实现标准串口协议发送8位数据:起始位 + 8位数据位 + 校验位 + 停止位 = 11位,每1位的时间是16个时钟周期,所以输入时钟应该为:波特率*16,带Busy忙信号输出。实现方法比较简单,数据帧的拼接、计数器计时钟周期,每16个时钟周期输出一位数据即可。

    串口发送1个字节实现

    /*
    串口协议发送:起始位 + 8位数据位 + 校验位 + 停止位 = 11位 * 16 = 176个时钟周期
    clk频率 = 波特率 * 16
    */
    
    module uart_tx_8bit(
    
    //input
    input clk,                //UART时钟=16*波特率
    input rst_n,
    input [7:0] data_in,       //需要发送的数据
    input trig,                //上升沿发送数据
    
    //output
    output busy,                 //高电平忙:数据正在发送中
    output reg tx                //发送数据信号
    
    );
    
    reg[7:0] cnt;             //计数器
    reg trig_buf;
    reg trig_posedge_flag;
    // reg trig_negedge_flag;
    reg send;
    
    reg [10:0] data_in_buf;     //trig上升沿读取输入的字节,拼接数据帧
    
    wire odd_bit;   //奇校验位 = ~偶校验位
    wire even_bit;  //偶校验位 = 各位异或
    wire POLARITY_BIT = even_bit;  //偶校验
    // wire POLARITY_BIT = odd_bit;   //奇校验
    
    assign even_bit = ^data_in; //一元约简,= data_in[0] ^ data_in[1] ^ .....
    assign odd_bit = ~even_bit;
    assign busy = send;     //输出的忙信号
    
    //起始位+8位数据位+校验位+停止位 = 11位 * 16 = 176个时钟周期
    parameter CNT_MAX = 176;
    
    always @(posedge clk)
    begin
        if(!rst_n)
        begin
            trig_buf <= 0;
            trig_posedge_flag <= 0;
            // trig_negedge_flag <= 0;
        end
        else 
        begin
            trig_buf <= trig;
            trig_posedge_flag <= (~trig_buf) & trig; //在trig信号上升沿时产生1个时钟周期的高电平
            // trig_negedge_flag <= trig_buf & (~trig); //在trig信号下降沿时产生1个时钟周期的高电平    
        end
    end
    
    always @(posedge clk)
    begin
        if(!rst_n)
            send <= 0;
        else if (trig_posedge_flag &  (~busy))  //当发送命令有效且线路为空闲时,启动新的数据发送进程
            send <= 1;
        else if(cnt == CNT_MAX)      //一帧资料发送结束
            send <= 0;
    end
    
    always @ (posedge clk)
    begin
        if(!rst_n)
            data_in_buf <= 11'b0;
        else if(trig_posedge_flag & (~busy))    //只读取一次数据,一帧数据发送过程中,改变输入无效
            data_in_buf <= {1'b1, POLARITY_BIT, data_in[7:0], 1'b0};   //数据帧拼接
    end
    
    always @ (posedge clk)
    begin
        if(!rst_n)
            cnt <= 0;
        else if(!send || cnt >= CNT_MAX)
            cnt <= 0;
        else if(send)
            cnt <= cnt + 1;
    end
    
    always @(posedge clk)
    begin
        if(!rst_n)
            tx <= 1;
        else if(send)  
        begin
            case(cnt)                 //1位占用16个时钟周期
                0: tx <= data_in_buf[0];           //低位在前,高位在后
                16: tx <= data_in_buf[1];    //bit0,占用第16~31个时钟
                32: tx <= data_in_buf[2];    //bit1,占用第47~32个时钟
                48: tx <= data_in_buf[3];    //bit2,占用第63~48个时钟
                64: tx <= data_in_buf[4];    //bit3,占用第79~64个时钟
                80: tx <= data_in_buf[5];    //bit4,占用第95~80个时钟
                96: tx <= data_in_buf[6];    //bit5,占用第111~96个时钟
                112: tx <= data_in_buf[7];   //bit6,占用第127~112个时钟
                128: tx <= data_in_buf[8];   //bit7,占用第143~128个时钟
                144: tx <= data_in_buf[9];   //发送奇偶校验位,占用第159~144个时钟
                160: tx <= data_in_buf[10];  //发送停止位,占用第160~167个时钟            
                CNT_MAX: tx <= 1;            //无空闲位
                default:;
            endcase
        end
        else if(!send) 
            tx <= 1;
    end
    
    endmodule
    

    仿真波形

    b0485161b539740e068331d580c7d6a1.png

    串口接收1个字节实现

    串口接收部分的实现,涉及到串口数据的采样,对于MCU来说,不同单片机集成外设的处理方式有所不同,具体采样原理可以参考内核的Reference Manual。以传统51内核为例,按照所设置的波特率,每个位时间被分为16个时间片。UART接收器会在第7、8、9三个时间片进行采样,按照三取二的逻辑获得该位时间内的采样结果。其它一些类型的单片机则可能会更加严苛,例如有些工业单片机会五取三甚至七取五(设置成抗干扰模式时)。

    本程序中采用的中间值采样,即取16个时钟周期中的中间位作为当前的采样值。

    //Verilog实现串口协议接收,带错误指示,校验错误和停止位错误
    
    /*
    16个时钟周期接收1位,中间采样
    */
    module my_uart_rx(
    
    input clk,             //采样时钟
    input rst_n,
    input rx,              //UART数据输入
    output reg [7:0] dataout,        //接收数据输出
    output reg rx_ok,          //接收数据有效,高说明接收到一个字节
    output reg err_check,      //数据出错指示
    output reg err_frame     //帧出错指示
    
    );
    
    reg [7:0] cnt;
    reg [10:0] dataout_buf;
    
    reg rx_buf;
    reg rx_negedge_flag;
    reg receive;
    
    wire busy;
    wire odd_bit;   //奇校验位 = ~偶校验位
    wire even_bit;  //偶校验位 = 各位异或
    wire POLARITY_BIT;   //本地计算的奇偶校验
    // wire polarity_ok;
    // assign polarity_ok = (POLARITY_BIT == dataout_buf[9]) ? 1 : 0; //校验正确=1,否则=0
    
    assign busy = rx_ok;
    assign even_bit = ^dataout;     //一元约简,= data_in[0] ^ data_in[1] ^ .....
    assign odd_bit = ~even_bit;
    assign POLARITY_BIT = even_bit;  //偶校验
    // assign POLARITY_BIT = odd_bit;  //奇校验
    
    parameter CNT_MAX = 176;
    
    //rx信号下降沿标志位
    always @(posedge clk)   
    begin
        if(!rst_n)
        begin
            rx_buf <= 0;
            rx_negedge_flag <= 0;
        end
        else
        begin
            rx_buf <= rx;
            rx_negedge_flag <= rx_buf & (~rx);
        end
    end
    //在接收期间,保持高电平
    always @(posedge clk)
    begin
        if(!rst_n)
            receive <= 0;
        else if (rx_negedge_flag && (~busy))  //检测到线路的下降沿并且原先线路为空闲,启动接收数据进程
            receive <= 1;      //开始接收数据
        else if(cnt == CNT_MAX)  //接收数据完成
            receive <= 0;
    end
    //起始位+8位数据位+校验位+停止位 = 11位 * 16 = 176个时钟周期
    always @ (posedge clk)
    begin
        if(!rst_n)
            cnt <= 0;
        else if(!receive || cnt >= CNT_MAX)
            cnt <= 0;
        else if(receive)
            cnt <= cnt + 1;
    end
    //校验错误:奇偶校验不一致
    always @ (posedge clk)
    begin
        if(!rst_n)
            err_check <= 0;
        else if(cnt == 152)
        begin
            // if(POLARITY_BIT == rx)
            if(POLARITY_BIT != dataout_buf[9])      //奇偶校验正确
                err_check <= 1;         //锁存
            // else
                // err_check <= 1;       
        end
    end
    //帧错误:停止位不为1
    always @ (posedge clk)
    begin
        if(!rst_n)
            err_frame <= 0;
        else if(cnt == CNT_MAX)
        begin
            if(dataout_buf[10] != 1)        //停止位
                err_frame <= 1;
            // else
                // err_frame <= 1;      //如果没有接收到停止位,表示帧出错
        end
    end
    
    always @ (posedge clk)
    begin
        if(!rst_n)
            dataout <= 11'h00;
        else if(receive)
        begin
            // if(rx_ok)
            if(cnt >= 137)
                dataout <= dataout_buf[8:1];        //数据位:8-1位
            // else if(!rx_ok)
                // dataout <= 0;
        end
    end
    
    always @ (posedge clk)
    begin
        if(!rst_n)
            rx_ok <= 0;
        else if(receive)
        begin
            if(cnt >= 137)   //137-169
                rx_ok <= 1;
            else 
                rx_ok <= 0;
        end
        else 
            rx_ok <= 0;
    end
    
    
    //起始位+8位数据+奇偶校验位+停止位 = 11 * 16 = 176位
    
    always @(posedge clk)
    begin
        if(!rst_n)
            dataout_buf <= 8'h00;
        else if(receive)
        begin
            case (cnt)      //中间采样
                8'd8: dataout_buf[0] <= rx;         //起始位=0
                8'd24: dataout_buf[1] <= rx;        //LSB低位在前
                8'd40: dataout_buf[2] <= rx;
                8'd56: dataout_buf[3] <= rx;
                8'd72: dataout_buf[4] <= rx;
                8'd88: dataout_buf[5] <= rx;
                8'd104: dataout_buf[6] <= rx;
                8'd120: dataout_buf[7] <= rx;
                8'd136: dataout_buf[8] <= rx;       //MSB高位在后
                8'd152: dataout_buf[9] <= rx;       //奇偶校验位
                8'd168: dataout_buf[10] <= rx;      //停止位=1
                default:;
            endcase
        end
    end
    
    endmodule
    

    322639f8886e0bf7da8cd598d5f91d6a.png

    代码工程下载

    • Github工程地址:https://github.com/whik/UART_Demo_Verilog
    • Gitee工程地址:https://gitee.com/whik/UART_Demo_Verilog

    工程包含:

    • my_uart_rx:串口接收1个字节示例程序
    • uart_tx_8bit:串口发送1个字节示例程序
    • uart_tx_demo:串口每隔500ms循环发送0-9字符

    参考资料:

    • 百度百科_TTL电平
    • 一文读懂RS-232与RS-422及RS-485三者之间的特性与区别
    • 工作中经常遇到的232、485、TTL信号

    推荐阅读:

    • 玄铁910是个啥?是芯片吗?
    • Qt平台下使用QJson解析和构建JSON字符串
    • 国产处理器的逆袭机会——RISC-V
    • 真正的RISC-V开发板——VEGA织女星开发板开箱评测
    • 【2019北京国际消费电子博览会】参观总结
    • Qt实现软件自动更新的一种简单方法

    我的博客:www.wangchaochao.top

    或微信扫码关注我的公众号:mcu149

    d6d16d1f7e3394afc5819f5e450a383b.png
    展开全文
  • 串行通信接口8250

    2020-11-21 16:42:12
    1、串行通信的基本概念 1.串行通信:将数据分解成二进制位,用一条信号线一位一位顺序传送。 (1) 优势:用于通信的线路少,远距离通信时可降低成本。 (2) 缺点:通信速度较慢。 (3) 用途:常用于速度要求不高的系统...

    1、串行通信的基本概念

    1.串行通信:将数据分解成二进制位,用一条信号线一位一位顺序传送。
    (1) 优势:用于通信的线路少,远距离通信时可降低成本。
    (2) 缺点:通信速度较慢。
    (3) 用途:常用于速度要求不高的系统间数据传送。
    2. 串行通信收发双方必须解决的6个问题:
    (1) 双方约定以何种速率进行数据收发(波特率);
    (2) 约定采用何种数据格式(帧格式);
    (3) 接收方如何得知一批数据的开始和结束(帧同步);
    (4) 接收方如何从位流中正确采样到位数据(位同步);
    (5) 接收方如何判断收到数据的正确性(数据校验);
    (6) 收发出错时如何处理(出错处理)。
    3. 串行通信的分类(根据同步方式分类)
    (1) 异步通信:把一个字符看作一个独立的信息单元,并且字符出现在数据流中的相对时间是任意的,而每个字符中的各位是以固定的时间传送。
    即:字符内同步,字符间异步。
    串行异步通信的通信协议称为:起止式异步通信协议。
    传输的字符格式:
    在这里插入图片描述
    ① 起始位:采用逻辑0电平作为每个字符开始传送的标志;
    ② 数据位:数据位紧跟着起始位传送。由5~8个二进制位组成,低位先传送;
    ③ 校验位:用于校验是否传送正确;可选择奇检验、偶校验或不传送校验位;
    ④ 停止位:表示该字符传送结束。停止位采用逻辑1电平,可选择1、1.5或2位;
    ⑤ 空闲位:传送字符之间的逻辑1电平,表示没有进行传送。
    (2) 同步通信:以一个数据块(帧)为传输单位,每个数据块附加1个或2个同步字符,最后以校验字符结束。
    最常用的同步通信协议是:高级数据链路控制协议HDLC
    传输格式(一帧):
    在这里插入图片描述
    4. 传输制式:
    在这里插入图片描述
    1、调制解调器

    1. 调制:把数字信号转换为电话线路传送的模拟信号。
    2. 解调:将电话线路的模拟信号转换为数字信号。
    3. 调制解调器:具有调制和解调功能的器件合在一个装置。
      2,8250通用异步接收发送器
      8250是典型的通用异步接收发送器芯片
      在这里插入图片描述
    展开全文
  • UART串行通信

    千次阅读 2017-06-24 11:36:18
    什么是串行通信? 将数据字节分成一位一位的形式在一条传输线上逐位地发送。 优点:成本低,控制复杂。 什么是异步通信? 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方...
  • 主要内容:串行口结构、串行口4 种工作方式、多机...传送数据是以一帧一帧格式进行串行通信(英语:Serial communication)是指在计算机总线或其他数据通道上,每次传输一个位元数据,并连续进行以上单...
  • 串行通信接口

    2014-11-06 16:11:00
    串口概念网上讲比较杂,现在通过下面这样方法来区分它种类: 1、【通过打包/解析正确地传输和接收数据... 串口通讯—同步通信方式 【没有时钟线,应属于通常意义异步串行通信】 面向字符同...
  • 图解CAN总线数据组成和帧格式

    千次阅读 2020-05-18 19:20:26
    CAN 是Controller Area Network 缩写(以下称为CAN),是ISO国际标准化的串行通信协议。CAN 高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。下面就大致介绍一下CAN总线...
  • 为满足建立动态易调整串行通信网络的需求,采用基于盲环境下对通讯波特率和帧格式自动 识别的方法,设计了一种智能串行通信终端。在完成对上位机的通信设置后,该...定可靠、抗扰性能好、可大大提高串行通信的灵活性
  • 文章目录一、基本概念1:异步串行通信2:同步串行通信3:波特率及时钟频率4:串行通信的校验5:数据通信的传输方式二、通用同步异步收发器(USART)1:I/O口说明2:时钟管理3:中断源3:USART帧格式 一、基本概念 ...
  • =================================================================最佳答案:通常,串行通信的格式是8-n-1,即8位数据、无校验、1个停止位。有时为了提高准确度,需要增加一个“奇”校验位或者“偶”校验...
  • 串行通信方式

    千次阅读 2018-11-17 16:37:56
    面向字符的格式:  此时,传送数据和控制信息都必须由规定字符集(如ASCII码)中字符所组成。图中头为1个或2个同步字SYN(ASCII码为16H)。SOH为序始字符(ASCII码为01H),表示标题开始,标题中包含...
  • =================================================================最佳答案:通常,串行通信的格式是8-n-1,即8位数据、无校验、1个停止位。有时为了提高准确度,需要增加一个“奇”校验位或者“偶”校验...
  • 参考链接 单片机串口通信一般是11位,起始位1bit,数据位8bit,校验位1bit, 停止位1bit,串口通信分两种一种是同步通信,一种...最常用“数据格式是(n,8,1): 1、n意思是无“奇偶校验”,即起始位; ...
  • 详解串行通信协议及其FPGA实现

    千次阅读 2019-08-23 20:03:11
    本篇文章介绍,串口协议数据帧格式串行通信的工作方式、电平标准、编码方式及Verilog实现串口发送一个字节数据和接收一个字节数据。 对于MCU串口的发送接收,可能就是1行代码就能实现串口的发送和接收: STM32的...
  • Pb中的串行通信(MSCOMM32.OCX)完全解答版 本文给出一个在PB6中如何采集串行口数据实例 一:问题描述 本文解决是采集磅房磅值读取问题。磅秤和计算机(COM1/COM2)之间使用RS-232标准串行线相连。波特率为1200...
  • 基于多线程方式的串行通信接口数据接收案例 广东职业技术技术学院 欧浩源 1、案例背景 在本博客《【CC2530入门教程-06】CC2530ADC工作原理与应用》中实现了电压数据采集程序设计,传感器模块以每1秒发送一...
  • 根据异步串行通信协议来说,空闲状态是高电平,开始位是以低电平开始,如下图所示 在这里我们选取数据帧的格式位1个起始位,8个数据位,0校验位,1停止位(1+8+0+1) 在串口接收模块中,由于数据帧的定义格式...
  • 参看下图:串行通信的方式包括异步通信和同步通信。异步通信它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,...
  • 文章框架 ...为了让大家在直到你是在给我传数据而不是外面的噪音或者是胡说八道,所以串行数据的各位要组装帧(看正文中的帧格式)。乍一看,这种方式跟并行比肯定慢的一腿。但实际上,多亏了它的稳...
  • 异步通信的特点及信息帧格式:以起止式异步协议为例,下图显示的是起止式一帧数据的格式:图1起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以"起始位"开始,以"停止...
  • 串行异步通信-UART

    千次阅读 2012-09-17 11:05:26
    异步通信的特点及信息帧格式:   以起止式异步协议为例,下图显示的是起止式一帧数据的格式: 起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时...
  • 一种网络的帧格式可能与另一种网络不同,通常使用术语"包"来指一般意义的帧.串行通信的数据格式有面向字符型的数据格式,如单同步,双同步,外同步;也有面向比特型的数据格式,这以帧为单位传输,每帧由六个部分组成,分别...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 168
精华内容 67
关键字:

串行通信的帧格式