【问题标题】:Problem with python and arduino in pyserialpyserial中python和arduino的问题
【发布时间】:2022-01-17 18:21:00
【问题描述】:

我写了这段代码用Python打印传感器值,但问题是soil_sensor打印了两次。

这是 Arduino 中的代码:

#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 8
#define DHTTYPE DHT11
int msensor = A0;
int msvalue = 0;
int min = 0;
int max = 1024;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  pinMode(msensor, INPUT);
  dht.begin();
}

void loop() {
    msvalue = analogRead(msensor);
  float percentage = (float)((msvalue - min) * 100) / (max - min);
  percentage = map(msvalue, max, min, 0, 100);
  Serial.print("r ");Serial.println(percentage);
   int h = dht.readHumidity();
   int t = dht.readTemperature();
   Serial.print ("h ");
   Serial.println (h);
   Serial.print ("c ");
   Serial.println (t);
  delay(2000);
}

这是 Python 中的代码:

from time import sleep
import serial

arduinoP1 = serial.Serial(port="/dev/ttyUSB0", baudrate=9600)

def rtot():
    arduino_data = arduinoP1.read(6)
    str_rn = arduino_data.decode()
    sleep(1)
    return str_rn
for x in range(3):
    i = rtot()
    if "r" in i:
        v1 = int(float(i[1:5].strip('\\r\\nr')))
        print(v1, 'soil_sensor')
    if "c" in i:
        print(i[1:2], 'temperature_sensor')
    if "h" in i:
        v3 = int(i[2:4])
        print(v3, 'Humidity_sensor')

如您所见,土壤传感器重复了两次: soil sensor is repeated twice

我希望数值以数字的形式正确显示

【问题讨论】:

  • 您错误地假设整个发送的字符串只有 6 个字节长,并且只包含来自单个传感器的数据。并且尝试每 3 秒读取 3 个传感器,当它们每 2 秒发送一次时,也不会起作用。
  • 你有什么解决办法吗?
  • 您的输出与您的代码不匹配。我预计这里会出错。根据您的输出,您的 soil_sensor 值为 0。当您读取第二组 6 个字节时,您会读取类似 "\r\nh 60" 的内容,因此您最终会得到 int("h "),这将导致错误。请使用硬编码值和该代码的实际输出

标签: python c++ python-3.x arduino pyserial


【解决方案1】:

您应该注意的第一件事是,通过串行接口发送数字将根据位数产生不同的字符串长度。 所以读取固定数量的 6 个字节并不是一个好主意。 (实际上这几乎从来都不是一个好主意)

您使用换行符终止每个传感器读数。那么为什么不使用readline 而不是read[6]

在这里 v1 = int(float(i[1:5].strip('\\r\\nr'))),您尝试从收到的字符串中删除\r\nr。不幸的是,您逃脱了反斜杠,因此您实际上是在剥离 \rn\r 实际上是您需要反斜杠来表示回车符的地方。不要逃避它!

在第一次运行中,loop() 将发送类似:

r 0.00\r\nh 40\r\nc 25\r\n

所以前 6 个字节是r 0.00。所以i[1:5] 0.0。 如您所见,没有什么可以逃脱的。 5 也被排除在外,因此您必须使用i[2:6] 来获取0.00。但如上所述,使用固定长度的数字是一个坏主意。您可以在此处接收0.00100.00 之间的任何内容。

所以使用 readline 你会收到 r 0.00\r\n

第一个和最后两个字符始终存在,我们可以使用[2,-2] 来获取中间的数字,无论其长度如何。

【讨论】:

  • 很抱歉我的英语很一般 我目前在代码中修改什么?我了解我正在帮助阅读成为阅读行
  • 是的,您使用 readline 而不是阅读。一旦有了这些行,您就可以提取每行的相同字符串段以获取数字字符串。
  • 非常感谢,本来应该更专注的,最后还是成功了,再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多