首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: USB到串行转换器的串行通信失败

Python: USB到串行转换器的串行通信失败
EN

Stack Overflow用户
提问于 2017-04-19 09:10:24
回答 1查看 1.2K关注 0票数 0

我试图用USB到串行转换器编写一个与串行接口对话的代码。我正在Ubuntu12.04操作系统上运行我的代码。我已经附加了这个设备,它看起来被系统识别了,因为lsusb的输出给了我:

代码语言:javascript
复制
Bus 002 Device 003: ID 9710:7840 MosChip Semiconductor MCS7820/MCS7840 2/4 port serial adapter

dmesg命令报告:

代码语言:javascript
复制
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

然而,当我试图运行我的代码时,我无法从对方那里得到预期的答案。我正在运行的代码在这里:

代码语言:javascript
复制
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()

我希望得到这样的答复:

代码语言:javascript
复制
0x7E 0x04 0x00 CRC1 CRC2

但我得到的是:

代码语言:javascript
复制
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

有什么东西我忽略了吗?提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-11 13:23:30

如果您查看ASCII而不是十六进制的结果,您将得到:

代码语言:javascript
复制
~
C interp: syntax error.
-> ?M
C interp: token '' not recognized.
-> 

(引号中的标记是十六进制0x10,这是您要发送的字符之一。)所以,你的连续接收正常-你只是没有得到你预期的结果。看起来,另一个系统处于文本提示状态,并且不期望您发送的二进制数据包。可能需要一些命令,您必须首先发送,以使其进入正确的模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43491261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档