0

USBシリアルを介してraspberry pi(debian wheezy)のシリアル(serial.write)でarduinoから送信された値を取得するスクリプトを作成しています。値は、近接静電容量センサー (capsense ライブラリ) によって送信されます。このコマンドでターミナルウィンドウを開くと

minicom -b 9600 -o -D /dev/ttyACM0

私は(ほぼ)私が望むもの、私の手の近接に反応する文字列を取得します。そのため、送信部分はうまく機能しており、ラズベリーによる受信もうまく機能しています。したがって、C コードで popen() を使用してこれらの値を 4 ブロックずつ取得しました (スペースで区切られた 2 つのセンサー値があるため)。手の届くところまで。さらに、プログラムを開始すると、ctrl+c または ctrl+z を使用しても停止できません。

ここに私のCプログラムがあります:

#include <stdio.h>
#include <stdlib.h>

int main (void) {

    // open a stream with popen with the (working) command    
    FILE *stream = popen("minicom -b 9600 -o -D /dev/ttyACM0", "r");

    while (!feof(stream) && !ferror(stream)) {

        // declare a buffer, read the stream
        char buf[4];
        int bytesRead = fread(buf, 1, 4, stream);

        // print stuff to see what has been read
        int i;
        for(i = 0; i < sizeof(buf); i++) {
            printf("%i", (int)buf[i]);
        }

        printf("\n");
    }

    pclose(stream);
    return 0;
}

そして、ここに私のarduinoのプログラムがあります:

#include <CapacitiveSensor.h>

// sensors
CapacitiveSensor vibeCS = CapacitiveSensor(4,2);
CapacitiveSensor gongCS = CapacitiveSensor(8,7);

// note values
long vibe;
long gong;

void setup() {

  // pin modes
  pinMode(12, OUTPUT);
  pinMode(13, INPUT);

  Serial.begin(9600);
}

void loop() {

    vibe = vibeCS.capacitiveSensor(150);
    gong = gongCS.capacitiveSensor(150);

    // communication
    Serial.write(vibe);
    Serial.write(' ');
    Serial.write(gong);
    Serial.write('\n');

    delay(10);
}

なぜこれが起こっているのですか?

私はまた、次のように問題を見る別の方法にも取り組んでいます。

#include <stdio.h>
#include <stdlib.h>
#include "rs232.h"

#define COMPORT         0x0000      // see explanation below
#define BAUDRATE        9600
#define RECEIVE_CHARS   4

int main (void) {

    // declare a buffer
    unsigned char receive_buffer[RECEIVE_CHARS];

    // open the serial communication
    RS232_OpenComport(COMPORT, BAUDRATE);

    while(1) {

        // poll data from arduino
        RS232_PollComport(COMPORT, receive_buffer, RECEIVE_CHARS);

        // print stuff 
        int i;
        for(i = 0; i < sizeof(receive_buffer); i++) {
            printf("%i", (int)receive_buffer[i]);
        }
        printf("\n");
    }

   RS232_CloseComport(COMPORT);
   return 0;
}

やり方として、私は 0x0000 をコンポートとして使用しましたが、これは正しいものではないと思います。このように設定したので

setserial -g /dev/ttyACM0

私にくれます

/dev/ttyACM0, UART: unknown, Port: 0x0000, IRQ: 0, Flags: low_latency

そのため、端末で見栄えの良いデータが得られた場合、センサーに手を近づけても 0000 しか返されないため、データを受信して​​いないようです。

ありがとうございました

4

1 に答える 1

0
vibeCS.capacitiveSensor(  ) 

int (2 バイト) ではなく long (4 バイト) を返します。ただし、コンパイルできるようにするには、オーバーロードする必要があります。

http://playground.arduino.cc//Main/CapacitiveSensor?from=Main.CapSense

2 プロセッサーをチェックして、プロセッサーがビッグエンドかリトルエンドかを確認する必要がある場合があります。

編集:以下のコードは、あなたがやりたいことをしていないと思います。

    int i;
    for(i = 0; i < sizeof(receive_buffer); i++) {
         i = 
         printf("%i", (int)receive_buffer[i]);
    }

たとえば、バフに 1 つの int があるとします。int の値は 4242 です。16 進数での 4242 の値は [00 00 10 92] です。

だから buf[0] = 0x92 = 147 、

buf[1] = 0x10 = 16 、

buf[2] = 0x0 = 0、

buf[3] = 0x0 = 0;

したがって、コードは 4242 の値に対して 1471600 を出力します。以下のコードは、私が話していることを示しています。

1 #include <stdio.h>
2 #include <stdlib.h>
3 
4 int main()
5 {
6         unsigned char buf[4];
7         unsigned int *fill = buf;
8         *fill = 4242;
9 
10         int i;
11         for(i = 0; i < sizeof(buf); i++) {
12             printf("%i", (unsigned int)buf[i]);
13         }
14 
15 }

printed value is [1461600]

今何か役に立つ。以下のコードは、すべての問題を解決する可能性があります。

#include <stdio.h>
#include <stdlib.h>

int main (void) {

    // open a stream with popen with the (working) command    
    FILE *stream = popen("minicom -b 9600 -o -D /dev/ttyACM0", "r");

    while (!feof(stream) && !ferror(stream)) {

        // declare a buffer, read the stream
        char buf[4];
        int bytesRead = fread(buf, 1, 4, stream);

        // print stuff to see what has been read
        int *i = buf;
        printf("%i", *i);
        //for(i = 0; i < sizeof(buf); i++) {
        //   printf("%i", (int)buf[i]);
        //}

        printf("\n");
    }

    pclose(stream);
    return 0;
}
于 2013-06-24T19:06:08.513 に答える