为什么是b'\x02&x27;与Python中的值2或int(2)不同?
我有一台PC将字节值2发送给Raspberry Pi 但我不明白为什么Python程序在收到值时计算结果不为true 如果我打印收到的值,它会将b'\x02'写入输出为什么是b'\x02&x27;与Python中的值2或int(2)不同?,python,compare,byte,Python,Compare,Byte,我有一台PC将字节值2发送给Raspberry Pi 但我不明白为什么Python程序在收到值时计算结果不为true 如果我打印收到的值,它会将b'\x02'写入输出 import serial def GetSerialData(): x = ser.inWaiting() if x > 0: received_data = ser.read(x) print (received_data) return x ser = se
import serial
def GetSerialData():
x = ser.inWaiting()
if x > 0:
received_data = ser.read(x)
print (received_data)
return x
ser = serial.Serial ("/dev/ttyAMA0", 9600)
try:
while True:
SData = GetSerialData ()
if ( SData == b'\x02'):
print ("Ok - value is 2")
except KeyboardInterrupt:
ser.close()
您的
GetSerialData
函数似乎并没有实际返回串行数据。它打印串行数据,但之后您再也不会引用接收的\u数据
,而是返回x
,它似乎是一个表示响应大小的整数
请尝试返回接收的\u数据,而不是返回x
def GetSerialData():
x = ser.inWaiting()
if x > 0:
return ser.read(x)
else:
return b"" #or whatever value is appropriate when no data has been sent yet
\x02
是十六进制02的ASCII码,即STX
(文本开头)。
\x32
是数字2
的ASCII码
如果SData
是整数或任何非(二进制)字符串,请记住使用str(SData)
将其转换为字符串
另外,一般来说,b'A'!='A'
。您希望使用.encode('ascii')
将Python字符串转换为ascii二进制字符串
>>> binary_A_from_string = 'A'.encode('ascii')
>>> binary_A_from_string
b'A'
>>> binary_A = '\x41' # ASCII 41 (dec 65) is 'A'
>>> binary_A
b'A'
>>> binary_A == 'A'
False
>>> binary_A == binary_A_from_string
True
这是因为Python认为二进制ASCII字符串不同于标准Python字符串
此外,请确保读取的信息实际上是一个字节长。您可能读取了多个字节。根据字节的发送顺序(大端或小端),b'\x02'
可能是第一个或最后一个,但SData
包含的字节数将超过该字节数,因此在任何情况下都不等于该字节数(顺便说一句,您可能更喜欢将ser
作为参数传递给GetSerialData
,而不是隐式地将其用作全局变量)你能提供电脑正在运行的代码吗?我的错!!老实说,这是一个愚蠢的错误。我正在返回串行缓冲区中的字节数,我应该在其中返回实际数据。一旦我将代码更改为返回接收到的\u数据
,它就会按预期工作。建议返回序列读取(x)
让我走上正轨。谢谢你的帮助。