Отправить данные в MySQL, полученные из последовательного порта - PullRequest
0 голосов
/ 30 мая 2019

У меня есть этот код на 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()

С уважением.

1 Ответ

1 голос
/ 30 мая 2019

Есть некоторые проблемы с вашим кодом:

  1. Вам не нужно каждый раз подключаться к базе данных MySQL в цикле.

  2. В соответствии с документами :

    Информация, возвращаемая из этой библиотеки, представляет собой словарь в следующем формате:

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

    Поле id - это всегда читаемое имя типа пакета. получено. Все последующие поля, показанные выше с ключом «парам», карта двоичные данные для каждого из возможных полей, содержащихся в полученный кадр данных.

Таким образом, 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()
...