python串口

本文介绍如何使用Python进行串口通信,包括查找可用串口、读写串口数据等核心功能,并提供了一个完整的示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.查看串口

import serial
import serial.tools.list_ports

plist = list(serial.tools.list_ports.comports())
print('plist:', plist)
if len(plist) <= 0:
    print("The Serial port can't find!")
else:
    for i in range(len(plist)):
        plist[i] = list(plist[i])
        print(f'plist{[i]}:', plist[i][0:2])
        print(f'plist{[i]}:', plist[i])

        serialName = plist[i][0]
        serial_ = plist[i][1][0:7]
        if serial_ == 'Arduino':
            print(f'you can use this port:{plist[i][1]}')
        serialFd = serial.Serial(serialName, 115200, timeout=0.5)
        # print("check which port was really used >", serialFd.name)

2.读写串口

对ARDUINO进行读写操作

import serial
import serial.tools.list_ports

# 插上Arduino

port_list = list(serial.tools.list_ports.comports())
# 遍历串口
for i in range(len(port_list)):
    port_list[i] = list(port_list[i])
    # print(f'plist{[i]}[0:2]:', port_list[i][0:2])
    # serialName = port_list[i][0]
    serial_ = port_list[i][1][0:7]
    # 返回arduino串口编号
    if serial_ == 'Arduino':
        num = i
        print('Arduino Mega 2560 (COM4)')


class operation_serial:
    def __init__(self, ):
        self.num = num

    def open_serial(self):
        port_list = list(serial.tools.list_ports.comports())
        # 打开串口
        ser = serial.Serial(f'{port_list[self.num][0]}', 115200, timeout=1)
        # print('ser.isOpen():', ser.isOpen())
        # print('port_list[-1][0]:', port_list[self.num][0])
        return ser

    def write_serial(self, ser, data):
        ser.write(data.encode())  # 指定的编码格式编码字符串。默认utf-8

    def off_serial(self, ser):
        ser.close()  # 关闭串口


if __name__ == '__main__':
    print(num)
    o = operation_serial()
    ser = o.open_serial()
    o.off_serial(ser)

写的小测试

'''
phi-[0,2*pi]
theta-[-pi,pi]
'''
from stu.action import Action
from stu.DataID import DataID
import time
from stu.demo_angle_path_data import Write_data
from stu.operation_serial import operation_serial


def main():
    operation = operation_serial()
    # 打开串口详见源文件
    ser = operation.open_serial()
    a = Write_data()
    data = a.build()
    print(data)
    num = len(data)
    for i in range(num):
        # theta1, theta2, phi = data[i]
        theta1, theta2, phi = data[i]
        print('theta1, theta2, phi:', i, '-->', theta1, theta2, phi)
        DataID.theta1 = theta1
        DataID.theta2 = theta2
        DataID.phi = phi
        b = Action()
        data1 = b.action()
        print(data1, '\n')
        # Write(data1)
        len(data1.encode())
        operation.write_serial(ser, data1)
        time.sleep(0.5)
    # time.sleep(20)
    operation.off_serial(ser)
    print('完成写入')


if __name__ == '__main__':
    main()

 这是参考别人的  python 操作 串口https://blog.youkuaiyun.com/xuan530482366/article/details/121421886?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-7-121421886-blog-107040181.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-7-121421886-blog-107040181.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=8

# -*- coding = utf-8 -*-
# @time:2022/7/4 15:08
# Author:
# @File:deno.py
# @Software:PyCharm

import serial
import time
import serial.tools.list_ports
import threading

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])

print(time.time())
##发送
# d=bytes.fromhex('10 11 12 34 3f')
# s.write(d)
# s.close()


DATA = ""  # 读取的数据
DATA_ALL = bytearray(40960)
DATA_LEN = 0
NOEND = True  # 是否读取结束
DATA_IN_FLAG = 0
START_TIME = 0


# 读数据的本体
def read_data(ser):
    global DATA, NOEND, DATA_IN_FLAG, START_TIME, DATA_ALL, DATA_LEN
    START_TIME = time.time()

    # 循环接收数据(此为死循环,可用线程实现)
    while NOEND:
        if ser.in_waiting:
            START_TIME = time.time()
            DATA_IN_FLAG = 1
            length = ser.in_waiting

            DATA = ser.read(length)  # 注意 ser.read了之后 in_waiting马上变成0了

            # DATA_ALL = bytearray(DATA_LEN+length)
            for i in range(0, length):
                DATA_ALL[DATA_LEN + i] = DATA[i]

            # print("DATA_LEN=%d"%(DATA_LEN))
            DATA_LEN += length
            # DATA = ser.read(ser.in_waiting).decode("gbk")
            # print("\n>> receive: ", DATA, "\n>>", end="")
            # print(">>", end="")

            if (DATA == "q"):
                print("oppo seri has closen.\n>>", end="")


        else:
            if DATA_IN_FLAG:
                # print("time.time() - START_TIME = %d \r\n"%(time.time()))
                if time.time() - START_TIME > 0.010:  # 串口超时10ms
                    DATA_PRINT = bytearray(DATA_LEN)
                    for i in range(0, DATA_LEN):
                        DATA_PRINT[i] = DATA_ALL[i]

                    print("\n>> receive: ", DATA_PRINT, "\n>>", end="")
                    START_TIME = time.time()
                    DATA_IN_FLAG = 0
                    DATA_LEN = 0


# 打开串口
def open_seri(portx, bps, timeout):
    ret = False
    try:
        # 打开串口,并得到串口对象
        ser = serial.Serial(portx, bps, timeout=timeout)

        # 判断是否成功打开
        if (ser.is_open):
            ret = True
            th = threading.Thread(target=read_data, args=(ser,))  # 创建一个子线程去等待读数据
            th.start()
    except Exception as e:
        print("error!", e)

    return ser, ret


# 关闭串口
def close_seri(ser):
    global NOEND
    NOEND = False
    ser.close()


# 写数据
def write_to_seri(ser, text):
    res = ser.write(text.encode("gbk"))  # 写
    return res


# 读数据
def read_from_seri():
    global DATA
    data = DATA
    DATA = ""  # 清空当次读取
    return data


if __name__ == "__main__":

    # ser, ret = open_seri("COM4", 115200, None) # 串口com3、bps为115200,等待时间为永久
    # if ret == True: # 判断串口是否成功打开
    #     count = write_to_seri(ser, "exit")
    #     print("写入总字节数:", count)

    # 打开一个串口
    port = input("输入串口名:")
    ser, ret = open_seri(port, 115200, None)  # 串口com3、bps为115200,等待时间为永久

    # oprate_lst = {"quit":close_seri}
    # print("操作数字所对应的行为,1:read_from_seri 2:write_to_seri 3:close_seri: ")
    while True:
        text = input(">>")
        write_to_seri(ser, text)
        if text == "q":
            close_seri(ser)
            print("bye!")
            break

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值