1

リンクが正常に確立され、データを送信できるようになりました。

Androidは、変更するたびにSeekBarデータを送信します。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if(seekBar.getId() == R.id.seekBar)
    {
        speed.setText(String.valueOf(progress));
        String outputData = String.valueOf(progress);
        streams.write(outputData.getBytes());
    }
}

streams.write()OutputStreamのにデータを書き込みますSocket

データのフォーマットに問題があります。「25」を送信すると、arduinoは「2」、「5」を受信しますSerial.read()

outputDataバイトに変換されるときのデータの形式は何ですか?すべてがで終了し\0ますか?

1桁ではなく整数を取得する必要があります。

4

3 に答える 3

1

arduinoboardはRX-Streamをバイトごとに読み取っているようです。「25」を送信すると、文字「2」のASCIIバイト(0x32 / 10進数の50)が送信され、次に文字「5」のASCII表現(0x35 / 10進数53)が送信されます。arduinoはこれらの数字を文字として解釈します。したがって、送信する数が256未満の場合は、次のことができます。Androidの場合:

if(seekBar.getId() == R.id.seekBar)
    {
        speed.setText(String.valueOf(progress));
        if(progress<256)
            streams.write((byte)progress);
    }

Arduinoがそれを正しく解釈することを確実にするために、受信した文字を文字としてではなく短いものとして使用してください。

お役に立てれば

于 2013-02-15T11:53:42.830 に答える
1

送信側の場合、getBytes()はnullターミネータを含むC文字列を返しません。Javaでは、配列にはその長さに関する情報が含まれています。したがって、byte[]にはその長さが含まれます。これは、配列の終わりを示すためにnullを使用するCchar[]とは異なります。アウトバウンドデータを変換する場合は、ターミネータを自分で追加する必要があります。

String outputData = String.valueOf(progress);
streams.write(outputData.getBytes());
streams.write('\0');

Android側で文字セットのデフォルトのエンコーディングが変更された場合、getBytes()が完全に機能しなくなる可能性があることに注意してください。別のAndroidデバイスでは、getBytes()がUnicode文字セットエンコーディングを返す可能性がありますが、これはArduinoではデコードできません。

于 2013-02-16T19:44:44.163 に答える
0

あなたはintを持っていて、それを文字列に変換して文字列を送信します:

 String outputData = String.valueOf(progress);
 streams.write(outputData.getBytes());

intを送信するのはどうですか:

streams.write( progress );

Arduino側Serial.read()では、一度に1バイトを読み取るため、(ワイヤのエンディアンが大きいと仮定して)次のことができます。

int incomingByte = Serial.read();
incomingByte <<= 8;
incomingByte |= Serial.read();

乾杯、

于 2013-02-15T11:41:59.627 に答える