在玩MCU时,我试图通过RS232链接与PC桌面进行通信。
我做了一个非常简单的测试程序:每nms发送"Hello world!\n"。
最相关的链路连接参数是:
- 端口:/dev/ttyUSB0
- 波特率:57600 bps
- 8个数据位
- 1位停止
- 无奇偶校验和硬件控制
为了检查我是否从MCU接收到PC的数据,我用设置/dev/ttyUSB0
%> stty -F /dev/ttyUSB0 57600 cooked
然后,
%> cat /dev/ttyUSB0
Hello world!
Hello world!
Hello world!
...
因此,我正确地从MCU接收数据。
但是,这里的问题是,当我想将Python与pySerial模块一起使用时,数据是绝对错误的:
>>> s = serial.Serial('/dev/ttyUSB0', 57600)
>>> print s
Serial<id=0x195fed0, open=True>(
port='/dev/ttyUSB0', baudrate=57600,
bytesize=8, parity='N',
stopbits=1, timeout=None,
xonxoff=False, rtscts=False,
dsrdtr=False)
>>> s.read(14)
'xc8xe5xecxecxefxa0xf7xefxf2xecxe4xa1x8ax80'
在这一点上,我已经为这个字符串更改了"Hello world!\n"输出字符串(MCU侧):0xde、0xad、0xbe、0xef。而且,我用pySerial得到的是:
>>> s.read(4)
'xdexadxbexef'
它有效!我更改了另一个时间,现在是:0x00、0x01、0x02、0x03、0x80、0x81、0x82、0x83。结果:
>>> s.read(8)
'x80x81x82x83x80x81x82x83'
结论:pySerial将小于128的字节值更改为相同的值加128。
我不知道为什么会发生这种事。我在其他场合使用了pySerial模块(版本2.4),一切都很好。我在Ubuntu 11.10和Ubuntu 10.04中尝试过2.5和2.6版本,但都不起作用。有线索吗?
PD:请同情我的英语写作。我的英语不够熟练。
好吧,我的错!PySerial工作非常完美。在修改MCU中的代码时,我发现一个错误,即未设置应该设置的位(我发送的是7位字符长度)。然后,接收到的帧,显然,部分是好的,部分是错的。
现在,我可以理解为什么pySerial向我显示糟糕的结果了。然而,对我来说,我的电脑是如何从7位数据,8位长度的字符中重建的,这是一个谜。我确信MCU的代码是好的,因为来自终端的数据是正确的:s