m0_67526728 2023-01-20 03:24 采纳率: 50%
浏览 85
已结题

Linux无法正确执行Python代码

需求:电脑使用串口连接了一个温湿度计,使用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.不知道是不是这个的问题。程序能执行一部分证明非权限问题

img

# !/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() 
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/691230581476189.png "#left")


展开全部

  • 写回答

5条回答 默认 最新

  • bluetata 云计算领域优质创作者 2023-01-29 08:54
    关注

    先检查 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
    

    最后检查防火墙等

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    m0_67526728 2023-01-29 09:29

    这两个我都测试过
    第一个是原样输出, success_bytes = com.write('This is data for test')就会直接返回This is data for test
    第二个是返回b' '不管是否写入值都是返回b' '
    Linux下版本为python3.6.9 windows下版本为3.8.5 ,版本相差不大但是不确定是不是版本问题,
    防火墙已经关闭

    回复
    bluetata 回复 m0_67526728 2023-01-29 09:49

    不如切换一下版本,还有pip的版本,也可以等等看其他人的回答,我之前遇到过一个代码一直跑不过,是因为pip的版本限制,后来降低版本就通过了,有的时候版本也影响

    回复
查看更多回答(4条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 2月11日
  • 已采纳回答 2月4日
  • 修改了问题 1月29日
  • 创建了问题 1月20日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部