2

USBポートを介してArduino Mega 2560からXubuntuで実行されているCプログラムに情報を取得する方法を見つけようとしています。

出発点として使用できる最も単純な例をまとめようとしています。

Arduino IDE にはいくつかの素晴らしい基本的な例が付属しています。そのうちの 1 つはGraphで、ポテンショメータやその他のアナログ センサーからの値を単純に出力します。

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(A0));
  delay(2);
}

そこに問題はありませんが、私のコンピューターで実行され、データを受信するプログラムに関しては、これまでのところ私が持っているものです(これを読んでさらに掘り下げた後に更新されました):

/* prints the output from an Arduino running the "Graph" example.
 */

#include <stdio.h>
#include <sys/fcntl.h>
#include <termios.h>

int main(void)
{
  int fd = 0;
  char buffer[32];
  int n;
  fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
  while(1)
  {
    read(fd, buffer, sizeof(buffer));
    n = atoi(buffer);
    printf("%d\n", n);
  }
  close(fd);
}

これはほとんど機能しますが、取得しているよりも多くのメッセージが欠落しているように見え、多くのメッセージが不完全です。

途中で設定できるオプションとフラグがいくつかありますが、どれを設定するかを決めるのに苦労しています。

最終的には、Arduino を介して実行されているさまざまなセンサーを使用して、コンピューターで実行されている SDL ベースのアプリケーションを制御する予定ですが、その文字列を取得できたらすぐに、慣れ親しんだ領域に戻る必要があります。

4

2 に答える 2

0

バッファには複数のメッセージを含めることができます (また、その可能性があります)。また、不完全なメッセージが含まれている場合もあります (read()呼び出しは、要求したすべてのデータを読み取る前に返される場合があります)。

たとえば、受け取ったデータが - で'\n'区切られた (または'\0'、またはspaceなど) のテキスト形式の数値のストリームである場合、バッファーは最終的に のようになり0123\n4567\n89abます。次に、 を呼び出すと 123atoi()に変換0123され、バッファに残っているすべてのデータを破棄しながら、ループの次の繰り返しにスキップします。

于 2012-12-25T03:37:40.860 に答える