是什么导致 C 程序不能在 Arduino 中正确地递增变量?
What causes a C program not to increment variable correctly in Arduino?
我正在尝试在 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(圆周率运行):
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
OUTPUT(在 PI 屏幕上):
更新:
我做了一些更改,但仍然是同样的问题,更改如下:
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))
收件人:
s[0] = str(int (ser.readline(),10))
为了以防万一,我也删除了 //print read_serial
。
输出:
好的,基本上这里发生了什么:当你做这样的事情时:
Serial.println(a);
它以 ASCII 编码的十进制形式发送数字,所以基本上,如果您发送整数值 12,它将发送字符串“12”。递增部分在这里工作得很好。
为什么会跳字?如果您仔细查看您的代码,您会发现,在 while
循环的每次迭代中,都会调用两次 ser.readline()
这使得每隔一个数字就会跳过一次。
较大差距的原因是您收到十进制字符串并将其视为十六进制字符串。看看这里发生了什么:
>>> int("49", 16)
73
>>> int("51", 16)
81
在十进制中它只是相差二,但在十六进制中它相差八 - 这解释了更大的差距。
我正在尝试在 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(圆周率运行):
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
OUTPUT(在 PI 屏幕上):
更新: 我做了一些更改,但仍然是同样的问题,更改如下:
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))
收件人:
s[0] = str(int (ser.readline(),10))
为了以防万一,我也删除了 //print read_serial
。
输出:
好的,基本上这里发生了什么:当你做这样的事情时:
Serial.println(a);
它以 ASCII 编码的十进制形式发送数字,所以基本上,如果您发送整数值 12,它将发送字符串“12”。递增部分在这里工作得很好。
为什么会跳字?如果您仔细查看您的代码,您会发现,在 while
循环的每次迭代中,都会调用两次 ser.readline()
这使得每隔一个数字就会跳过一次。
较大差距的原因是您收到十进制字符串并将其视为十六进制字符串。看看这里发生了什么:
>>> int("49", 16)
73
>>> int("51", 16)
81
在十进制中它只是相差二,但在十六进制中它相差八 - 这解释了更大的差距。