我在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()
致谢。
答案 0 :(得分:1)
您的代码存在一些问题:
您不需要每次都循环连接到MySQL数据库。
符合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()