【PyCharm Community Edition】:串口开发

串口开发

安装模块:pyserial

Pyserial 是 Python 中使用串口通信的一个第三方库,使用它可以方便地与设备进行数据交互。

  • 方法1: CMD指令
c 复制代码
pip install pyserial

端口检查:uartDevice

获取串口相关信息:名称,属性等

c 复制代码
import serial.tools.list_ports

while True:
    print("选择使用的串口通道号")
    port_list = list(serial.tools.list_ports.comports())#获取串口列表
    print("可用的COM端口:")
    portNames = []
    for i, p in enumerate(port_list): #枚举串口列表里面的信息,便于提示打印
        portNames.append(p.name)
        print("%d. %s"%(i + 1, p.name))
        print(p)
    #等待外界选择端口序号:
    uartDevice = input().strip() #strip()作用是输入字符串时删除字符串左右两端的空格' '、换行符'\n'、制表符'\t'等
    print(uartDevice)
    try:
        uartDevice = int(uartDevice) #将uartDevice转换成十进制
        if uartDevice <= len(portNames) and uartDevice > 0:
            uartDevice = portNames[uartDevice - 1] #通过数值找出对应的端口名称比如:COM5
            break
        else:
            print("请选择正确的串口通道号")
    except:
        print("请选择正确的串口通道号")
   #这里最终得到uartDevice 的端口名称,比如:COM5

自定义文件:SerialMonitor.py

便于自己使用,可以聚合开发自己的串口服务函数。

c 复制代码
# cython: language_level=3
from serial import *
import time


class SerialMonitor():
    def __init__(self, port: str):#指定带入参数:port(类型为:字符串)
        self.port = port
        self.pwd = "mcu.v4"#与下位机通信时的密码字符

    def open(self):
        print("打开端口%s" % (self.port))
        self.serial = Serial(self.port, 460800, timeout=5)

    def close(self):
        self.serial.close()

    def setup(self):
        self.write()
        time.sleep(5)
        self.write(self.pwd)#发送解密指令
        time.sleep(0.2)
        self.write(self.pwd)
        time.sleep(0.2)
        # result = str(self.serial.read())
        # # command error
        # while len(result) > 0:
        #     self.write("Noch")
        #     time.sleep(0.2)
        #     result = str(self.read())
        # print(f'接收的反馈内容:{result}')

        print("解密成功")
        self.write("log ALL 0")#发送"log ALL 0"字符串
        result = str(self.serial.read())
        # command error
        while '[ALL] -> [OFF]' not in result:#查询想要的字符串下位机反馈:"[ALL] -> [OFF]"
            print('Resp Data is not expected:%s' % result, ' resend cmd:log ALL 0')
            time.sleep(1)
            self.write(self.pwd)
            time.sleep(0.2)
            self.write("log ALL 0")
            time.sleep(0.05)
            result = str(self.read())#读取串口获取的数据,转换成字符串
        print(f'接收的反馈内容:{result}')
        print("屏蔽所有的log成功")
        self.read()

    def read(self):
        return self.serial.read_all()

    def write(self, content: str = ""):
        content = "%s\r\n" % (content)
        content = bytes(content.encode("ascii"))
        # content = content.encode("ascii")
        self.serial.write(content)

    def flush(self):
        self.serial.flushInput()
        self.serial.flushOutput()

导入自定义文件:SerialMonitor.py

打开串口,并发送相关数据

c 复制代码
from SerialMonitor import *

serial = SerialMonitor(uartDevice)#注意uartDevice必须时端口名称,比如COM5
print("打开串口")
serial.open()#打开串口
serial.setup()#里面有一些列自定义操作

延伸阅读

c 复制代码
serial = serial.Serial('COM1', 115200) 打开COM1并设置波特率为115200,COM1只适用于Windows
print serial .portstr 能看到第一个串口的标识
serial.write("hello") 往串口里面写数据
serial.close() 关闭serial 表示的串口
serial.open() 打开串口
data = serial.read(num) 读num个字符
data = serial.readline() 读一行数据,以/n结束,要是没有/n就一直读,阻塞。
serial.baudrate = 9600 设置波特率
print serial 可查看当前串口的状态信息
serial.isOpen() 当前串口是否已经打开
serial.inWaiting() 判断当前接收的数据
serial.flushInput() 清除输入缓冲区数据
serial.flushOutput() 中止当前输出并清除输出缓冲区数据
相关推荐
AiTop1002 小时前
腾讯推出AI CLI工具CodeBuddy,国内首家同时支持插件、IDE和CLI三种形态的AI编程工具厂商
ide·人工智能·ai·aigc·ai编程
该用户已不存在4 小时前
你没有听说过的7个Windows开发必备工具
前端·windows·后端
枫叶落雨2224 小时前
注解参数校验
windows
通达的K4 小时前
Java实战项目演示代码及流的使用
java·开发语言·windows
胡耀超4 小时前
3.Python高级数据结构与文本处理
服务器·数据结构·人工智能·windows·python·大模型
离越词5 小时前
C++day8作业
开发语言·c++·windows
fasewer6 小时前
玄机--windows日志分析
运维·服务器·windows·网络安全
水饺编程8 小时前
Windows 命令行:cd 命令3,当前目录,父目录,根目录
c语言·c++·windows·visual studio
android_xc9 小时前
Android Studio适配butterknife遇到的坑
android·ide·android studio·butterknife