工作中需要用到UBS转串口通过串口给下位机发数据,于是通过查阅,python居然真的有对应的库
这是在百度中收到的,关于pyserial的使用:
在Python中,可以使用pyserial
库来进行串口通信。以下是一个简单的例子,展示了如何使用pyserial
发送和接收数据。
首先,确保安装了pyserial
库:
pip install pyserial
import serial
import time
# 打开串口
# 设备文件名可能是 '/dev/ttyUSB0', '/dev/tty.usbserial口1' 或者其他,取决于操作系统和硬件
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.5) # 设置串口号和波特率
# 发送数据
ser.write(b'Hello\n') # 注意必须是字节类型,所以使用b'Hello\n'
# 读取数据
# 可以使用ser.inWaiting()来检查是否有数据可读
if ser.inWaiting() > 0:
response = ser.readline() # 读取一行,如果知道数据的确切长度,也可以直接读取那么多字节
print(response)
# 关闭串口
ser.close()
基于上述资料,对串口方法进行二次封装:
实现如下:
class Communication(): # 封装串口
data = ''
def __init__(self, com, bps, timeout):
self.port = com
self.bps = bps
self.timeout = timeout
self.is_receiving=False
try:
# 打开串口,并得到串口对象
self.com = serial.Serial(self.port, self.bps, timeout=self.timeout)
# 判断是否打开成功
if self.com.is_open:
ret = True
except Exception as e:
logger.error("---打开串口失败,请检查串口连接---:", e)
exit()
self.running = True
self.thread = threading.Thread(target=self.get_data,daemon=False, name='get_data thread')
self.thread.start()
logger.info(f'{self.thread.name} start')
# 打印串口相关数据
def Print_Name(self):
print(self.com.port) # 读或者写端口
print(self.com.baudrate) # 波特率
print(self.com.bytesize) # 字节大小
print(self.com.parity) # 校验位
print(self.com.stopbits) # 停止位
# 打开串口方法
def Open_Engine(self):
self.com.open()
# 关闭串口方法
def Close_Engine(self):
self.com.close()
logger.info(f"串口打开状态{self.com.is_open}") # 检验串口是否打开
def hexStr_to_str(self, hex_str):
'''
函数名称: hexStr_to_str
功能描述: 把需要发送的指令转换为str
输入参数:hex_str
返回参数:str_bin.decode('utf-8')
'''
hex = hex_str.encode()
str_bin = binascii.unhexlify(hex)
return str_bin
def send_data(self, str1):
'''
函数名称: send_data
功能描述: 发送int类型的指令
输入参数:str
返回参数:data
'''
time.sleep(0.5)
logger.info('发送数据: {}'.format(str1.hex().upper()))
data = self.com.write(str1) # 调用转换方法写入16进制参数\
return data
代码调用举例:
if __name__ == '__main__':
b = Communication("COM18", 115200, timeout=1)
b.send_data(b"\xc0\x00\x00\x10\x00\x11\x00\x00\x00\x00\x01\x02\x01\x08\xa0\x0f\x00\x00\x10'\x00\x00U\x17\xc0")