1

わかりやすくするために、追加情報を最初から書き直しています。

次のことを考慮してください。

y = hex(1200)
y
'0x4b0'

yの最初の0を「\」に置き換えて「\x04b0」のようにする必要があります。厳密にその形式('\ xSumCharsHere')でパラメーターを受け取るRS-232シリアルを介して機器と通信しています。Pythonでは次のことはできません。

z = '\x' + y[2:]
ValueError: invalid \x escape

以下は、zに割り当てられた実際の値にまだ「\\」が含まれているため、受け入れられません。

z = '\\' + y[1:]
z
'\\x4b0'

最終的な目標は、次のようなコマンドをシリアルポートに送信することです。

s.write(z) # s is a serial object
s.write('\x04b0') # This call is an equivalent of the call above
s.write('\\x04b0') # This command will not work
4

4 に答える 4

2

コードの最後のビットは、あなたが思っていることをしません:

>>> x = hex(1200)
>>> y = '\\' + x[1: len(x)]
>>> y
'\\x4b0'
>>> print y
\x4b0

Python コンソールで変数の名前を入力すると、Python は文字列の表現を Python code として出力します。これが 2 つのバックスラッシュが表示される理由です。Python 文字列のリテラル バックスラッシュは、先頭の別のバックスラッシュによってエスケープされます。このコードは実際に機能しますが、結果の表現にはうんざりします。

ただし、先頭のゼロが省略されているため、代わりにこのスニペットを使用することをお勧めします。

>>> y = '\\x%04x' % 1200
>>> print y
\x04b0
于 2012-08-01T18:54:22.630 に答える
1

最後のコードビットは正しいです。代わりに、生の文字列を使用して記述することもできます。

y = r'\x' + x[2: len(x)]

cdhowieが彼の答えで言ったように:

Python コンソールで変数の名前を入力すると、Python は文字列の表現を Python コードとして出力します。このコードは実際に機能しますが、結果の表現にはうんざりします。

ただし、これは手書きのエスケープ シーケンスの代替手段であり、はるかに読みやすいため、わずかに優れたコーディング方法だと思います。

于 2012-08-01T18:54:00.857 に答える
0

後者は機能します。コンソールでは、Pythonはrepr()オブジェクトの印刷に使用します。この場合、オブジェクトは二重スラッシュで表示されます。print yコンソールで実行すると、正しく出力されることがわかります。

最初の例を少しクリーンアップすることもできます。

y = "\\x" + x[2:]

または2番目:

y = "\\" + x[1:]
于 2012-08-01T18:55:41.420 に答える
0

コンソールでの表現として文字列を取得しようとしているだけの場合は\0x4b0、実際にコンソールで呼び出す必要がありますprint

>>> s='\\0{}'.format(hex(1200)[1:])
>>> s
'\\0x4b0'
>>> print s
\0x4b0
>>> s2='\\0'+hex(1200)[1:]
>>> s2
'\\0x4b0'
>>> print s2
\0x4b0

コンソールで文字列を単に FORM する (つまり、 を通過しないprint) 場合、Python はその表現を表示します。

>>> '\\0{}'.format(hex(1200)[1:])
'\\0x4b0'
>>> repr(s2)
"'\\\\0x4b0'"
>>> s2
'\\0x4b0'

編集(コメントに基づく):

これは古い HP プロッターだと思いますか?

シェルが文字列として表示しているものに混乱しないでください。

の文字列を生成したいと述べています\x<someNumGoesHere>(または\x0<someNumGoesHere>先頭に0?)

方法は次のとおりです。

>>> def angle_string(angle):
...    return '\\0{}'.format(hex(angle)[1:])
... 
>>> angle_string(1200)
'\\x04b0'
>>> print _
\x04b0
>>> angle_string(33)
'\\x021'
>>> print _
\x021

文字列をデバイスに送信すると (OS のファイル/印刷のようなサービスを介して RS232 ポートに)、フォーマットしたとおりになります。

編集 2

文字列補間は、これらの文字列リテラルを処理するプロセスです:

>>> s1
'\n\n\t\tline'

これに翻訳してください:

>>> print s


       line

論理的には、これらのリテラル文字は単一の文字です。

>>> s1[0]
'\n'
>>> len('\\')
1

私の推測では、シリアルポートを開いた方法sは文字列を使用して生モードであるため、文字列\\x0123はそのように送信されている (生モード) 対次のように解釈されている\x0123

これを回避する方法として、次の方法を試すことができます。

>>> cmd=chr(92)+'0'+hex(1200)[1:]
>>> s.write(cmd)

文字列リテラルが適切な単一文字として送信されるように、 FileLikeモードでシリアル ポートを開く必要もあると思います。

于 2012-08-01T19:05:48.777 に答える