pyserial 中 python 和 arduino 的问题

Problem with python and arduino in pyserial

我写这段代码打印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 个字节并不是一个好主意。 (实际上这几乎不是一个好主意)

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

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

在第一个 运行 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] 来获取中间的数字,而不管其长度如何。