質問

0 から 255 までの整数があり、それらを符号なしバイトとしてエンコードされた OutputStream に渡す必要があります。このようなマスクを使用して変換しようとしましたが、i=1 の場合、ストリームのもう一方の端 (uint8_t を期待するシリアルデバイス) は、符号なし整数 = 6 を送信したとみなします。

OutputStream out;
public void writeToStream(int i) throws Exception {
    out.write(((byte)(i & 0xff)));
}

私はArduinoと話しています /dev/ttyUSB0 これで多少なりとも面白くなる場合は、Ubuntu を使用してください。

Arduinoのコードは次のとおりです。

uint8_t nextByte() {
    while(1) {
    if(Serial.available() > 0) {
        uint8_t b =  Serial.read();
      return b;
     }
    }
}

また、Arduino コードと連携してうまく動作する Python コードもいくつかあります。このコードを Python で使用すると、Arduino は正しい整数を喜んで受け取ります。

class writerThread(threading.Thread): 
    def __init__(self, threadID, name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
    def run(self):
        while True:
            input = raw_input("[W}Give Me Input!")
            if (input == "exit"):
               exit("Goodbye");
            print ("[W]You input %s\n" % input.strip())
            fval = [ int(input.strip()) ]
            ser.write("".join([chr(x) for x in fval]))

これも最終的には Scala でやりたいと思っていますが、この問題を解決する際の複雑さを避けるために Java に戻ります。

役に立ちましたか?

解決

キャストしてからマスクします。 ((byte)(i)&0xff)

しかし、次のような理由から、何かが非常に奇妙です。

(12 進数)8 ~ (2 進数)1000
(12 進数)6 - (2 進数)0110

[編集]
1 (バイナリ)0001 を送信したとき、Arduino は 6 (バイナリ)0110 をどのように受信しますか?
[/編集]

他のヒント

私はあなたがただ欲しいと思います out.write(i) ここ。 8つの低次のビットのみがINT引数から書かれています i.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top