python-Pyserial实现串口通信

目录

  • 一.前言
    • 1.目的
    • 2.准备
  • 二.关于Pyserial
    • 1.简介
    • 2.打开与关闭串口
    • 3.串口状态
    • 4.串口读写
    • 5.指令
  • 三.工程实例
  • 四.参考

一.前言

1.目的

由于普通的舵机不具有记忆功能,在调试arduino六自由度机械臂时很难受,于是添加了遥控控制,通过串口返回各个舵机当前的角度。当实现后,发现每次通过串口调试助手记录舵机角度也很麻烦,所以我想要利用python的串口通信实现接收并保存指定数据到一个文本中,方便后续调用,ta应该具有如下功能:
python-Pyserial实现串口通信_第1张图片

2.准备

CH340,单片机,python3

二.关于Pyserial

1.简介

pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。

安装:pip3 install pyserial
导入:import serial

2.打开与关闭串口

示例:
打开串口

import serial 

def serget(port,bps,time):#port:端口号,bps:波特率,time:超时时间
    try:
        ser = serial.Serial(port, bps, timeout=time)# 打开串口
        print('串口已连接,当前串口:{0}'.format(port))
        print("串口详情参数:", ser)
        return ser
    except Exception as e:  # 如果出现异常
        print("串口连接失败,失败分析:", e)
        
portx = input('输入端口号')  # 例如:端口 = "COM8"
ser = serget(portx,115200,None)

关闭串口

ser.close()  # 关闭串口

3.串口状态

状态 说明
name 设备名
port 端口
baudrate 波特率
bytesize 字节大小
parity 校验位
stopbits 停止位
timeout 读超时
writeTimeout 写超时
interCharTimeout 字符间隔超时
xonxoff 软件流控
rtscts 硬件流控
dsrdtr 硬件流控

使用示例:

print(ser.name)

4.串口读写

指令 说明
open() 打开串口
close() 关闭串口

示例:
读数据

def serload(ser):
    while True:
        if ser.in_waiting:
            str1 = ser.readline().decode('GBK')  # 读一行,以/n结束。
            char1 = print(ser.read(size=1).hex()) # 从串口读size个字节
            print(str1)          

写数据

def serwrite(ser):
    text = input('请输入:')
    ser.write(text.encode("gbk"))  

5.指令

指令 说明
read(size=1) 从串口读size个字节
write(data) 发送data,并返回发送字节数
inWaiting() 返回接收缓存中的字节数
flush() 等待所有数据写出
flushInput() 丢弃接收缓存中的所有数据
flushOutput() 终止当前写操作,并丢弃发送缓存中的数据
sendBreadk(duration=0.25) 发送BREAK条件,并于duration时间之后返回IDLE

三.工程实例

串口将会接到的消息:
python-Pyserial实现串口通信_第2张图片
将通过python接收串口数据,并将每次接收的当前角度存入指定文本中,也可以向串口发送数据。

import serial, os.path
import serial.tools.list_ports

filename='arduino.txt'

def menu():
    print('功能选择:\n1.获得串口列表\n2.连接串口\n3.读取并筛选数据\n4.读取文本\n5.写入数据\n6.退出')

def comget():
    port_list = list(serial.tools.list_ports.comports())
    print(port_list)
    if len(port_list) == 0:
        print('无可用串口')
    else:
        for i in range(0, len(port_list)):
            print(port_list[i])

def serget(port,bps,time):
    try:
        # 打开串口,并得到串口对象
        ser = serial.Serial(port, bps, timeout=time)
        print('串口已连接,当前串口:{0}'.format(port))
        print("串口详情参数:", ser)
        return ser
    except Exception as e:  # 如果出现异常
        print("串口连接失败,失败分析:", e)
def serload(ser):
    while True:
        if ser.in_waiting:
            data = ser.readline().decode('GBK')  # 读一行
            print(data)
            if data == 'quit':  # 如果读取到quit则退出读取
                break
            elif data.find('当前角度') == 0:  # 如果读取到指定字符则存入文本
                save(data)

def save(savedata):
    try:
        file = open(filename, 'a', encoding='gbk')
    except:
        file = open(filename, 'w', encoding='gbk')

    file.write(str(savedata))
    file.close()

def openfile():
    pass

def serwrite(ser):
    text = input('请输入:')
    ser.write(text.encode("gbk"))  # 写数据

def serclose(ser):
    try:
        ser.close()  # 关闭串口
        print('已关闭串口')
    except Exception:
        print('未启用串口')
if __name__ == '__main__':
    portx = input('输入端口号')  # 端口portx = "COM8"
    ser = serget(portx, 115200, None)
    while True:
        menu()
        choice = input('选择功能:')
        if choice == '1':
            comget()
        elif choice == '2':
            portx = input('输入端口号')  # 端口portx = "COM8"
            ser = serget(portx,115200,None)
        elif choice == '3':
            serload(ser)
        elif choice == '4':
            openfile()
        elif choice == '5':
            serwrite(ser)
        elif choice == '6':
            serclose(ser)
            break
        else:
            print('输入错误,请重新输入')
            continue
    print("程序已正常退出")

四.参考

  1. Pyserial 实例教程详细用法
  2. Python的串口通信(pyserial)
  3. Python3-串口:1 Python3 简单的串口通信实现

你可能感兴趣的:(#,Python,串口通信,python)