【问题标题】:Python/Arduino Serial communicationPython/Arduino 串行通信
【发布时间】:2025-12-02 17:45:01
【问题描述】:

我们正在尝试从 Python 与我们的 Arduino 进行通信,但在从 python 写入串行端口时遇到问题

import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
time.sleep(2)

user_input = 'L'
while user_input != 'q':
    user_input = input('H = on, L = off, q = quit' )
    byte_command = user_input.encode()
    print(byte_command)
    ser.writelines(byte_command)   # This line gives us the error.
    time.sleep(0.5) # wait 0.5 seconds
print('q entered. Exiting the program')
ser.close()

以下是我们收到的错误:

返回 len(数据) TypeError: 'int' 类型的对象没有 len()

【问题讨论】:

  • 你应该提供你得到的错误
  • 我在原帖中添加了错误。 Traceback (最近一次调用最后): File "/home/pi/thingy.py", line 11, in ser.writelines(byte_command) # send a byte File "/usr/lib/python3/dist-packages/ serial/serialposix.py",第 558 行,写入返回 len(data) TypeError: 'int' 类型的对象没有 len()

标签: python serialization arduino


【解决方案1】:

您的代码可以在我的电脑上运行。我认为您尝试使用的功能 (writelines) 是不久前添加到 pyserial 中的,因此您可能正在运行过时的版本。

在任何情况下,据我所知,writelines 是从文件处理类继承而来的,您实际上并不需要将它用于您想要做的事情。实际上我认为它甚至没有很好的记录

只需将其更改为:

ser.write(byte_command) 

如果您愿意,可以查看您拥有和/或更新的 pyserial 版本。

检查你的版本运行:pip3 list | grep serial

如果您没有 3.4 版,您可以更新:pip3 install pyserial --upgrade

考虑到 writelines 如何处理文件(例如,参见 here),您的错误实际上可能与您拥有的核心 Python 有关(供您参考,我正在运行 Python 3.7.3)。

【讨论】:

    【解决方案2】:

    writelines 接受字符串列表,因此您不能使用它来发送单个字符串。而是使用write:

    import serial
    import time
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
    time.sleep(2)
    
    user_input = 'L'
    while user_input != 'q':
        user_input = input('H = on, L = off, q = quit')
        byte_command = user_input.encode()
        print(byte_command)
        ser.write(byte_command)   # This line gives us the error.
        time.sleep(0.5)  # wait 0.5 seconds
    print('q entered. Exiting the program')
    ser.close()
    

    【讨论】: