需求:电脑使用串口连接了一个温湿度计,使用Python向串口发送16进制指令,并提取返回数据。
问题:同样的Python程序在Windows下正常执行,但是想在Linux实现同样的功能,程序的串口号修改为Linux串口号过后程序执行,但是无法完全执行, len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)这里获取不到数据所以返回0,(在Windows下可以正常返回数据的)。程序执行并不报错。Windows和Linux编码都是UTF-8。唯一的区别是执行locale后windows是C.UTF-8。Linux是zh_CN.UTF-8.不知道是不是这个的问题。程序能执行一部分证明非权限问题
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import binascii
import time
import serial.tools.list_ports
if __name__ == '__main__':
# 读取串口列表
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
print("无串口设备")
else:
print("可用的串口设备如下: ")
print("%-10s %-30s %-10s" % ("num", "name", "number"))
for i in range(len(ports_list)):
comport = list(ports_list[i])
comport_number, comport_name = comport[0], comport[1]
print("%-10s %-30s %-10s" % (i, comport_name, comport_number))
# 打开串口
ser = serial.Serial(port="/dev/ttyS0", baudrate=9600, bytesize=8, stopbits=1,
timeout=0.5)
if ser.isOpen():
print("打开串口成功, 串口号: %s" % ser.name)
else:
print("打开串口失败")
# 串口发送数据
a = '01 03 01 03 05 02 c7 4B'
d = bytes.fromhex(a)
result = ser.write(d)
print(result)#8
time.sleep(1)
len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)
print(len_return_data)#0
if len_return_data > 0:
data = ser.read(len_return_data)
if data != b'':
print("receive", str(binascii.b2a_hex(data))[2:-1])
# 关闭串口
ser.close()

先检查 linux机器里的串口是否正常,写一个测试程序,直接在linux里运行看看有没有输出,比如下面这个测试
# 发送数据
# encoding=utf-8
import serial
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
success_bytes = com.write('This is data for test')
print success_bytes
# 接收数据
# encoding=utf-8
import serial
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
data = com.read(10)
print data
如果根据上述Linux串口没有问题,那么对比一下你linux和windows python的版本,包括pip包的版本,统一一下
pip list
最后检查防火墙等
通常来说,还是跟串口设置和读取问题。你可以先不用温湿度计,用高低电平测试串口设置是否正确,串口读取是否成功。
错误的原因可能是串口配置不正确或者没有权限使用串口。请在Linux中检查串口的名称是否正确,并且确保Python有访问串口的权限。此外,可以检查程序的编码方式和locale设置是否对串口通信造成影响。
在这种情况下,您可以检查以下内容:
串口配置:确保Linux下的串口配置与Windows下的配置相同。
权限问题:确保您在Linux下拥有访问该串口的权限。
编码问题:您可以尝试将程序的编码设置为ascii,看是否有所改善。
数据格式:确保您发送和接收的数据格式相同。
测试连接:您可以使用Linux下的串口调试工具来测试连接是否正常。
Python库:您可以尝试使用不同的Python库来实现串口通信,例如pyserial,miniterm等。