导致C程序不能在Arduino中正确增加变量的原因是什么?

时间:2017-01-16 23:52:41

标签: python c arduino raspberry-pi microcontroller

我正在尝试在Raspberry PI和Ardunio之间建立连接,其中Python在PI上运行。目标是验证Arduino是否已连接并发送正确的值,连接似乎已建立,因为我在Python终端上收到,但a值未正确,它递增2,有时更多不止两个。 这可能是连接延迟问题吗?串口(USB)问题?

serial_text.ino (在Arduino上运行):

char dataString[50] = {0};
int a =0; 

void setup() {
Serial.begin(9600);              //Starting serial communication
}

void loop() {
 // a++;                          // a value increase every loop
  //sprintf(dataString,"%02X",a); // convert a value to hexa 
  Serial.println(++a);   // send the data
  delay(1000);                  // give the loop some break
}

Serial_test.py (在PI上运行):

import serial

ser = serial.Serial('/dev/ttyACM0',9600)
s = [0,1]
while True:
    read_serial=ser.readline()
    s[0] = str(int (ser.readline(),16))
    print "a value from controller = ", s[0]
    //print read_serial

输出(在PI屏幕上):

enter image description here

更新 我做了一些改变,但它仍然是同样的问题,这里是变化:

serial_text.ino (在Arduino上运行):

int a =0; 

void setup() {
Serial.begin(9600);              //Starting serial communication
}

void loop() {

  a++;
  Serial.println(a);   // send the data
  delay(1000);                  // give the loop some break
}

对于Python,我只改变了这一行:

s[0] = str(int (ser.readline(),16))

TO:

s[0] = str(int (ser.readline(),10))

我也删除了//print read_serial以防万一。

输出:

enter image description here

1 个答案:

答案 0 :(得分:2)

好的,基本上这里发生了什么:当你做这样的事情时:

Serial.println(a);

它将数字作为ASCII编码的十进制发送,所以基本上如果你发送整数值12,它将发送字符串" 12"。递增部分在这里工作正常。

为什么跳绳会发生?如果你仔细查看你的代码,你可以看到,在while循环的每次迭代中,有两次调用ser.readline(),这使得跳过每一个数字。

间隙较大的原因是您收到一个十进制字符串并将其视为十六进制字符串。看看这里发生了什么:

>>> int("49", 16)
73
>>> int("51", 16)
81

在十进制中它只是两个的差异,但在十六进制中它是八的差异 - 这解释了更大的差距。