Чтение двоичных данных с помощью PySerial из последовательного порта - PullRequest
2 голосов
/ 13 апреля 2011

PyQT 4.7 не имеет унаследованного класса от QIODevice, который позволяет напрямую взаимодействовать с последовательным портом (например, QSerialDevice).Поэтому я подумал, что мне будет проще использовать класс QProcess и реализовать фактическое чтение / запись в последовательный порт из другого процесса, который будет взаимодействовать с моим основным приложением QT с использованием интерфейса QProcess.

Теперь проблема в том,количество отправленных и полученных байтов не совпадает, когда я использую приведенный ниже код. Итак, мой вопрос, как правильно прочитать двоичные данные из последовательного порта и затем переслать все на стандартный вывод?

Это отрывок из моей основной программы QT, которая создает QProcess:

        self.micromouse_socket = QProcess()
        self.micromouse_socket.start("/home/ansis/Source/Perforce-pele/Pele/tools/console/comtalker.py", "")
        self.micromouse_socket.started.connect(self.on_micromouse_socket_started)
        self.label_8.setText("Starting COM...")

И этот процесс будет взаимодействовать с последовательным портом (comtalker.py; неблокирующая часть еще не завершена):

#!/usr/bin/python
import serial
import sys

if __name__ == "__main__":

    ser = serial.Serial(0)

    while 1 :
        x = ser.read(1)
        sys.stdout.write(x)
        sys.stdout.flush()

PS Возможно, проблема в другом месте ине в PySerial.На другом компьютере я пишу в ttyS0 с помощью этой команды "./binary_data_generator> / dev / ttyS0".Тот же код, кажется, работал нормально, когда я отправлял только символы ASCII (текст + цифры)

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Кажется, что PySerial (или библиотека, от которой зависит Pyserial) переводит один символ "0x0a" (\ n) в два символа "0x0d 0x0a" (\ r \ n).Обе конечные точки связи работают в Linux, поэтому я не уверен, почему кто-то вообще хотел бы вообще переводить эти окончания строк ...

Здесь strace указывает, что отправитель отправляет только \ n в ttyS0:

write(1, "M\n", 2)                      = 2
write(1, "\n", 1)                       = 1
write(1, "M\n", 2)                      = 2
write(1, "\n", 1)                       = 1

Во время отладки вывода PySerial я увидел, что каждый \ n имеет префикс \ r.

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

1 голос
/ 13 апреля 2011

Я думаю, что стандартный вывод не в двоичном режиме по умолчанию. То есть байты не ascii, похоже, потеряны. Смотрите этот вопрос , это может помочь.

Если я правильно понимаю, вы хотите использовать стандартный ввод / вывод в качестве канала связи между двумя процессами. Я бы порекомендовал использовать один из многопроцессорных модулей для этого

Надеюсь, это поможет

...