MCU で遊んで、RS232 リンクを介して PC デスクトップと通信しようとしています。
テスト プログラムを非常にシンプルにしました。「Hello world!\n」を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からデータを受信しています。
しかし、ここで問題は、pySerial モジュールで Python を使用したい場合、データが完全に間違っていることです。
>>> 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)
'\xc8\xe5\xec\xec\xef\xa0\xf7\xef\xf2\xec\xe4\xa1\x8a\x80'
この時点で、「Hello world!\n」出力文字列 (MCU 側) を次の文字列に変更しました: 0xde, 0xad, 0xbe, 0xef。そして、pySerial で得られるものは次のとおりです。
>>> s.read(4)
'\xde\xad\xbe\xef'
できます!今度は、0x00, 0x01, 0x02, 0x03, 0x80, 0x81, 0x82, 0x83 に変更しました。結果:
>>> s.read(8)
'\x80\x81\x82\x83\x80\x81\x82\x83'
結論: pySerial は、同じ値に 128 を加えた値に対して、128 より小さいバイト値を変更します。
なぜこれが起こっているのかわかりません。他の機会(バージョン2.4)でpySerialモジュールを使用しましたが、すべて正常に機能しました。Ubuntu 11.10 および Ubuntu 10.04 で 2.5 および 2.6 バージョンを試しましたが、うまくいきません。どんな手掛かり?
PD: 私の英語の文章に共感してください。私は英語に堪能ではありません。