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()
# -*- 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