4

シリアル入力を受け取り、それを変数に保存するプログラムを Arduino で実行しています。魅力的です。シリアル モニタに組み込まれた Arduino アプリケーションを使用して、0 ~ 255 のバイトを正常に送受信できました。

pyserial を使用して、127 (または0b01111111)より大きい任意のバイトを送信するには、 pyserial2 を返します。たとえば、127 より大きい値の場合0b10000000、1 バイトではなく 2 バイトが送信されます。

pyserialしたがって、私の問題は にあると思います。

ser.write(chr(int('01000000', base=2)).encode('utf-8'))

完全に動作し、Arduino 側で正しく受信されます。

ser.write(chr(int('10000000', base=2)).encode('utf-8')) 

は 2 を返しますが、Arduino では0b11000010andとして表示され0b10000000ます。

4

1 に答える 1

2

NPE が言うように、これは UTF-8 のエンコーディングです。128 ~ 2047 (8 ~ 11 ビット) のバイトが 2 バイトに変換されます。元の 11 ビットが abcdefghijk の場合、utf-8 バージョンは 110abcde 10fghijk です。あなたの例では (11 ビットにするために 0 をパディングして)、00010000000 は 11000010 10000000 または \xc2\x80 に変換されます。これはまさにあなたが見ているものです。詳細については、UTF-8 に関するウィキペディアの記事を参照してください。

これは、Python で次のコードを使用して確認できます (int('10000000', base=2) を 128 に置き換えています)。

>>> unichr(128).encode('utf-8')
'\xc2\x80' 

私を混乱させるのは、chr(int('10000000',base=2)).encode('utf-8') または同等に chr(128).encode('utf-8)' を使用できることです。これを行うと、次のようになります。

>>> chr(int('10000000', base=2)).encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

デフォルトのエンコーディングを変更しましたか?

必要なのは、0 ~ 255 に 1 バイトを使用し、Unicode に一致するエンコーディングです。代わりに「latin_1」を使用してみてください。

>>> unichr(128).encode('latin_1')
'\x80'
于 2013-01-25T06:00:18.047 に答える