我是python的新手并尝试使用serial和python 3编写数据。请帮助解决下面的错误。
>>> import serial
>>> check=serial.Serial(1)
>>> print(check.name)
COM2
>>> check.write("test")
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
check.write("test")
File "C:\Python34\lib\site-packages\serial\serialwin32.py", line 283, in write
data = to_bytes(data)
File "C:\Python34\lib\site-packages\serial\serialutil.py", line 76, in to_bytes
b.append(item) # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer is required
答案 0 :(得分:11)
import serial
check=serial.Serial(1)
check.write(b"test")
以前版本的Python为您做了很多string
到bytes
转换(我个人非常喜欢旧方法)。如今,在Python3 +中你需要自己处理数据类型转换,具体取决于你的输出/输入,即使我讨厌它也会更有意义......
这适用于套接字和许多其他对象
因此,为了通过串口或套接字发送数据,您需要做的就是将字符串转换为字节对象。通过声明b"this is bytes"
或bytes(MyString, 'UTF-8')
。
例如:
import serial
check=serial.Serial(1)
data = "test"
check.write(bytes(data, 'UTF-8'))
当机器(你的电脑)使用较低级别的数据(串口,插座等)时,它用于处理二进制代码,这是你可能听说过的01010101
。
但是你习惯于使用"Hello world"
之类的字符串。
中间有一个中间层,它更接近机器代码,但我们的人类仍然可以使用和理解,那就是byte
对象。
a -> 97 -> 01100001
以前(如上所述)python会将您的a
转换为97
,以便为处理机器代码的驱动程序做好准备。这在Python源代码中引起了很多问题,因此决定你需要在需要时转换数据而不是Python试图为你解决问题。
因此,在将它发送到套接字层之前(串口也使用套接字),您只需将其转换为机器将理解的内容更近一步:)
Ps:如果我把术语搞砸了,或者只是留下评论并且我会纠正它,这是对过程如何工作的过度简化。这只是为了解释为什么要在字符串前放置b
:)