2016-05-09 11 views
0

現在、私たちはラズベリーパイとAX-12ダイナミックスサーボのロボットを構築しています。私たちは現在python3に移植しているpython2ライブラリを見つけました。python3でエラーが発生する特定のメソッドで問題を特定しました。python2とpython3の違いは、バイトの追加とシリアルポートへの送信

ザ・Pythonの2バージョンが実際に私たちがしようとしていることは、この変数を調整している魅力

AX_GOAL_LENGTH = 5 
AX_WRITE_DATA = 3 
AX_GOAL_POSITION_L = 30 
AX_START = 255 
AX_REG_WRITE = 4 

def move(self, id, position): 
    self.direction(Ax12.RPI_DIRECTION_TX) 
    Ax12.port.flushInput() 
    p = [position&0xff, position>>8] 
    checksum = (~(id + Ax12.AX_GOAL_LENGTH + Ax12.AX_WRITE_DATA + Ax12.AX_GOAL_POSITION_L + p[0] + p[1]))&0xff 
    outData = chr(Ax12.AX_START) 
    outData += chr(Ax12.AX_START) 
    outData += chr(id) 
    outData += chr(Ax12.AX_GOAL_LENGTH) 
    outData += chr(Ax12.AX_WRITE_DATA) 
    outData += chr(Ax12.AX_GOAL_POSITION_L) 
    outData += chr(p[0]) 
    outData += chr(p[1]) 
    outData += chr(checksum) 
    Ax12.port.write(outData) 

のように動作します:

Ax12.port.write(bytes(outData,'utf-8')) 

今スクリプトは悲しげサーボはもう動作しません、実行されます。

我々はまた、バイト配列内のバイトを配置する

result = bytes([Ax12.AX_START, Ax12.AX_START, 
       Ax12.AX_GOAL_LENGTH,Ax12.AX_REG_WRITE, 
       Ax12.AX_GOAL_POSITION_L, p[0], p[1], checksum 
]) 
Ax12.port.write(result) 

をしようとしたスクリプトが実行されますが、サーボは実行されません。

私は、outDataに対して行われた操作は、python3とpython2では異なっていると思います。何が調整されるべきか、異なるべきかを知ることはできません。

誰かが現在私が間違っていることを見ていますか?

+0

あなたの 'bytes'バージョンには' id'値がありません。あなたは 'AX_WRITE_DATA'の代わりに' AX_REG_WRITE'を送信しています。 –

答えて

1

あなたのバイトはではなく、のUTF-8データです。 0〜127の範囲外で作成したchr()値のいずれかの場合は、UTF-8にエンコードするとの2つのバイトが生成されます。

整数値からUnicodeコードポイントを作成していました。 0から255までの整数に制限した場合、これらはLatin-1コードポイントを作成します。原則として'latin1'にエンコードして再度バイトを取得することもできますが、最初にバイトを作成する方がはるかに簡単です。 Pythonの3では

、整数のリストから作成されたbytes種類、使用:あなた自身の試みはid値が含まれていないとあなたがAX_REG_WRITEではなくAX_WRITE_DATAを使用

def move(self, id, position): 
    self.direction(Ax12.RPI_DIRECTION_TX) 
    Ax12.port.flushInput() 
    p = [, position>>8] 
    checksum = (~(id + Ax12.AX_GOAL_LENGTH + Ax12.AX_WRITE_DATA + Ax12.AX_GOAL_POSITION_L + p[0] + p[1]))&0xff 
    outData = bytes([ 
     Ax12.AX_START, Ax12.AX_START, id, 
     Ax12.AX_GOAL_LENGTH, Ax12.AX_WRITE_DATA, 
     Ax12.AX_GOAL_POSITION_L, p[0], p[1], checksum]) 
    Ax12.port.write(outData) 

を。

bytearray() objectを使用して、追加のバイトを追加することもできます。

def move(self, id, position): 
    self.direction(Ax12.RPI_DIRECTION_TX) 
    Ax12.port.flushInput() 
    outData = bytearray([ 
     Ax12.AX_START, Ax12.AX_START, id, 
     Ax12.AX_GOAL_LENGTH, Ax12.AX_WRITE_DATA, 
     Ax12.AX_GOAL_POSITION_L, position & 0xff, position >> 8]) 
    checksum = ~sum(outData[2:]) & 0xff 
    outData.append(checksum) 
    Ax12.port.write(outData) 

あなたはあまりにも当然連結使用することができます(outData = bytes([...])を、outData += bytes([checksum]))が、bytearray:あなたは(一般的なエラーのソース)自分自身を繰り返すことを回避、これまでに作成されたバイトを参照してチェックサムを計算することを使用することができますPython 2でも利用できるので、上記のバージョンは両方の主要なPythonのバージョンと互換性があります。

関連する問題