簡體   English   中英

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')

如您所見,土壤傳感器重復兩次:土壤傳感器重復兩次

我希望值以數字的形式正確顯示

您應該注意的第一件事是,通過串行接口發送數字將根據位數產生不同的字符串長度。 所以讀取固定數量的 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]來獲取中間的數字,無論其長度如何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM