首页 > 解决方案 > 从串口接收到的数据发送到 MySQL

问题描述

我在python中有这段代码,它的作用是读取来自串口的数据;数据从一个 XBee 发送,另一个 XBee 接收,第二个 XBee 连接到计算机端口,它接收到的数据是我读取的,然后我尝试将此数据发送到 mysql 数据库,但我发送以下错误:

“MySQLdb._exceptions.ProgrammingError: %b 需要一个类似字节的对象,或者一个实现字节的对象,而不是'dict'”

代码:

import serial
from xbee import XBee
import MySQLdb

serial_port = serial.Serial('COM5', 9600)
xbee = XBee(serial_port)

while True:
    try:
        value = xbee.wait_read_frame()
        sql_conn = MySQLdb.connect('localhost', 'root', 'pass', 'XBee')
        cursor = sql_conn.cursor()
        cursor.execute("INSERT INTO xbeedata (value) VALUES (%s)", (value))
        data = cursor.fetchall()
        cursor.close()
        print (xbee.wait_read_frame())


    except KeyboardInterrupt:
        break

serial_port.close()

问候。

标签: pythonmysqlpython-3.xarduino

解决方案


您的代码存在一些问题:

  1. 您不需要每次都在循环中连接到您的 MySQL 数据库。

  2. 根据文档

    从这个库返回的信息是一个字典,格式如下:

    {'id':str,
     'param':binary data,
     ...}
    

    id 字段始终是接收到的数据包类型的人类可读名称。所有后续字段,如上所示,带有键“param”,将二进制数据映射到接收到的数据帧中包含的每个可能字段。

所以这value是一个字典类型,你需要使用param你的有效数据的键。我不确定param您的示例中的内容是什么,但您可以简单地输入 aprint(value)并查看结果。如果您仍然坚持要添加value到表中,则需要将其序列化为 JSON 字符串。

import serial
from xbee import XBee
import MySQLdb
import json
from pprint import pprint


serial_port = serial.Serial('COM5', 9600)
xbee = XBee(serial_port)

sql_conn = MySQLdb.connect('localhost', 'root', 'pass', 'XBee')
cursor = sql_conn.cursor()

while True:
    try:
        value = xbee.wait_read_frame()
        if value:
            pprint(value)
            # Assumed results in 'rf_data' ('param') key
            # the 'rf_data' is byte string so it is better to decode it first
            cursor.execute(
                """INSERT INTO xbeedata (value) VALUES ('%s')""" % (value['rf_data'].decode()))
            # or if you want to insert whole value
            # cursor.execute(
            #     """INSERT INTO xbeedata (value) VALUES ('%s')""" % (json.dumps(value)))
            sql_conn.commit()

    except KeyboardInterrupt:
        break

sql_conn.close()
serial_port.close()

推荐阅读