张高兴的 MicroPython 入门指南:(三)使用串口通信

目录
  • 什么是串口
  • 使用方法
  • 使用板载串口相互通信
    • 硬件需求
    • 电路
    • 代码
  • 使用板载的 USB 串口
  • 参考

什么是串口

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

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

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

使用方法

使用 MicroPython 控制 GPIO 要使用 machine 包中的 UART 类。

from machine import UART

通过构造函数实例化获取串口对象。

UART(id: int, baudrate: int = 115200, ...)
  • id 指串口的编号。对于 Pico 而言只能是 0 或 1。
  • baudrate 用于设置波特率。
  • txrx 参数指定要使用的 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 上有两组串口 UART0UART1,因此可以使用这两组串口相互通信。

硬件需求

名称数量
杜邦线若干

电路

  • 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 sysled = 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")elseled.value(0)print("LED OFF")

参考

  1. Universal asynchronous receiver-transmitter - Wikipedia:https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter
  2. Serial Communication - Wikipedia:https://en.wikipedia.org/wiki/Serial_communication
  3. BASICS OF UART COMMUNICATION:http://www.circuitbasics.com/basics-uart-communication/
  4. 波特率 - 百度百科:https://baike.baidu.com/item/波特率
  5. MicroPython documentation:https://docs.micropython.org/en/latest/library/machine.UART.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识c++(string和模拟实现string)

一、标准库中的string类 string类的文档介绍:cplusplus.com/reference/string/string/?kwstring 1、auto和范围for auto: 在早期C/C中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个 不重…

Cannot perform upm operation: connect ETIMEDOUT 34.36.199.114:443 [NotFound]

版本:Unity 2018 Windows 问题:打开 Package Manager,加载报错 尝试解决: 删除项目文件里的Packages下的mainfest.json文件,然后重新打开项目(X)重新登录 Unity 账号(X&#xff09…

Kotlin 协程 — 基础

Kotlin 协程 — 基础 协程已经存在一段时间了,关于它的各种文章也很多。但我发现想要了解它还比较费时,所以我花了一段时间才真正理解了协程的基础知识以及它的工作原理。因此,我想分享一些我理解到的内容。 什么是协程? 协程代表…

vue项目实战速查记录

1.图片下载到本地 2.本地静态文件访问 3.元素大小相同,相互覆盖 1.图片下载到本地 实现原理:创建a标签,利用a标签下载属性. download(){const link document.createElement(a);link.href "图片地址";link.setAttribute(download, name);document.body.ap…

读论文《Hi-Net: Hybrid-fusion Network for Multi-modalMR Image Synthesis》

论文题目:Hi-Net:用于多模态磁共振图像合成的混合融合网络 论文地址:arxiv 项目地址:github 原项目可能在训练的时候汇报version的错,这是因为生成器和辨别器的优化有些逻辑错误,会改的话多加一个生成操作可以解决&…

React 学习——条件渲染、遍历循环、事件绑定

React特点: 声明式的设计高效,采用虚拟DOM来实现DOM的渲染,最大限度减少DOM的操作灵活,跟其他库灵活搭配使用JSX,俗称JS里面写HTML,JavaScript语法的扩展组件化,模块化,代码容易复用…

pdf的下载,后端返回工作流,前端进行转换

前端将后端返回的工作流进行转换 项目中接触到了pdf的下载和预览的功能,记录一下~ 这里pdf的下载和预览的接口,后端返回的数据结构与其他的接口返回的数据结构有点不同,是直接返回的工作流,在控制台接口的响应预览内容大致是这样…

初学MySQl简单sql语句(1)

目录 SQL语句介绍: DDL创建数据库: char和varchar比较 数值类型 数据库存储引擎 数据库存储引擎——InnoDB 数据库存储引擎——MyISAM 数据库存储引擎-MyISAM 和InnoDB区别 修改和删除数据库表 数据库设计三大范式 一、什么是范式 二、约束作…

css实战案例1:顶部搜索

代码样式&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><div class"search_box"><!-- 搜索框--><div class"search">搜索…

【Linux】网络基础_2

文章目录 十、网络基础2. IP地址和MAC地址3. 端口号端口号和进程ID 4. 网络字节序 未完待续 十、网络基础 2. IP地址和MAC地址 IP协议有两个版本&#xff0c;IPv4和IPv6&#xff0c; 用的比较多的都是IPv4。IP地址是在IP协议中&#xff0c;用来标识网络中不同主机的地址&…

如何发现快速发现分析生产问题SQL

Performance Schema介绍 Performance Schema提供了有关MySQL服务器内部运行的操作上的底层指标。为了解释清楚Performance Schema的工作机制&#xff0c;先介绍两个概念。 第一个概念是程序插桩&#xff08;instrument&#xff09;。程序插桩在MySQL代码中插入探测代码&#xf…

基本聚集函数和case的应用

文章目录 1.基本聚集函数(1)基本聚集函数的介绍(2)使用基本聚集函数的简单例子&#xff08;1&#xff09;查询最大年龄&#xff0c;最小年龄年龄和平均年龄<1>最大年龄<2>最小年龄<3>平均年龄 (2&#xff09;配合上where语句&#xff0c;查询女士的平均年龄(…

JAVA笔记十四

十四、集合 1.集合概述 (1)集合是存储其它对象的特殊对象&#xff0c;可以将集合当作一个容器 (2)集合的相关接口和类位于java.util包中 (3)集合中的接口和类是一个整体、一个体系 2.集合接口 接口定义了一组抽象方法&#xff0c;实现该接口的类需要实现这些抽象方法&…

Docker核心技术:Docker原理之Cgroups

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Cgroups&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1a;…

C++初学者指南-5.标准库(第一部分)--标准库最小/最大算法

C初学者指南-5.标准库(第一部分)–标准库min/max算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库min/max算法minmaxminmaxclamp (C17)min_elementmax_elementminmax_element相关内容 C标准库算法是一块新领域&#xff1f;⇒简短介绍 min min(a, b) → a 如果 a < b则…

Linux_实现UDP网络通信

目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 recvfrom 1.4 sendto 1.5 服务器代码 2、实现客户端的逻辑 2.1 客户端代码 3、实现通信 结语 前言&#xff1a; 在Linux下&#xff0c;实现传输层协议为UDP的套接字进行网络通信&#xff0c;网络层协议为IPv4&am…

k8s+containerd(kvm版)

k8s&#xff08;Kubernetes&#xff09;是由Gogle开源的容器编排引擎&#xff0c;可以用来管理容器化的应用程序和服务&#xff0c;k 高可用&#xff1a;系统在长时间内持续正常地运行&#xff0c;并不会因为某一个组件或者服务的故障而导致整个系统不可用可扩展性&#xff1a…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

爬虫学习3:爬虫的深度爬取

爬虫的深度爬取和爬取视频的方式 深度爬取豆瓣读书 import time import fake_useragent import requests from lxml import etree head {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 …

陶德:边种田边写代码,3年300万行,一个人写出了“国产大满贯QT”

这是《开发者说》的第12期&#xff0c;本期我们邀请的开发者是陶德&#xff0c;从小在国企矿山里长大&#xff0c;计算机成绩是文科班里最差的一个&#xff0c;毕业两年找不到工作&#xff0c;睡过公园&#xff0c;讨过剩饭&#xff0c;用打魔兽世界的方式磨炼技术&#xff0c;…