2

私は周りを検索しましたが、この問題の解決策を見つけることができません。私はこれをテストするために私が考えることができる最も簡単な例を使用しています。これは処理コードです:

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です。これを修正するにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

シリアルモニターで出力を見ると、正しく印刷されます

そして時々それは正しい値を出力します:

これは設定ミスを示しています。たとえば、4800ボーを試してください。そして多分他の特性(ストップビット、ハンドシェイク)をチェックしてください。

于 2012-09-28T11:11:59.217 に答える