2

Linux Mint 15 で Arduino と C を使用して単純な SLAM プロジェクトを実装しようとしています。Arduino プロジェクトは、Bluetooth (シリアル) 経由でノートブックにデータを送信しています。データは C プログラムによって読み取られます。Arduinoシリアルではデータが正しく表示されますが、ノートブックでは受信データが間違っています。(画像の白はArduinoのデータです。ターミナルは「受信した」データを示しています。)

送信d080x096y099z035(たとえば) と受信99z0356y0999z035(順不同?) を行っています。

それで、私はいくつかの質問があります:

  1. read()C でコマンドを作成し、正しい順序と長さでデータを読み取るにはどうすればよいですか? (次数: d000x000y000z000、長さ = 16)

  2. Arduinoの送信機能で、 と を使って長さの違いはSerial.print(char buffer[])ありSerial.println(char buffer[])ますか? '\n'(バッファの最後に a または何かを追加するようなものですか?)

  3. delay()この関数を Arduino コードと C コードのどちらで使用する必要がありますか?

アルドゥイーノでは:

...
int buffer_size = 17;
char  buffer[17];

//void setup()

void loop(){
  //create the string resp = "d000x111y222z333"
  ...
  resp.toCharArray(buffer, buffersize);
  bluetooth.print(buffer);
  delay(200);
}

Cプログラムでは:

...
int fd = open("/dev/rfcomm4", O_RDONLY | O_NOCTTY | O_NDELAY);
printf("fd code %d\n", fd);
if (fd == -1)
{
  gchar *msg = "open_port: Unable to open /dev/rfcomm4";
  gtk_label_set_text(GTK_LABEL(label), msg);
  perror("error: ");
}

char buffer[17];
int n;

printf("entering in loop...\n");

while (1)
{
  n = read(fd, buffer, sizeof(buffer));
  printf("%s\n", buffer);
}
4

1 に答える 1

0

申し訳ありませんが、私は専門家ではありませんが、質問に関して確認できるいくつかのアイデアにすぎません。

1)Python AFAIKはファイルがユニコードであると想定しているため、エンコーディングに問題がある可能性があると思います。だから試してみるopen (.... ,encoding='ascii')か、使用するエンコーディングは何でも

また、GTK メインスレッドをブロックする可能性があることにも注意してください。これにより、UI に大幅な遅延が発生します。したがって、更新リクエストを送信する場合は、シリアル ポートを読み取り、内部バッファーを埋めるための独自のスレッドを作成することをお勧めします。これは、GTK メインスレッドによってレンダリングされます 。 .html

于 2013-10-31T11:07:33.370 に答える