Python串口通信模块PySerial使用教程(CH340 USB TTL转接芯片)

2023-11-02

1. CH340 USB TTL介绍

TTL 一般是从单片机或者芯片中发出的电平,高电平为 5V(51单片机)或者 3.3V(STM32)。USB 转 TTL 模块的作用就是把电平转换到双方都能识别进行通信。

单片机通信接口的电平逻辑和 PC 机通信接口的电平逻辑不同,PC 机上的通信接口有 USB 接口,相应电平逻辑遵照 USB 原则;还有 DB9 接口(九针口),相应电平逻辑遵照 RS-232 原则。

单片机上的串行通信通过单片机的 RXD、TXD、VCC、GND 四个引脚,相应电平逻辑遵照 TTL 原则。

USB 是一种串口(串口是一大类接口,包括但不仅限于 RS232),它拥有复杂的通讯协议,支持热插拔,并可以以非常快的速度传输数据。串口,是指 RS232 串口,这是一种几乎没有协议的传输接口,可以直接收发数据。

USB 转 TTL 串口模块是一个非常实用的工具,可以测试模块的 UART 串口通信和通过单片机的 UART 接口给单片机等下载程序。能够在电脑上的串口助手软件非常直观的显示出串口设备返回的数据以及发送相应的控制数据给串口设备。常见的有 CP2102、PL2303、FT232、CH340 等串口芯片方案的 USB 转串口模块。以下以 CH340 串口模块为例,对其进行自检测试。

  • 串口发送工作原理:串口应用发送数据 -> USB 串口驱动获取数据 -> 驱动将数据经过 USB 通道发送给 USB 串口设备 -> USB 串口设备接收到数据通过串口发送
  • 串口接收工作原理:USB 串口设备接收串口数据 -> 将串口数据经过 USB 打包后上传给 USB 主机 -> USB 串口驱动获取到通过 USB 上传的串口数据 -> 驱动将数据保存在串口缓冲区提供给串口应用读取

我们打开串口调试工具,将 CH340 USB TTL 模块的 TXDRXD 引脚短接(用同一跟线接在一起,这样相当于自己给自己发送信息),然后插入电脑,打开设备管理器,确保电脑已经识别到端口(USB-SERIAL CH340 (COM4)),注意 COM4 后面的数字可能是随机的,不一定是这个端口。

尝试给自己发送信息,选择所设置好的串口,打开串口,输入并发送文字,查看是否收到,或收到的字符是否一致,如果能自收自发数据,且收发数据一致,就说明驱动配置完成,并且模块功能完整:

在这里插入图片描述

注意事项:

  • CH340 模块插在 USB2.0 口时,5V 排针输出口电流只有 500MA 左右,如过要接的功率比较的大模块建议接 USB3.0 或者给大功率模块单独外接电源且共地;
  • 切勿将 VCCGND 短接,否则会烧坏模块,发现插上后模块灯不亮货模块发烫严重请立即拔掉检测是否接反或短路。

2. PySerial教程

串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。

PySerial 模块封装了 Python 对串口的访问,为多平台的使用提供了统一的接口。它支持 Windows、Linux、OSX、BSD 等多个平台。如果要使用 PySerial 模块,首先必须保证 Python 版本高于 Python 2.7 或者 Python 3.4。另外,如果你是用的是 Windows 系统,那必须使用 Win7 及以上的版本。

首先我们安装 PySerial:

pip install pyserial

(1)确定电脑是否有可用的串口,并确定可用串口的串口号

import serial
import serial.tools.list_ports

ports_list = list(serial.tools.list_ports.comports())  # 获取所有串口设备实例
if len(ports_list) <= 0:
    print("无可用的串口设备!")
else:
    print("可用的串口设备如下:")
    for port in ports_list:  # 依次输出每个设备对应的串口号和描述信息
        print(list(port)[0], list(port)[1])  # COM4 USB-SERIAL CH340 (COM4)

(2)打开与关闭串口

serial.Serial 的参数如下:

  • port:串口名字(COMn 或者 /dev/ttyUSB)或者 None
  • baudrate (int):波特率,比如9600或者115200;
  • bytesize:数据位数,可能的参数值有:FIVEBITSSIXBITSSEVENBITSEIGHTBITS
  • parity:奇偶校验,可能的参数值:PARITY_NONEPARITY_EVENPARITY_ODDPARITY_MARKPARITY_SPACE
  • stopbits:停止位的比特数,可能的参数值:STOPBITS_ONESTOPBITS_ONE_POINT_FIVESTOPBITS_TWO
  • timeout (float):设置 PySerial 持续读取数据的最长时间(单位:秒);
  • xonxoff (bool):是否启动软件流控制;
  • rtscts (bool):是否启动硬件(RTS/CTS)流控制;
  • dsrdtr (bool):是否启动硬件(DSR/DTR)流控制;
  • write_timeout (float):设置 PySerial 最长写入串口数据的时间(单位:秒);
  • inter_byte_timeout (float):字符间超时,没有则禁止(默认禁止);
  • exclusive (bool):设置独占访问模式(仅 POSIX)。 如果端口已经以独占访问模式打开,则不能以独占访问模式打开端口。

异常返回值如下:

  • ValueError:如果一些参数不在允许参数内,则返回 ValueError,比如波特率设置;
  • SerialException:如果设备无法被找到或者被设置,则返回 SerialException
ser = serial.Serial("COM4", 115200)  # 打开COM4,将波特率配置为115200,其余参数使用默认值
if ser.isOpen():  # 判断串口是否成功打开
    print("串口成功打开")
    print(ser.name)  # 输出串口号,即COM4
else:
    print("串口打开失败")

ser.close()  # 关闭串口
if ser.isOpen():  # 判断串口是否关闭
    print("串口未关闭")
else:
    print("串口已关闭")

(3)发送与接收数据

注意:timeout 参数会影响到 read() 函数的使用,这个 timeout 参数非常重要,直接影响到我们对串口数据的读取。

  • timeout = None:一直等待,直到设置的接收字节数满后退出;
  • timeout = 0:非阻塞模式,在任何情况下都立即返回,返回零或更多,最多为请求的字节数;
  • timeout = x:当请求的字节数可用时,将 timeout 设置为 x 秒(允许浮动)立即返回,否则等待超时到期,并返回在此之前收到的所有字节。
# 打开COM4,将波特率配置为115200,读超时时间为1秒
ser = serial.Serial(port="COM4", baudrate=115200, timeout=1)

# 串口发送数据ABC123,并输出发送的字节数
write_len = ser.write("ABC123".encode('utf-8'))  # 可以指定encode
print(f"串口共发出{write_len}个字节")  # 串口共发出6个字节

while True:
    com_input = ser.read(10)  # 每次读10字节的数据,可以指定decode:ser.read().decode()
    if com_input:   # 如果读取结果非空,则输出
        print(com_input)  # b'ABC123'
        print(com_input.decode('utf-8'))  # ABC123
    else:
        break

ser.close()

(4)实战测试传送文件数据

with open('../images/sonar_images/seg_height15_txt_01(compressed)/20210108_142207_01_XTF/8_15height.lz', 'rb') as f:  # 可以用编码'ISO-8859-1'
    file = f.read()
    print(file)

    ser = serial.Serial(port="COM4", baudrate=115200, timeout=1)
    write_len = ser.write(file)
    print(f"串口共发出{write_len}个字节")

    print(ser.in_waiting)  # input buffer中缓存字节数
    while True:
        com_input = ser.read(write_len)  # 读取所有字节
        if com_input:  # 如果读取结果非空,则输出
            print(com_input)
        else:
            break

    ser.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python串口通信模块PySerial使用教程(CH340 USB TTL转接芯片) 的相关文章

  • 为什么我的混淆矩阵只返回一个数字?

    我正在做二元分类 每当我的预测等于事实时 我发现sklearn metrics confusion matrix返回单个值 难道没有问题吗 from sklearn metrics import confusion matrix print
  • McNemar 在 Python 中的测试以及分类机器学习模型的比较 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有用 Python 实现的好的 McNemar 测试 我在 Scipy stats 或 Scikit
  • 如何为未捕获的异常处理程序编写单元测试

    我有一个函数可以捕获uncaught例外情况 如下 有没有办法编写一个单元测试来执行uncaught exception handler 功能正常 但测试正常退出 import logging def config logger logge
  • 尝试从网页Python和BeautifulSoup获取编码

    我试图从网页检索字符集 这会一直改变 目前我使用 beautifulSoup 来解析页面 然后从标题中提取字符集 这工作正常 直到我遇到一个网站 到目前为止 我的代码以及与其他页面一起使用的代码是 def get encoding soup
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • 以类型化内存视图作为成员的结构定义

    目前我正在尝试让一个具有类型化内存视图的结构能够工作 例如 ctypedef struct node unsigned int inds 如果 inds 不是内存视图 据我所知 它可以完美地工作 然而 通过内存视图并使用类似的东西 def
  • 将 pandas 剪切操作转换为常规字符串

    我明白了 pandas cut 操作的输出 0 0 20 1 0 20 2 0 20 3 0 20 4 0 20 5 0 20 6 0 20 7 0 20 8 0 20 9 0 20 如何将 0 20 转换为 0 20 我正在这样做 str
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • 如何使用 Homebrew 在 Mac 上安装 Python 2 和 3?

    我需要能够在 Python 2 和 3 之间来回切换 我如何使用 Homebrew 来做到这一点 因为我不想弄乱路径并陷入麻烦 现在我已经通过 Homebrew 安装了 2 7 我会用pyenv https github com yyuu
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提
  • numpy:如何连接数组? (获得多个范围的并集)

    我使用Pythonnumpy 我有一个 numpy 索引数组a gt gt gt a array 5 7 12 18 20 29 gt gt gt type a
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • 基于值而不是类型的单次调度

    我在 Django 上构建 SPA 并且有一个庞大的功能 其中包含许多功能if用于检查我的对象字段的状态名称的语句 像这样 if self state new do some logic if self state archive do s
  • 使用 selenium 和 python 来提取 javascript 生成的 HTML?萤火虫?

    这里是Python新手 我遇到的是数据收集问题 我在这个网站上 当我用 Firebug 检查我想要的元素时 它显示了包含我需要的信息的源 然而常规源代码 没有 Firebug 不会给我这个信息 这意味着我也无法通过正常的 selenium
  • 如何通过函数注释指示函数需要函数作为参数,或返回函数?

    您可以使用函数注释 http www python org dev peps pep 3107 在python 3中指示参数和返回值的类型 如下所示 def myfunction name str age int gt str return
  • 根据多个阈值将 SciPy 分层树状图切割成簇

    我想将 SciPy 的树状图切割成多个具有多个阈值的簇 我尝试过使用 fcluster 但它只能削减一个阈值 例如 这是我从另一个问题中摘取的一段代码 import pandas data pandas DataFrame total ru
  • 仅允许正小数

    在我的 Django 模型中 我创建了一个如下所示的小数字段 price models DecimalField u Price decimal places 2 max digits 12 显然 价格为负或零是没有意义的 有没有办法将小数

随机推荐