首页 > 解决方案 > 从 Arduino 到 Raspberry pi 获取读数时出错

问题描述

我有以下代码试图从连接到 Raspberry PI 的 Arduino Uno 获取温度:

import mysql.connector as mariadb
import serial

mariadb_connection = mariadb.connect(user='IOT', password='12345678', database='iotstorage')
ser = serial.Serial('/dev/ttyACM0', 9600)
cursor = mariadb_connection.cursor()
cursor = mariadb_connection.cursor(buffered=True)


while 1:
    t = ser.readline()
    t = str(t)

    sql = "INSERT INTO example (temperature) VALUES (%s)" %(t)

    cursor.execute(sql)
    mariadb_connection.commit()
    cursor.execute("SHOW DATABASES")

它给了我以下错误:

回溯(最后一次调用):文件“/home/pi/Desktop/procedure/sketch_dec03.py”,第 25 行,在 cursor.execute(sql) 文件“/usr/lib/python3/dist-packages/mysql/connector /cursor.py”,第 569 行,在执行 self._handle_result(self._connection.cmd_query(stmt)) 文件“/usr/lib/python3/dist-packages/mysql/connector/connection.py”,第 553 行,在cmd_query 结果 = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) 文件“/usr/lib/python3/dist-packages/mysql/connector/connection.py”,第 442 行,在 _handle_result 中引发 errors.get_exception(数据包)mysql.connector.errors.ProgrammingError:1064(42000):您的SQL语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'b'5.19\r\n')' 附近使用的正确语法

我将如何解决这个问题?

标签: sqlsyntaxmariadbmysql-connector

解决方案


您正在尝试插入一个数字,而来自串行设备的值不是数字。

你可以

  • 在参数标记 %s 周围的 SQL 语句中添加引号:"INSERT INTO example (temperature) VALUES ('%s')" %(t)
  • 或将串行设备中的值转换为有效的十进制数。

一些代码注释:

  • 不要使用 mariadb 作为包模块名称,这可能与 MariaDB Connector/Python 冲突
  • 创建光标一次,而不是使用不同参数创建两次
  • 你真的想在插入温度值后列出所有数据库吗?!

推荐阅读