Python: сбой последовательной связи с преобразователем USB в последовательный порт

Я пытаюсь написать код, который взаимодействует с последовательным интерфейсом, используя преобразователь USB в последовательный порт. Я запускаю свой код в ОС Ubuntu 12.04. Я подключил устройство, и похоже, что оно распознано системой, так как вывод lsusb дает мне:

Bus 002 Device 003: ID 9710:7840 MosChip Semiconductor MCS7820/MCS7840 2/4 port serial adapter

а команда dmesg сообщает:

Tue Apr 18 15:22:07 2017] usb 2-2: new high-speed USB device number 3 using ehci_hcd
[Tue Apr 18 15:22:07 2017] usbcore: registered new interface driver usbserial
[Tue Apr 18 15:22:07 2017] USB Serial support registered for generic
[Tue Apr 18 15:22:07 2017] usbcore: registered new interface driver usbserial_generic
[Tue Apr 18 15:22:07 2017] usbserial: USB Serial Driver core
[Tue Apr 18 15:22:07 2017] USB Serial support registered for Moschip 7840/7820 USB Serial Driver*
[Tue Apr 18 15:22:07 2017] mos7840: 1.3.2:Moschip 7840/7820 USB Serial Driver
[Tue Apr 18 15:22:07 2017] mos7840 2-2:1.0: Moschip 7840/7820 USB Serial Driver converter detected
[Tue Apr 18 15:22:07 2017] usb 2-2: Moschip 7840/7820 USB Serial Driver converter now attached to ttyUSB0
[Tue Apr 18 15:22:07 2017] usb 2-2: Moschip 7840/7820 USB Serial Driver converter now attached to ttyUSB1
[Tue Apr 18 15:22:07 2017] usb 2-2: Moschip 7840/7820 USB Serial Driver converter now attached to ttyUSB2
[Tue Apr 18 15:22:07 2017] usb 2-2: Moschip 7840/7820 USB Serial Driver converter now attached to ttyUSB3
[Tue Apr 18 15:22:07 2017] usbcore: registered new interface driver mos7840

Однако, когда я пытаюсь запустить свой код, я не получаю ожидаемого ответа от другой стороны. Код, который я запускаю, находится здесь:

class RTSSerial(object):

    def __init__(self,serialID, baud):
        self.serialID = serialID
        self.baud = baud
        try:
            self.serDevice = serial.Serial(self.serialID, 
                                           baudrate = self.baud,
                                           parity = serial.PARITY_NONE,
                                           stopbits = serial.STOPBITS_ONE,
                                           bytesize = serial.EIGHTBITS)
            self.serDevice.flushInput()
            self.serDevice.flushOutput()
        except Exception as e:
            print 'Got the following exception: ', e

    def read(self):        
        try:
            inWaiting = self.serDevice.inWaiting()
        except:            
            if os.path.exists(self.serialID):
                self.serDevice = serial.Serial(self.serialID,self.baud)
            inWaiting = 0

        try:
            rec = ''
            if (inWaiting > 0):
                rec = self.serDevice.read(inWaiting)
                #Convert string message into list of integers        
            message = [ord(x) for x in rec]        
        except Exception as e:
            message = []
            print 'Got the following exception: ', e

        return message

    #Function to write to serial
    #message should be a list. Then the function converts it into a string
    def write(self, message):      
        try:
            #Convert message into string
            messageToSend = "".join(chr(x) for x in message)        
            errCode = self.serDevice.write(messageToSend)
        except Exception as e:
            errCode = 0
            print 'Got the following exception: ', e

        return errCode

ser = RTSSerial('/dev/ttyUSB0', 9600)    
mess = [0x7e, 0xa, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x8a]
ser.write(mess)
time.sleep(1)
reply = ser.read()

Я ожидаю ответа типа:

0x7E 0x04 0x00 CRC1 CRC2

но вместо этого я получаю:

0x7e 0xd 0xa 0x43 0x20 0x69 0x6e 0x74 0x65 0x72 0x70 0x3a 0x20 0x73 0x79 0x6e 0x74 0x61 0x78 0x20 0x65 0x72 0x72 0x6f 0x72 0x2e 0xd 0xa 0x2d 0x3e 0x20 0x3f 0x4d 0xd 0xa 0x43 0x20 0x69 0x6e 0x74 0x65 0x72 0x70 0x3a 0x20 0x74 0x6f 0x6b 0x65 0x6e 0x20 0x27 0x10 0x27 0x20 0x6e 0x6f 0x74 0x20 0x72 0x65 0x63 0x6f 0x67 0x6e 0x69 0x7a 0x65 0x64 0x2e 0xd 0xa 0x2d 0x3e 0x20

Есть ли что-то, что я пропускаю здесь? Заранее спасибо!


person toti08    schedule 19.04.2017    source источник
comment
У вас есть что-нибудь для отладки последовательного порта? Как анализатор протоколов? Может размах?   -  person DSLima90    schedule 19.04.2017
comment
К сожалению, нет... Сейчас я попытаюсь соединить два выхода преобразователя вместе и посмотреть, смогу ли я писать на одной стороне и читать на другой.   -  person toti08    schedule 19.04.2017
comment
Хорошо, попробовал это, и это сработало... так что я предполагаю, что что-то не так с другим компьютером...   -  person toti08    schedule 19.04.2017
comment
Может ошибка в скорости передачи? Что за другое устройство? Когда я работаю со встроенными устройствами, мне почти всегда приходится немного изменять скорость...   -  person DSLima90    schedule 19.04.2017
comment
Другое устройство представляет собой плату MVME 4100 с микроконтроллером PowerPC. Код написан с использованием VxWorks, а скорость передачи установлена ​​на 9600 с обеих сторон...   -  person toti08    schedule 19.04.2017
comment
Да, ваш код Python в порядке, возможно, какая-то конфигурация (или ошибка) в другом устройстве...   -  person DSLima90    schedule 19.04.2017
comment
Думаю, да, я продолжу расследование! Спасибо большое за вашу помощь!   -  person toti08    schedule 19.04.2017


Ответы (1)


Если вы просмотрите этот результат в ASCII вместо шестнадцатеричного, вы получите:

~
C interp: syntax error.
-> ?M
C interp: token '' not recognized.
-> 

(Токен в кавычках — шестнадцатеричный 0x10, один из символов, которые вы пытаетесь отправить.) Итак, ваш последовательный прием работает нормально — вы просто не получаете ожидаемых результатов. Похоже, что другая система находится в текстовой подсказке и не ожидает отправляемого вами двоичного пакета. Возможно, сначала вам нужно будет отправить какую-то команду, чтобы перевести его в правильный режим.

person jasonharper    schedule 11.07.2017
comment
Спасибо за подсказку, это полезно! Я решил проблему, перепрограммировав другую плату, возможно, она была повреждена. Но я должен принять это во внимание на будущее! - person toti08; 11.07.2017