0

我正在制作一个脚本来获取 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,因此它似乎没有接收到数据。

谢谢

4

1 回答 1

0
vibeCS.capacitiveSensor(  ) 

返回一个 long(4 个字节)而不是一个 int(2 个字节)。但是它必须是超载的 b/c 它可以让你编译。

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]);
    }

例如,假设 buff 中有一个 int。int 的值为 4242;十六进制的 4242 的值为 [00 00 10 92]

所以 buf[0] = 0x92 = 147 ,

buf[1] = 0x10 = 16 ,

buf[2] = 0x0 = 0,

缓冲区[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 回答