我正在制作一个脚本来获取 arduino 通过 USB 串行在树莓派(debian wheezy)上的串行(serial.write)上发送的值。这些值由接近电容传感器(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 作为comport,但我认为这不是正确的。我这样设置是因为
setserial -g /dev/ttyACM0
给我
/dev/ttyACM0, UART: unknown, Port: 0x0000, IRQ: 0, Flags: low_latency
因此,如果这在终端中为我提供了漂亮的数据,即使我的手靠近传感器,它也只会提供 0000,因此它似乎没有接收到数据。
谢谢