私は周りを検索しましたが、この問題の解決策を見つけることができません。私はこれをテストするために私が考えることができる最も簡単な例を使用しています。これは処理コードです:
void setup() {
Serial.begin(9600);
}
void loop() {
for(int i =48;i<51;i++) {
Serial.write(i); //writes 0-2 in ascii and 48-51 in bytes.
}
}
シリアルモニターで出力を見ると、「012012012012012012012」などが問題なく正しく表示されます。データを表示するための処理で簡単なプログラムを作成しました。
import processing.serial.*;
Serial myPort;
void setup() {
String[] ports =Serial.list();
myPort = new Serial(this, ports[1], 9600);
}
void draw() {
if (myPort.available() >=10)
{
byte[] serialIn = new byte[10];
myPort.readBytes(serialIn);
for (int i =0;i<serialIn.length;i++)
{
println(serialIn[i] +" binary:"+ binary(serialIn[i]));
}
}
}
ほとんどの場合、ジャンクを印刷します。
-126 binary:10000010
-118 binary:10001010
-110 binary:10010010
-126 binary:10000010
-118 binary:10001010
-110 binary:10010010
そして時々それは正しい値を出力します:
48 binary:00110000
49 binary:00110001
50 binary:00110010
48 binary:00110000
49 binary:00110001
50 binary:00110010
プログラムを実行するたびに動作が異なる理由はわかりませんが、各バイトが3ビット左にシフトしているように見えます。興味深いことに、arduinoに0,1,2を送信させると、ガベージが出力されることはありません。
本当にC#でデータを読みたいです。これは、次の例に基づくC#コードの要点です:http: //msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-。 NET.aspx
if (serialPort.BytesToRead >0)
{
byte temp = (byte)serialPort.ReadByte();
Console.WriteLine(temp +"\t binary: " +byte2Binary(temp));
}
正しい値のいくつかを出力しますが、多くの場合、数値を見逃し、ゴミが散在しています。
130 binary: 10000010
138 binary: 10001010
48 binary: 00110000
49 binary: 00110001
50 binary: 00110010
146 binary: 10010010
49 binary: 00110001
50 binary: 00110010
49 binary: 00110001
50 binary: 00110010
146 binary: 10010010
49 binary: 00110001
50 binary: 00110010
48 binary: 00110000
138 binary: 10001010
146 binary: 10010010
誤ったデータのバイナリ値は、処理中のバイナリ値とまったく同じです。ここで、3ビットシフトは、実行するたびに一貫しているのではなく、実行時にランダムに見えます。シリアルコマンドの送信の間に最大200msの遅延を入れてみました。それは少し役に立ちますが、それでも少なくとも10%のジャンクデータを取得します。制御ループを実行しようとしているので、許容できる最長の遅延は3msです。これを修正するにはどうすればよいですか?
ありがとう