[英]Pyserial problem with Arduino - works with the Python shell but not in a program
[英]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
, \n
和r
。 不幸的是,您逃脫了反斜杠,因此您實際上是在剝離\
, r
和n
。 \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.00
到100.00
之間的任何東西。
所以使用 readline 你會收到r 0.00\r\n
第一個和最后兩個字符始終存在,我們可以使用[2,-2]
來獲取中間的數字,無論其長度如何。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.