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
、\n
和 r
。不幸的是,你转义了反斜杠,所以你实际上是在剥离 \
、r
和 n
。
\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.00
和 100.00
之间的任何内容。
所以使用 readline 你会收到
r 0.00\r\n
第一个和最后两个字符始终存在,我们可以使用 [2,-2]
来获取中间的数字,而不管其长度如何。
我写这段代码打印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
、\n
和 r
。不幸的是,你转义了反斜杠,所以你实际上是在剥离 \
、r
和 n
。
\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.00
和 100.00
之间的任何内容。
所以使用 readline 你会收到
r 0.00\r\n
第一个和最后两个字符始终存在,我们可以使用 [2,-2]
来获取中间的数字,而不管其长度如何。