一、简述



    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART)。常用的是串行异步收发协议,其原理是将传输线上的二进制一位一位地顺序传输。UART的通信线路简单,只需要三根线即可实现两个设备之间的传输,但是传输速率是最慢的。当然两个设备使用UART串口通讯时,必须先约定好传输速率和一些数据位。



 



二、连接方式



  • TX:发送数据端,要接对面设备的RX
  • RX:接收数据端,要接对面设备的TX
  • GND:保证两设备共地,有统一的参考平面(对于软件来说这部分不需要关心,这里已经是连接好的,只需要关注RX和TX即可)

        

android实现HID通讯 android uart通讯_android实现HID通讯


 


三、通讯协议


    1、数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,8个数据位,1个结束位),则其传送的波特率为10×120=1200位/秒=1200波特。


 


    2、如下是工作模式


         

android实现HID通讯 android uart通讯_数据_02


        对应的含义如下:


  • 起始位(启动):发送方先发出一个逻辑”0”信号,表示传输字符的开始。
  • 数据位:可以是5~9位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。先发送最低位最后发送最高位(小端传输)。
  • 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)   ————也可以没有校验位
  • 无校验(no parity)
  • 奇校验(odd parity):如果数据位中’1’的数目是偶数,则校验位为’1’,如果’1’的数目是奇数,校验位为’0’。
  • 偶校验(even parity):如果数据为中’1’的数目是偶数,则校验位为’0’,如果为奇数,校验位为’1’。
  • mark parity:校验位始终为1
  • space parity:校验位始终为0
  • 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
  • 空闲位:UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平。

  注:


            ☆ 波特率:数据传输速率使用波特率来表示,单位bps(bits per second),常见的波特率9600bps,115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us。


            ☆ 该异步通信是按字符传输的,接收设备在收到起始信号后,只要在一个字符的传输时间内能和发送设备保持同步就能正确的接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送方与接收方时钟能够同步)。例如我们手机抓取串口log时,一般使用的是115200bps,手机是设定好的,PC端抓取的时候如果不是这个波特率就会出现乱码,就是因为时钟不同步,导致接收到的数据错位,无法解析成我们想要的数据。


            ☆ 比特率:指的是1,0的信号bit速率。而波特率指的是码元的速率。因为有些编码协议标准中,并非只有0和1,如五级编码就是+-1,+-0.5以及0五个电平码元,每一个电平码元变化代表2个比特位的数据信息,这种情况的比特率就是波特率的一倍,如果一个码元代表的是10bit的信息,则比特率是波特率的10倍。当然如果协议是每个码元只代表0和1的,那比特率是等于波特率


 


四、实例


    

android实现HID通讯 android uart通讯_android实现HID通讯_03


 


    上图是uart协议传输一个“A”字符通过示波器的uart解码而得到的波形示意图。根据此图来介绍一下uart的一些基本参数。


  • 比特率:通过上面注释中的解释就可以明白,这里码元只有0和1,所以比特率和波特率是对等的。一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。
  • 起始位:可以看到是 “0”
  • 数据位:可以选择的值有5,6,7,8这四个值,可以传输这么多个值为0或者1的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是ASCII值时一般解析肯定会出问题。一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。
  • 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输“A”(01000001)为例。
  • 当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。图-1的波形就是这种情况。
  • 当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。
  • 此位还可以去除,即不需要奇偶校验位。
  • 停止位:它是一帧数据的结束标志。可以是1bit、1.5bit、2bit的空闲电平。可能大家会觉得很奇怪,怎么会有1.5位~没错,确实有的。所以在生成此uart信号时用两个波形点来表示一个bit。
  • 空闲位:没有数据传输时线路上的电平状态。为逻辑1。
  • 传输方向:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输“A”如果是MSB那么就是01000001(如上图),如果是LSB那么就是10000010(如下图)。uart传输数据的顺序就是:刚开始传输一个起始位,接着传输数据位,接着传输校验位(可不需要此位),最后传输停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。

          

android实现HID通讯 android uart通讯_android实现HID通讯_04


  • 帧间隔:即传送数据的帧与帧之间的间隔大小,可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。比如传送”A”完后,这为一帧数据,再传”B”,那么A与B之间的间隔即为帧间隔。

 


五、代码相关


    uart详细的代码结构可以参考如下的讲解:  


    以串口log为例。我们使用的TX:18  RX:19。


    对应原理图:


    

android实现HID通讯 android uart通讯_比特率_05


    代码里配置信息


 


        

android实现HID通讯 android uart通讯_android实现HID通讯_06

  

android实现HID通讯 android uart通讯_码元_07