当前位置:   article > 正文

微雪树莓派PICO笔记——5. UART (异步收发传输器)_pico uart

pico uart

通讯协议

MCU如果要说话需要约定一定的规则,这些规则,我们称为通信协议
常见的有UART,I2C,SPI

硬件外设? 因为这些通信协议相对简单,我们也可以使用软件模拟这些通讯协议,实现通讯的功能。

UART

通用异步收发传输器(串口)

通用的串行,异步通讯协议

定义了两根数据线,可以实现全双工的收发

串行:用于形容每次传输一位元数据的通信方式
并行:用于形容每次传输多位元数据的通讯方式
![[Pasted image 20220923205452.png]]

异步:通讯双方不需要共同的时钟

也就是接收方不知道发送方什么时候发送

所以说在发送的信息中就要有提示接收方开始接受的信息,如开始位

同时在结束时需要停止位

同步:双方有共同的时钟,常由主机或同一个时钟源提供
![[Pasted image 20220923205925.png]]

全双工:指通讯允许数据在两个方向上同时传输
半双工:通讯允许数据在两个方向上但无法同时传输
单工:通讯允许数据在一个方向上传输

UART详解

工作原理:约定好通讯的波特率,然后将数据一位位地进行传输

UART时序图

  • 起始位:先发起一个逻辑“0”信号,表示传输字符开始
    ![[Pasted image 20220923210459.png]]

  • 数据位:紧接着起始位之后,数据位的个数可以为4,5,6,7,8等,构成一个字符
    通常采用ASCII码,从最低位开始传输,靠时钟定位
    ![[Pasted image 20220923210717.png]]

  • 奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传输的正确性![[Pasted image 20220923211322.png]]

  • 停止位:是一个字符数据的停止标志。

    • 可以是1位,1.5位,2位的电平
    • 由于数据是在传输线上是定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现小小的不同步
    • 因此停止位不仅仅是表示传输的结束,并且提供校正时钟的机会
    • 停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢
      ![[Pasted image 20220923211306.png]]
  • 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送

UART还有一个重要的参数为:
波特率:是衡量数据传输速率的指标。表示每秒钟传输的符号数
例如每8bit代表一个符号,数据传送速率为1200字符/秒,则波特率则是1200baud,比特率是120*8= 9600bit/s
![[Pasted image 20220923211735.png]]

RP2040 UART参数

![[Pasted image 20220923211922.png]]

硬件流量控制:添加两个引脚RTS和CTS

  • RTS(Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效
  • CTS(Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效

为什么要添加这两个流量控制引脚?
因为两个设备通过串口通信时,两者处理速度不同,可能造成丢失数据
如台式机与单片机之间的通讯,接收端接收数据缓冲区已满,则此时还接收到发送来的
数据就可能造成丢失。使用流控制后,可以有效的避免这种情况的发生

UART流程图

官方提供框图
![[Pasted image 20220923212647.png]]

简化流程图:

事先说明UART是全双工的,可以同时进行接收和发送

这里是为了好理解,单独拿出讲

  • 发送流程图
    - ![[Pasted image 20220923212921.png]]

     - APB总线可以访问状态/控制寄存器, 并将需要发送的信息存入发送FIFO存储器
     - 波特率生成器从APB总线和寄存器块中获取波特率分频因子,产生内部时钟-Baud16,频率为波特率的16倍
          - UART发送器受到状态/控制寄存器控制,以Baud16为时钟源将发送FIFO存储器中的内容逐个发送
     - FIFO状态和中断生成器会根据FIFO存储器生成对应的FIFO标志位和中断信号
    
    • 1
    • 2
    • 3
    • 4
  • 接收流程图
    - ![[Pasted image 20220923213640.png]]

     - UART接收器受到状态/控制寄存器控制,以Baud16为时钟源,将接收到的信息存入接收FIFO存储器中
     - APB总线可以通过读取接收FIFO获取读取值
    
    • 1
    • 2

函数详解

  • machine.UART(id,baudrate=115200,bits=8,parity=None,stop=1,tx=None,rx=None):
    • UART对象构造函数,作用为初始化对应通道和引脚.
    • id:使用UART通道,可为0或者1;
    • baudrate: 波特率参数
    • bits:数据位长度(现阶段仅8位有效)
    • parity:奇偶校验位
    • stop:停止位长度
    • tx:TXD引脚,应为Pin对象
    • rx:RXD引脚,应为Pin对象

machine.UART为UART对象构造函数,作用为初始化对应通道和引脚. D 第一个参数id为使用UART通道,可为0或者1

第二个参数baudrate为使用波特率

第三个参数bits为数据位长度(现阶段仅8位有效)

第四个参数parity为是否使用奇偶校验位

第五个参数stop为停止位长度

第六和第七个参数tx和rx 为收发引脚,应为Pin对象

  • UART.any():
    • any函数,用于检测当前接收缓冲区是否有数据,接收缓冲区有数据就返回1,否则返回0.
  • UART.read([nbytes]):
    • read函数,用于读取字符串。
    • nbytes:如果指定了’nbytes,则最多读取这么多字节,否则读取尽可能多的数据。
  • UART.readline()
    • readline函数,读取一行,以换行符为结束标志。
  • UART.readinto(buf[, nbytes])
    • readinto:将读取字符串存入指定缓存中
    • buf:用于指定缓存
    • nbytes:如果指定了’nbytes,则最多读取这么多字节,否则读取尽可能多的数据。

readinto函数,将读取字符串存入指定缓存中 buf用于指定缓存 nbytes和上文中read函数nbytes作用一致

  • UART.write(buf)
    • write函数,用于发送字符串,返回值发送的字节数。
    • buf: 发送字符串 write函数用于发送字符串,并返回发送的字节数。 参数buf为需要发送的字符串
  • UART.sendbreak()
    • sendbreak函数在总线上发送停止信号(拉低总线13bit时间)。 这会将总线驱动为低电平的时间比字符正常传输所需要的时间更长。

例程地址

MicroPython源码

码代码

  • Pico - Eval - Board 1
  • USB to MISCROUSB 数据线 2

可以看到Pico - Eval -Board GPIO0和GPIO引脚连接到了板载USB to UART芯片
CP2102的UART的RXD和TXD使用CP2102与PICO进行UART通讯
![[Pasted image 20220923214849.png]]

from machine import UART,Pin
import utime



uart = UART(0,baudrate=115200,tx=Pin(0),rx=Pin(1))
led = Pin(25,Pin.OUT)
uart.write("Waveshare Uart Test\r\n")
uart.write("Please enter character 0 or 1 to switch the LED on and off\r\n")
while True: 
     # 判断是否收到信息
     if uart.any() == True:
        buf=uart.read(1)
        if buf == b'1':
             led.on()
             print("LED ON")
             uart.write("LED ON\r\n")
        elif buf == b'0':
             led.off()
             print("LED OFF")
             uart.write("LED OFF\r\n")
        else:
             print("Please enter character 0 or 1 to switch the LED on and off\r\n") 
     utime.sleep_ms(1)
     #machine.reset()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在串口助手中使用相同的波特率。找到对应的COM口
微雪PICO教程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/411374
推荐阅读
相关标签
  

闽ICP备14008679号