【问题标题】:Send data to MySQL received from serial port从串口接收到的数据发送到 MySQL
【发布时间】:2019-05-29 22:05:50
【问题描述】:

我在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()

问候。

【问题讨论】:

    标签: python mysql python-3.x arduino


    【解决方案1】:

    您的代码存在一些问题:

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

    2. 按照docs:

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

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

      id 字段始终是数据包类型的人类可读名称 已收到。以下所有字段,如上图所示,键为“param”,map 二进制数据到包含在其中的每个可能的字段 接收到的数据帧。

    所以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()
    

    【讨论】:

    • 你好,谢谢你的回答,这是我得到的字符串:"{'id': 'rx', 'source_addr_long': b '\x00\x13\xa2\x00A \x97\xeaT', 'source_addr': b '\xf3\n', 'options': b '\x01', 'rf_data': b 'ArduinoA_BtnA = 1'} " 我需要的数据是在'rf_data'中,所以当我运行代码时我将“param”更改为“rf_data”,我收到此错误:“TypeError:并非所有参数都在字节格式化期间转换”。问候
    • 还没有。问候。
    • 您可以为您的问题添加完整的回溯吗?我的意思是所有的错误。
    • 是的,当然,这是错误:" {'id': 'rx', 'options': b'\x01', 'rf_data': b' ArduinoA_BtnA = 1 ', 'source_addr': b'\xf3\n', 'source_addr_long': b'\x00\x13\xa2\x00A\x97\xeaT'} 回溯(最后一次调用):文件“C:\Users\User\AppData \Local\Programs\Python\Python37\lib\site-packages\MySQLdb\cursors.py",第 201 行,在执行查询 = 查询 % args 类型错误:并非所有参数在字节格式化期间转换“
    • 现在我收到这个错误:" 现在我收到这个错误:{'id': 'rx', 'options': b'\x01', 'rf_data': b' ArduinoA_BtnA = 1 ', 'source_addr': b'\xf3\n', 'source_addr_long': b'\x00\x13\xa2\x00A\x97\xeaT'} 回溯(最后一次调用):文件“C:\Users \User\AppData\Local\Programs\Python\Python37\lib\site-packages\MySQLdb\cursors.py",第 201 行,在执行查询 = 查询 % args 类型错误:并非所有参数在字节格式化期间转换" .....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多