接收到的消息与通过串行连接发送的消息不同
Received message differs from sent message over serial connection
我正在尝试通过串行连接将两个覆盆子与 pyserial 连接起来。我写了两个小脚本,用于传输和接收。虽然两者之间存在通信,但接收到的消息与发送的消息完全不同。
例如,如果我这样做
serial1.write(b'hello')
在raspi1上,然后raspi2收到:
print(serial2.readline().hex())
fa9b9fff
这是 ú›Ÿÿ
的十六进制表示。
编辑:这是接收和发送方法:
发件人:
def send_msg(_ser, _msg):
if _ser.isOpen(): # isOpen() is deprecated since version 3.0
try:
_ser.flushInput() # flush input buffer, discarding all its contents
_ser.flushOutput() # flush output buffer, aborting current output
# and discard all that is in buffer
_ser.write(_msg)
_ser.flush()
except IOError:
print('error communicating...')
else:
print('cannot open serial port')
return
接收者:
def read_line(_ser, _eol_character=b'\n', _timeout=1, _encoding='utf-8'):
buffer = ""
timer = time.time()
while (time.time()-timer)<_timeout:
one_byte = _ser.read(1)
print(one_byte.hex())
if one_byte == _eol_character:
return buffer.encode(_encoding)
else:
buffer += str(one_byte, _encoding, errors='replace')
raise TimeoutError("Timed out while read_line(), make sure there is an EOF!")
您收到的乱码表明三种可能的原因:
-设置不匹配,很可能是不同的波特率
-总线上的噪音:通常源于缺少公共接地参考。当您没有连接时会发生这种情况,仅连接 TX 和 RX 信号,但让 GND 悬空(在台式计算机上,即使您不连接 GND 信号,您也可能有一个公共接地,因为房屋布线的安全接地但在笔记本电脑或其他 battery-powered 设备上,这是一个问题,您必须使用第三根电缆连接总线两侧的 GND。
-您正在尝试使用不同的逻辑级别进行通信。如果总线的一侧工作在 TTL 电平 (5V) 而另一侧工作在 3.3V,或者当你有一个真正的 RS232 电平(差分)与任何其他电平结合时,就会发生这种情况。更不用说如果您尝试将 RS485 与 RS232 或 TTL 混合使用,这当然也行不通。
我正在尝试通过串行连接将两个覆盆子与 pyserial 连接起来。我写了两个小脚本,用于传输和接收。虽然两者之间存在通信,但接收到的消息与发送的消息完全不同。
例如,如果我这样做
serial1.write(b'hello')
在raspi1上,然后raspi2收到:
print(serial2.readline().hex())
fa9b9fff
这是 ú›Ÿÿ
的十六进制表示。
编辑:这是接收和发送方法:
发件人:
def send_msg(_ser, _msg):
if _ser.isOpen(): # isOpen() is deprecated since version 3.0
try:
_ser.flushInput() # flush input buffer, discarding all its contents
_ser.flushOutput() # flush output buffer, aborting current output
# and discard all that is in buffer
_ser.write(_msg)
_ser.flush()
except IOError:
print('error communicating...')
else:
print('cannot open serial port')
return
接收者:
def read_line(_ser, _eol_character=b'\n', _timeout=1, _encoding='utf-8'):
buffer = ""
timer = time.time()
while (time.time()-timer)<_timeout:
one_byte = _ser.read(1)
print(one_byte.hex())
if one_byte == _eol_character:
return buffer.encode(_encoding)
else:
buffer += str(one_byte, _encoding, errors='replace')
raise TimeoutError("Timed out while read_line(), make sure there is an EOF!")
您收到的乱码表明三种可能的原因:
-设置不匹配,很可能是不同的波特率
-总线上的噪音:通常源于缺少公共接地参考。当您没有连接时会发生这种情况,仅连接 TX 和 RX 信号,但让 GND 悬空(在台式计算机上,即使您不连接 GND 信号,您也可能有一个公共接地,因为房屋布线的安全接地但在笔记本电脑或其他 battery-powered 设备上,这是一个问题,您必须使用第三根电缆连接总线两侧的 GND。
-您正在尝试使用不同的逻辑级别进行通信。如果总线的一侧工作在 TTL 电平 (5V) 而另一侧工作在 3.3V,或者当你有一个真正的 RS232 电平(差分)与任何其他电平结合时,就会发生这种情况。更不用说如果您尝试将 RS485 与 RS232 或 TTL 混合使用,这当然也行不通。