树莓派和Arduino读取串行传感器数据

3
我有一个电压传感器连接到我的Arduino uno,然后Arduino又连接到我的树莓派3。我想以乒乓球的方式从Arduino获取传感器信息,并将传感器值存入mysql数据库中。我将使用在cronjob上运行的Python脚本发送字符来唤醒它,然后抓取传感器值并放入mysql数据库中。
将来我还想向Arduino添加更多传感器。
我遇到的问题是Python代码运行时只得到一条空白黑线。
树莓派3 Python代码:
#!/usr/bin/python

import serial 
import MySQLdb
import time

db = MySQLdb.connect(host="localhost",    
                 user="user",        
                 passwd="password", 
                 db="database")        

cur = db.cursor()

port = serial.Serial("/dev/ttyACM0", baudrate = 9600, timeout=None)
port.flushInput()      

sensor1 = 0;
sensor2 = 0;
sensor3 = 0;

vals = []

while (port.inWaiting()==0):
port.write("*")
time.sleep(1)

vals = (port.readline()).split(',')
print vals
sensor1 = int(vals[0])
sensor2 = int(vals[1])
sensor3 = int(vals[2])
cur.execute("insert into voltage(volts) values(" + str(Battout) + ")" ) 

cur.execute("SELECT * from voltage")

db.close()

Arduino代码:

const int BattVolt = A0;

int BattVal = 0;
float Battout;          

void setup() {
Serial.begin(9600);
}


void loop() {

Serial.flush();
while(!Serial.available());  //wait for character from raspi
delay(1000);

float Voltage;
BattVal = analogRead(BattVolt);  //read analog pins
Voltage=BattVal/4.09;
Battout=(Voltage/10);

Serial.print(Battout);
Serial.print(",");

}

你在 Python 脚本中为什么使用 str(Battout) - dubafek
2个回答

2

以下是关于你的实现的一些观察。

  1. 为什么在Python脚本中使用了Battout

  2. 在Python脚本中,您期望接收一行(即以'\n'结尾的字符串),但在Arduino C++代码中,您使用print而不是println或添加换行符。

  3. 显然,您期望在Python脚本中收到类似于“12,32,15,”的内容,但如果您只向Arduino发送一个字符,则它将仅执行主循环的1次迭代。


谢谢,只是Arduino中没有添加新行的一个简单错误就解决了一切。 - Bibsta

0

树莓派3和uart0(蓝牙)以及uart1(串口)存在问题。
对于树莓派3,uart1通常在/dev/ttyS0和TX-GPIO 14、RX-GPIO 15上可用。
uart1的波特率取决于核心时钟。因此,如果核心时钟发生变化,则波特率也会改变!
解决方法1:/boot/config.txt中添加一行core_freq=250。保存并重新启动!现在您的树莓派具有恒定的核心频率。树莓派3 UART波特率解决方法
解决方法2:更改设备树,使用uart0进行串口通信,使用uart1进行蓝牙通信(现在蓝牙也存在同样的问题)。树莓派3兼容性(禁用BT和串口重映射修复)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接