【发布时间】:2021-05-09 12:48:10
【问题描述】:
我目前正在制作一个 arduino 监控设备。数据在 Python 中收集,然后通过串口将字符串发送到 arduino。
在 Python 中,字符串如下所示:
cpu1 = space_pad(int(my_info['cpu_load']), 2)
cpu2 = space_pad(int(my_info['cpu_temp']), 2)
cpu3 = space_pad(int(my_info['cpu_fan']), 5)
# Send the strings via serial to the Arduino
arduino_str = \
'A' + cpu1 + '|B' + cpu2 + '|C' + cpu3 + '|'
if serial_debug:
print(arduino_str)
else:
ser.write(arduino_str.encode())
理想情况下,我想让这个字符串尽可能大,包括 10 个变量,我想将它们发送到 arduino。
arduino 代码查看字符串,它应该读取字符串的一部分并将它们整齐地放置在显示器上,每个都在它自己的保留空间中。
问题是我得到了乱码的结果。当字符串仅由一个变量组成时,它会显示得很好,应该在哪里,应该在哪里。
当向字符串添加一个额外的变量时,代码会中断,它会混合结果或混乱地显示它们。我的变量都是干净的,只是数字,没什么花哨的。
下面是我在arduino上使用的代码
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Library for LCD
LiquidCrystal_I2C lcd(0x27,20,4); // I2C address 0x27, 20 column and 4 rows
String inputString = ""; // String for buffering the message
boolean stringComplete = false; // Indicates if the string is complete
unsigned long previousUpdate = 0; // Long to keep the time since last received message
void printInitialLCDStuff() {
lcd.setCursor(0, 0);
lcd.print("CPU ");
lcd.setCursor(7, 0);
lcd.print("%");
lcd.setCursor(11, 0);
lcd.print("C");
lcd.setCursor(17, 0);
lcd.print("RPM");
lcd.setCursor(0, 1);
lcd.print("GPU ");
lcd.setCursor(7, 1);
lcd.print("%");
lcd.setCursor(11, 1);
lcd.print("C");
lcd.setCursor(17, 1);
lcd.print("RPM");
lcd.setCursor(0, 2);
lcd.print("MEM");
lcd.setCursor(8, 2);
lcd.print("MB");
lcd.setCursor(17, 2);
lcd.print("PWM");
lcd.setCursor(0, 3);
lcd.print("RAM ");
lcd.setCursor(8, 3);
lcd.print("GBU");
lcd.setCursor(17, 3);
lcd.print("GBF");
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '|') {
stringComplete = true;
}
}
}
void setup() {
// Setup LCD
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
lcd.setCursor(0, 0);
printInitialLCDStuff();
// Setup serial
Serial.begin(9600);
inputString.reserve(200);
}
void loop() {
serialEvent();
if (stringComplete) {
// CPU1
int cpu1StringStart = inputString.indexOf("A");
int cpu1StringLimit = inputString.indexOf("|");
String cpu1String = inputString.substring(cpu1StringStart + 1, cpu1StringLimit);
lcd.setCursor(4, 0);
lcd.print(cpu1String);
// CPU2
int cpu2StringStart = inputString.indexOf("B", cpu1StringLimit);
int cpu2StringLimit = inputString.indexOf("|", cpu2StringStart);
String cpu2String = inputString.substring(cpu2StringStart + 1, cpu2StringLimit);
lcd.setCursor(9, 0);
lcd.print(cpu2String);
// CPU3
int cpu3StringStart = inputString.indexOf("C", cpu2StringLimit);
int cpu3StringLimit = inputString.indexOf("|", cpu3StringStart);
String cpu3String = inputString.substring(cpu3StringStart + 1, cpu3StringLimit);
lcd.setCursor(13, 0);
lcd.print(cpu3String);
inputString = "";
stringComplete = false;
previousUpdate = millis();
}
}
我的代码很脏,而且主要是对另一个代码的改编,因为虽然我可以阅读代码,但我不擅长编写它。如果我犯了让任何人畏缩的可怕错误,我深表歉意。我承认我只是涉足编码。这也是我经常在代码中做注释的原因。
我希望我的显示器显示如下:
CPU 60% 45C 900RPM
在哪里
cpu1=60
cpu2=45
cpu3=900
“CPU”、“%”、“C”和“RPM”是由 arduino 在 printInitialLCDStuff() { 而不是 Python 上编写的。
相反,我得到了这个
CPU B45% B45|B45|C
然后 RPM 在第 3 行 (0,0) 列为"900|"
理想情况下,我想扩展字符串排序以收集大约 10 个变量。
在我看来,问题出在 arduino 代码中,因为 Python 脚本有点检查并正确输出字符串。但我可能是错的。
问题是:我是否使用了错误的代码来提取这些变量并将它们放在显示器上的保留空间中?
我应该使用其他东西来完成工作吗?过去 3 天我一直在查看文档,但找不到有类似情况的人。我在这里发现了一些问题,但又不是我想要的。
感谢任何帮助。在过去几天每天尝试数小时后,我对这段代码感到非常沮丧,我愿意用 Steam 数字礼品卡奖励任何可以帮助我使用此代码的人,以表达我的感激之情。
最好的问候, M
【问题讨论】:
-
首先,您的python代码中的前缀
A、B是多余的,将数据发送为cpu1|cpu2|cpu3会更容易更好。这将使解析更容易。 -
其次,Arduino是C++,尽量学习C++,不要用python的方式写Arduino代码。了解如何使用strtok 将数据解析为数组,然后您可以循环遍历数组并将其打印到显示器上。
-
嗨@hcheung,感谢您抽出宝贵时间回答这个问题。我有点理解你对 A、B 是多余的意思的理解,但我不太确定如何在它们缺席的情况下以一种可行的方式定义代码?什么会限制每个较小的字符串“提取”?至于学C++,我有一点时间就去学,这很难得。