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 しか返されないため、データを受信していないようです。
ありがとうございました