1

そのため、C# プログラムを介して int を arduino に送信しようとしています。私は C# プログラムと arduino がうまくやり取りしています。単一の ASCII バイトを問題なく送信し、arduino を反応させることができます。ただし、より大きな値 (たとえば 35) を送信しようとすると、arduino がシリアル ポートからその情報を取得し、それを int に変換して、後でその値をいくつかの数学関数に使用できるようにする方法を理解できます。ヒント/コードはありますか? ありがとうスタックみんな!:)

4

4 に答える 4

1

マイクロへの通信は良好であると述べているため、ここでは疑似コードのようなものです。arduino の場合:

    char buffer[5]; // or 6 or 7 or... To store numerical chars

数字が近づいていることを arduino に知らせる方法が必要です。番号が次のような「パケット」にパックされているとします。

    [I123]

括弧はパケットの開始と終了を示し、I は整数がデータ ペイロードであることを示します。したがって、Serial.Read() 関数では、パケットの開始 ([) をテストし、次に整数 (I) を示す次の文字をテストする必要があります。残りの文字は、(] を含まずにバッファーに保存する必要があります。 )。次に、value = atoi(buffer) で値を取得します。

/*
 Simple code to read in an integer value sent over the Serial port.
 */

char ch;         // incoming serial character

char chStartPacket = '[';
char chEndpacket =']';
char integerDataType = 'I';
char buf[10];
int index = 0;
int intValue = 0;

void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);

}

void loop()
{
  // assume packet of format [Xddd], where X is packet data type, ddd is data payload
  // this is code which compiles, but not tested. Neither is any check done on the payload data 
  // to ensure good data

  if(Serial.available() > 0){

    if(Serial.peek() == chStartPacket ){
      index = 0;                                // reset index of next integer in buffer
      Serial.read();                            // get rid of start of packet in serial port buffer
    }  
    else if (Serial.peek()  == integerDataType){
      Serial.read();                           // get rid of data type character in serial port buffer
    }
    else if (Serial.peek() == chEndpacket){    // all data received, get integer value
      Serial.read();                           // get rid of end of packet in serial port buffer
      intValue = atoi(buf);
      Serial.println(intValue);                // for visual feedback
    }
    else{                                      //must be payload data, add to buffer
      buf[index] = Serial.read();
      index++;
      buf[index] = '\0';
    }

  }
}
于 2013-05-26T21:14:44.180 に答える
0

目的のプロトコルに少し依存します。コンパクトなデータ形式が必要ですか、それとも人間が読み書きできる形式が必要ですか?

コンパクトなデータ構造を求める場合は、シリアライゼーションの概念を検討する必要があります。手で簡単に読み書きできる形式を好む場合は、何らかのプロトコルを自分で実装する必要があります。まず、後者を提案すると思います。

文字のストリームを文字列にパックできるものから始めて、それをatoi関数にフィードします。

申し訳ありませんが、ここでは調理済みのソリューションではありません。

于 2013-05-26T19:29:59.120 に答える
0

私はすでにここでこの質問に答えました。「atoi」が使えます。C# のコードは非常に単純です。私の回答/リンクには、Arduinoのコードがあります。基本的に、これはプロトコルとして機能します。

于 2013-06-19T13:36:14.070 に答える