Отправить данные в MySQL, полученные с последовательного порта

У меня есть этот код на питоне, он читает данные, поступающие из последовательного порта; Данные отправляются с одного 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()

С уважением.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
793
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

  2. Согласно документы:

    Information returned from this library is a dictionary in the following format:

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

    The id field is always a human-readable name of the packet type received. All following fields, shown above with the key ‘param’, map binary data to each of the possible fields contained within the received data frame.

Таким образом, 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: не все аргументы преобразуются при форматировании байтов". С уважением

Saul Salcedo 30.05.2019 16:45

Еще нет. С уважением.

Saul Salcedo 30.05.2019 16:50

Можете ли вы добавить полную трассировку к вашему вопросу? Я имею в виду все ошибки.

Masoud Rahimi 30.05.2019 16:53

Да, конечно, это ошибка: " {'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\si‌​te-packages\MySQLdb\ ‌​cursors.py", строка 201, в запросе выполнения = запрос % args TypeError: не все аргументы преобразованы во время форматирования байтов "

Saul Salcedo 30.05.2019 16:55

Теперь я получаю эту ошибку: "Теперь я получаю эту ошибку: {'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\si‌​ te-packages\MySQLdb\‌​cursors.py", строка 201, в запросе выполнения = запрос % args TypeError: не все аргументы преобразованы во время форматирования байтов " .....

Saul Salcedo 30.05.2019 17:11
" Во время обработки вышеуказанного исключения возникло другое исключение: Traceback (последний последний вызов): файл "leerxbee.py", строка 21, в <module> "INSERT INTO xbeedata (value) VALUES (%s)", (value ['rf_data'].decode())) Файл "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\si‌​te-packages\MySQLdb\‌​cursors.py", строка 203, при выполнении поднять ProgrammingError(str(m)) MySQLdb._exceptions.ProgrammingError: не все аргументы преобразованы во время форматирования байтов "
Saul Salcedo 30.05.2019 17:12

Я удалил форматирование из вашего запроса, проверьте новый, теперь он должен работать. Я также исправил кортеж для добавления одного элемента.

Masoud Rahimi 30.05.2019 17:14

Что такое таблица xbeedata, сколько в ней столбцов? Я не уверен насчет типа value, который вы пытаетесь вставить. Это капля? Можете ли вы опубликовать запрос SQL для таблицы?

Masoud Rahimi 30.05.2019 17:30

Таблица xbee имеет 2 столбца, идентификатор и значение, значение имеет тип varchar. Это структура таблицы: drive.google.com/file/d/1o13NDU-_VEP0xQm1aT2SRcRynJ1cjT8g/…

Saul Salcedo 30.05.2019 17:36

Хорошо, значение представляет собой строку, а value['rf_data'] — строку байтов. попробуй это cursor.execute("""INSERT INTO xbeedata (value) VALUES ('%s')""" % (value['rf_data'].decode()))

Masoud Rahimi 30.05.2019 18:02

Я отредактировал код, но лучше использовать cursor.execute("INSERT INTO xbeedata (value) VALUES (%s)", (value['rf_data'].decode(),)), так как используется paramtererize sql.

Masoud Rahimi 30.05.2019 18:19

Спасибо, М. Р. С уважением.

Saul Salcedo 30.05.2019 18:33

Другой вопрос, значение, которое я получаю, таково: «ArduinoA_BtnA=1». Есть ли способ разделить строку и поместить «1» в другой столбец?

Saul Salcedo 30.05.2019 18:37

Почему бы и нет, вы можете использовать result = 'ArduinoA_BtnA=1'.split(" = "), тогда result[0] — строка, а result[1] — число.

Masoud Rahimi 30.05.2019 19:19

Другие вопросы по теме