赞
踩
MCU如果要说话需要约定一定的规则,这些规则,我们称为通信协议
常见的有UART,I2C,SPI
硬件外设? 因为这些通信协议相对简单,我们也可以使用软件模拟这些通讯协议,实现通讯的功能。
通用异步收发传输器(串口)
通用的串行,异步通讯协议
定义了两根数据线,可以实现全双工的收发
串行:用于形容每次传输一位元数据的通信方式
并行:用于形容每次传输多位元数据的通讯方式
异步:通讯双方不需要共同的时钟
也就是接收方不知道发送方什么时候发送
所以说在发送的信息中就要有提示接收方开始接受的信息,如开始位
同时在结束时需要停止位
同步:双方有共同的时钟,常由主机或同一个时钟源提供
全双工:指通讯允许数据在两个方向上同时传输
半双工:通讯允许数据在两个方向上但无法同时传输
单工:通讯允许数据在一个方向上传输
工作原理:约定好通讯的波特率,然后将数据一位位地进行传输
UART时序图
起始位:先发起一个逻辑“0”信号,表示传输字符开始
数据位:紧接着起始位之后,数据位的个数可以为4,5,6,7,8等,构成一个字符
通常采用ASCII码,从最低位开始传输,靠时钟定位
奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传输的正确性
停止位:是一个字符数据的停止标志。
空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送
UART还有一个重要的参数为:
波特率:是衡量数据传输速率的指标。表示每秒钟传输的符号数
例如每8bit代表一个符号,数据传送速率为1200字符/秒,则波特率则是1200baud,比特率是120*8= 9600bit/s
硬件流量控制:添加两个引脚RTS和CTS
为什么要添加这两个流量控制引脚?
因为两个设备通过串口通信时,两者处理速度不同,可能造成丢失数据
如台式机与单片机之间的通讯,接收端接收数据缓冲区已满,则此时还接收到发送来的
数据就可能造成丢失。使用流控制后,可以有效的避免这种情况的发生
官方提供框图
简化流程图:
事先说明UART是全双工的,可以同时进行接收和发送
这里是为了好理解,单独拿出讲
发送流程图
- APB总线可以访问状态/控制寄存器, 并将需要发送的信息存入发送FIFO存储器
- 波特率生成器从APB总线和寄存器块中获取波特率分频因子,产生内部时钟-Baud16,频率为波特率的16倍
- UART发送器受到状态/控制寄存器控制,以Baud16为时钟源将发送FIFO存储器中的内容逐个发送
- FIFO状态和中断生成器会根据FIFO存储器生成对应的FIFO标志位和中断信号
接收流程图
- UART接收器受到状态/控制寄存器控制,以Baud16为时钟源,将接收到的信息存入接收FIFO存储器中
- APB总线可以通过读取接收FIFO获取读取值
machine.UART为UART对象构造函数,作用为初始化对应通道和引脚. D 第一个参数id为使用UART通道,可为0或者1
第二个参数baudrate为使用波特率
第三个参数bits为数据位长度(现阶段仅8位有效)
第四个参数parity为是否使用奇偶校验位
第五个参数stop为停止位长度
第六和第七个参数tx和rx 为收发引脚,应为Pin对象
readinto函数,将读取字符串存入指定缓存中 buf用于指定缓存 nbytes和上文中read函数nbytes作用一致
可以看到Pico - Eval -Board GPIO0和GPIO引脚连接到了板载USB to UART芯片
CP2102的UART的RXD和TXD使用CP2102与PICO进行UART通讯
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()
在串口助手中使用相同的波特率。找到对应的COM口
微雪PICO教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。