将数据发送到从串行端口接收的MySQL

时间:2019-05-29 22:05:51

标签: python mysql python-3.x arduino

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

“ MySQLdb._exceptions.ProgrammingError:%b需要类似字节的对象,或实现 bytes 而不是'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()

致谢。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

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

  2. 符合docs

      

    从该库返回的信息是以下格式的字典:

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

    id字段始终是数据包类型的可读名称   收到。上面显示的所有带有键“ param”的以下字段均已映射   二进制数据到包含在   接收到的数据帧。

因此value是字典类型,您需要使用param键,它是有效数据。我不确定您的示例中的param是什么,但是您可以简单地放入print(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()