32

私は pyserial を使用しており、255 未満の値を送信する必要があります。int 自体を送信すると、int の ascii 値が送信されます。そのため、int を Unicode 値に変換し、シリアル ポート経由で送信しています。

unichr(numlessthan255);

However it throws this error:
'ascii' codec can't encode character u'\x9a' in position 24: ordinal not in range(128)

int を unicode に変換する最良の方法は何ですか?

4

4 に答える 4

24

chr(somenumber)256 未満である限り、int の 1 バイト値を取得するために使用するだけです。pySerial はそれを正常に送信します。

pySerial 経由での送信を検討している場合は、エンディアンの問題、パッキングの問題、および必要になる可能性が高いほぼすべてのデータ型のエンコードを処理する標準ライブラリの struct モジュールを確認することをお勧めします 1バイト以上。

于 2013-07-13T07:25:01.317 に答える
11

代わりにchr()関数を使用してください。256 未満で 128 を超える値を送信していますが、Unicode 文字を作成しています。

次に、バイト文字を取得するために Unicode 文字を最初にエンコードする必要があります。ASCII 範囲 (0 ~ 127) 以外の値を使用しているため、そのエンコードは失敗します。

>>> str(unichr(169))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 0: ordinal not in range(128)

これは Python 2 の通常の動作です。Unicode 文字列をバイト文字列に変換しようとすると、暗黙的なエンコードが行われる必要があり、デフォルトのエンコードは ASCII です。

代わりに使用する場合はchr()、1 文字のバイト文字列を作成し、暗黙のエンコーディングを行う必要はありませ

>>> str(chr(169))
'\xa9'

特に255より大きい整数値を送信する必要がある場合は、 structmoduleを調べることをお勧めします。

>>> struct.pack('!H', 1000)
'\x03\xe8'

たとえば、上記の例では、ネットワーク バイト順で整数を unsigned short にパックしています。

于 2013-07-13T07:25:19.570 に答える