Python 串口通信

Python 串口通信

1.先安装serial库

pip install serial

 

 

 

 

 此时报错,是因为我们库安装错了,吧serial库先卸载

pip uninstall serial

安装正确的库

pip install pyserial

 

 ok,在试试吧

 

打开串口的方式

首先先看端口是多少

 

 Windows上串口名称一般类似COM1,Linux上串口名称一般类似/dev/ttyUSB1

打开方式1,默认参数打开串口

import serial

s = serial.Serial('COM1', baudrate=115200, timeout=0.8)
print(s.is_open)

打开方式2,手动配置串口打开

 
# 第二种手动配置后在打开串口
s = serial.Serial()
s.port = 'COM1'
s.baudrate = 115200
s.timeout = 0.8
print(s.is_open)
s.open()
print(s.is_open)

 

 

import serial

s = serial.Serial()
s.port = 'COM1'
s.baudrate = 115200
s.timeout = 0.8
print(f"串口打开状态: {s.is_open}")
print(f"串口DTR: {s.dtr}")
print(f"串口RTS: {s.rts}")
s.open()
s.dtr = False  # 设置DTR
s.rts = False  # 设置RTS

print(f"串口打开状态: {s.is_open}")
print(f"串口DTR: {s.dtr}")  # 数据终端准备(DTR) 
print(f"串口RTS: {s.rts}")  # 请求发送(RTS)

 

串口的写入

 

 

 

import serial

# 普通AT指令的写入

# 打开串口
# s = serial.Serial(port='COM1', baudrate=115200, timeout=1)
#
# # 使用UTF-8编码,把AT命令转为字节
# at_command = "AT\r".encode('utf-8')
#
# # 串口写入
# num3 = s.write(at_command)
# print(f'写入{num3}字节')


# 控制字符的写入
s2 = serial.Serial(port='COM1', baudrate=115200, timeout=1)


# 找到CTRL+Z对应的ASCII码
ctrl_z_ascii = 0x1A
ctrl_z = chr(ctrl_z_ascii).encode('utf-8')

nums = s2.write(ctrl_z)
print(f"写入 {nums} 字节")

串口的读取

 

 

 

# import serial
#
# s = serial.serial_for_url('loop://', baudrate=115200, timeout=1) # loop:// 为serial内置库debug类型的串口  # 这里填串口名称COM1也是可以的
 # # serial_for_url 可以接收网络形式的串口(socket形式) 
# # s.write(
'0123456789'.encode('utf-8'))
# # data1
=s.read(3) # 默认读取1字节
# print(
'data1:%s'%data1)
# print(data1.decode(
'utf-8')) #
# # data2
= s.readline()
# print(f
'data2{data2}')
timeout 设置为0时
import serial

s = serial.serial_for_url("loop://", baudrate=115200, timeout=0)

# 写入0123456789共10字节,使用read方法读取
s.write("0123456789".encode("utf-8"))
print("写入 0123456789")
print(f"尝试读取一个字节: {s.read()}")
print(f"尝试读取100个字节: {s.read(100)}")
print(f"再尝试读取一个字节: {s.read()}")

# 写入0123456789\n012345678901234,使用readline方法读取
s.write("0123456789\n01234567890123456789".encode("utf-8"))
print(f"尝试读取一行: {s.readline()}")
print(f"再尝试读取一行: {s.readline()}")
print(f"再次尝试读取一行: {s.readline()}")
timeout 设置为5时
import serial

s = serial.serial_for_url("loop://", baudrate=115200, timeout=5)

# 写入0123456789共10字节,使用read方法读取
s.write("0123456789".encode("utf-8"))
print("写入 0123456789")
print(f"尝试读取一个字节: {s.read()}")
print(f"尝试读取100个字节: {s.read(100)}") # 此时读不到100字节就会等待,直到超时在返回
print(f"再尝试读取一个字节: {s.read()}")

# 写入0123456789\n012345678901234,使用readline方法读取
s.write("0123456789\n01234567890123456789".encode("utf-8"))
print(f"尝试读取一行: {s.readline()}")
print(f"再尝试读取一行: {s.readline()}") # 此时读不到\n就会等待,直到超时在返回
print(f"再次尝试读取一行: {s.readline()}")
timeout 设置为None时

 

import serial

s = serial.serial_for_url("loop://", baudrate=115200, timeout=None)

# 写入0123456789共10字节,使用read方法读取
s.write("0123456789".encode("utf-8"))
print("写入 0123456789")
print(f"尝试读取一个字节: {s.read()}")
print(f"尝试读取100个字节: {s.read(100)}") # 此时读不到100字节就会等待,程序不会结束
print(f"再尝试读取一个字节: {s.read()}")

# 写入0123456789\n012345678901234,使用readline方法读取
# s.write("0123456789\n01234567890123456789".encode("utf-8"))
# print(f"尝试读取一行: {s.readline()}")
# print(f"再尝试读取一行: {s.readline()}") # 此时读不到\n就会一直等待
# print(f"再次尝试读取一行: {s.readline()}")


# 综上所述,我们大部分情况把timeout设置成0

 

posted @ 2023-02-14 11:00  断浪狂刀忆年少  阅读(1953)  评论(0编辑  收藏  举报