张高兴的 MicroPython 入门指南:(三)使用串口通信
什么是串口
串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一个概念是并行通信。串行通信是指数据一位一位的按顺序传输,而并行通信则是多位数据同时传输。如下图所示,DATA BUS 到 UART 1 之间是并行通信,UART 1 到 UART 2 之间是串行通信。

串口通信的数据帧格式如下图所示,通常一帧共包括 10 位:1 个起始位,8 个数据位和 1 个停止位。有一些特殊的数据帧在停止位前面包含 1 位的奇偶校验位,还有的停止位有 2 个比特。其中起始位为低电平(0),标志着数据传输的开始;停止位为高电平(1),表示数据帧传输结束;数据位则为实际发送的数据,使用高低电平来表示二进制信息,如果发送的内容是文本,那么这段数据为字符的二进制编码(ASCII、UTF-8等)。数据传输的速率我们使用波特率(Baud Rate)来表示,即每秒钟传送的码元符号的个数。比如数据传输速率为 9600 字符/s,那么这时的波特率为 9600。

设备进行串口通信时,设备的连线如下图所示,两个设备的信号线,即发送端(TXD)与接收端(RXD)交叉相连,并且需要共地。在 Raspberry Pi Pico 的引脚上共引出了 2 组串口,即 UART0 与 UART1。

使用方法
使用 MicroPython 控制 GPIO 要使用 machine 包中的 UART 类。
from machine import UART
通过构造函数实例化获取串口对象。
UART(id: int, baudrate: int = 115200, ...)
id指串口的编号。对于 Pico 而言只能是 0 或 1。baudrate用于设置波特率。tx、rx参数指定要使用的 tx、rx 引脚。parity设置校验位。None无,0偶数,1奇数。stop设置停止位的长度。timeout设置读取超时时间,单位为毫秒。
使用 init() 方法可以修改串口的设置,方法参数与构造函数的参数一致。常见的用法参考下面的例子:
uart0 = UART(0, 9600) # 实例化串口 0,波特率为 9600
uart0.init(115200, bits=8, parity=None, stop=1) # 修改串口 0 设置
uart1 = UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9)) # 实例化串口 1 并指定引脚
实例化串口对象后,使用 write(buf: bytearray) 方法发送数据,发送成功会返回字节数,失败则返回 None。
data = b'hello world'
uart0.write(data)
接收数据使用 read(nbytes: Optional[int] = None) 方法,nbytes 设置接收的字节数,读取成功会返回一个字节对象,读取超时则返回 None。也可以使用 readline() 方法读取一行。
data = bytes()
data = uart0.read(10)
print(data.decode('utf-8')) # 解码成 utf-8 字符串
print(uart0.readline()) # 从串口读取一行
有些时候需要判断串口中有没有数据,可以使用 any() 方法。
while uart0.any() > 0:
print(uart0.readline())
提示
在部分开发板上可以像 GPIO 中断一样,使用串口中断 irq(trigger, priority=1, handler=None, wake=machine.IDLE)
使用 deinit() 方法可关闭串口。
uart0.deinit()
使用板载串口相互通信
Pico 上有两组串口 UART0 与 UART1,因此可以使用这两组串口相互通信。
硬件需求
| 名称 | 数量 |
|---|---|
| 杜邦线 | 若干 |
电路

- UART0 RX(GP1) - UART1 TX(GP4)
- UART0 TX(GP0) - UART1 RX(GP5)
代码
from machine import UART, Pin
import utime
# 初始化串口
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
uart1 = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))
# 串口 1 发送数据
txData = b'hello world'
uart1.write(txData)
utime.sleep_ms(100)
# 串口 2 检测接收数据
rxData = bytes()
while uart0.any() > 0:
rxData += uart0.read(1)
# 解码并打印
print(rxData.decode('utf-8'))
使用板载的 USB 串口
当 Pico 连接到计算机上时,在设备管理器中会新增一个通信端口 COMx,MicroPython 的 REPL 终端就是运行在这个串口之上。那么能使用这个板载 USB 串口传输数据吗?答案是可以的,但与正常串口通信的代码不同,需要使用 select,一个用于异步 I/O 多路复用的模块。将下面的代码烧录到 Pico 中,使用 PuTTY 等串口工具连接 Pico,当 Pico 检测到输入 1 时点亮板载 LED,输入 0 时熄灭。
import machine
import select
import sys
led = machine.Pin('LED', machine.Pin.OUT)
# 获取复用的轮询对象
poll_object = select.poll()
# 将系统标准输入注册为轮询对象
poll_object.register(sys.stdin, 1)
while True:
# 检查 USB 串口输入
if poll_object.poll(0):
# 从 USB 串口中读取
ch = sys.stdin.read(1)
if ch == '1'
led.value(1)
# 向 USB 串口中写入
print("LED ON")
else
led.value(0)
print("LED OFF")
参考
- Universal asynchronous receiver-transmitter - Wikipedia:https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter
- Serial Communication - Wikipedia:https://en.wikipedia.org/wiki/Serial_communication
- BASICS OF UART COMMUNICATION:http://www.circuitbasics.com/basics-uart-communication/
- 波特率 - 百度百科:https://baike.baidu.com/item/波特率
- MicroPython documentation:https://docs.micropython.org/en/latest/library/machine.UART.html
张高兴的 MicroPython 入门指南:(三)使用串口通信的更多相关文章
- Drools规则引擎入门指南(三)——使用Docker部署Workbench
其实本来我也是打算使用Tomcat来部署Workbench的,但是在网上看了几篇文章,超级繁琐的配置.各种版本.实在看不下去了索性就直接使用Docker来部署了.本次部署的版本是最新稳定版,对应dro ...
- require.js入门指南(三)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- kotlin 语言入门指南(三)--编码习惯
这章主要讲当前 kotlin 的一些编码习惯. 命名 如无疑问,kotlin 的命名风格与以下的java风格一样: --驼峰命名法(不要使用下划线) --类名首字母大写 --方法和属性名首字母小写 - ...
- Cortex-M3 入门指南(三):时钟总线与复位时钟控制器
[reset clock control 复位和时钟控制器] 时钟信号对于处理器非常重要,比如我们熟悉的 CPU 就是由时钟信号驱动的,而主频就是内核的的时钟信号频率.Cortex-M3 有着复杂的 ...
- redis入门指南(三)—— 事务、过期时间、SORT命令、消息通知与管道
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 事务 1.redis中的事务由一组命令的集合组成,要么都执行,要么都不执行,同时redis的事务 ...
- 张高兴的 .NET IoT 入门指南:(七)制作一个气象站
距离上一篇<张高兴的 .NET Core IoT 入门指南>系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系 ...
- 分布式服务框架 Zookeeper(三)官方入门指南
入门指南:使用ZooKeeper来协调分布式应用 这篇文档包含了让你快速上手ZooKeeper的信息.主要是针对那些想要试一把ZooKeeper的开发人员,包含了安装一个单一ZooKeeper服务器的 ...
- 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器
时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...
- 【翻译】Fluent NHibernate介绍和入门指南
英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...
- 转 猫都能学会的Unity3D Shader入门指南(二)
猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...
随机推荐
- Vue——计算属性和侦听属性
一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如,有一个嵌套数组对象:我们想根据 author 是否已经有一些书来显示不同的 ...
- Vue3.0极速入门(三) - 登录demo
Talk is cheap, Show the code · 在完成npm和vue的环境安装,并了解了基本的目录和文件结构以后,直接写一个带登录和首页的demo做示例,快速了解一个vue工程的创建和基 ...
- [brief]虚拟机安装UbuntuServer
1.下载Ubuntu--Server镜像官网点击 2.Vmware15.x配置 2G /boot 4G swap(一倍或两倍于分配内存量) rest / or /+/home 3.terminal下安 ...
- github无法访问的问题
Windows10 通过nslookup命令获取GitHub域名服务器地址,然后ping该地址 nslookup github.com ping 域名服务器地址 发现20.205.243.166能稳定 ...
- 开源一站式敏捷测试管理&极简项目管理 itest(爱测试) 6.6.0 发布 ,新增拖拽生成接口测试断言
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...
- GNU GDB
1 说明 本文主要介绍一些简单的.常用的gdb调试技巧. 环境:GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1) 参考文档:<gdb ...
- 机器学习算法(一):1. numpy从零实现线性回归
系列文章目录 机器学习算法(一):1. numpy从零实现线性回归 机器学习算法(一):2. 线性回归之多项式回归(特征选取) @ 目录 系列文章目录 前言 一.理论介绍 二.代码实现 1.导入库 2 ...
- 剑指Offer-57.二叉树的下一个结点(C++/Java)
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 二叉树的中序遍历是左根右,所以如果一个结点的右子 ...
- sqlite3自动插入创建时间和更新时间
最近在记录一些简单的结构化日志信息时,用到了sqlite3数据库(保存的信息比较简单,用Mysql,SQL Server,Postgres这些数据库有点小题大做). 以前开发系统时,用Mysql和Po ...
- Python基础——上节补充及数据类型
1.变量的创建过程 当我们创建一个变量name='oldboy'时,实际上是这样一个过程. 程序先开辟了一个内存空间,把变量的内容放进去,再让变量name指向'oldboy'所在的内存地址. 我们可以 ...