用pyserial阅读时遇到的问题

时间:2016-11-18 13:29:30

标签: python pyserial zigbee

所以我试图通过使用AT(有时称为Hayes)命令与连接到串行端口的zigbee模块进行通信。

我的问题是我无法弄清楚如何使用Python的pyserial模块正确读取它的答案(我在嵌入式设备上使用Python 2.7)。

有时,脚本会设法完美地读取模块的响应,有时它只返回一组“A”字符。

以下是示例输出:

  

打开serial / dev / ttyS2 ......   / dev / ttyS2是开放的......

     

输入命令或'退出':AT

     

-------------回应-------------

     

AT   行

     

输入命令或'退出':ATI

     

-------------回复-------------    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaAaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

     

输入命令或'退出':

我真的不明白这里发生了什么,但我认为这可能是因为我错误地使用了pyserial模块。我已经尝试使用inWaiting()命令只读取输入缓冲区中包含的字节,但是这个函数总是返回零,而readline()命令似乎也没有工作,所以我只读取1024字节的数据包。

这是我到目前为止编写的代码:

import serial, time, os

def sendAtCommand(command):

    # responseArray = []
    # i = 0

    try:
        # print('Number of bytes waiting in input buffer before write : '+str(ser.inWaiting())) -> always zero...

        if ser.inWaiting():
            # flush input buffer, discarding all its contents
            print('flushing input buffer ...')
            ser.flushInput()
            # flush output buffer, aborting current output
            # ser.flushOutput()

        try:
            ser.write(command.encode('ascii')+'\r')
            #ser.write(command+'\r')
            #time.sleep(5)
        except SerialTimeoutException as e:
            print(repr(e))

        response = ser.read(size=1024)
        # print('Number of bytes waiting in input buffer after write : '+str(ser.inWaiting())) -> always zero
        # while ser.inWaiting():
            # print('Reading response ... '+str(i))
            # responseArray.append(ser.readline(eol='\r\n'))
            # i += 1
            # time.sleep(0.2)

        print('------------------------------------')
        print('------------- Response -------------')
        print('------------------------------------')
        print(response)
        # for line in responseArray:
            # print(line)           
        print('------------------------------------')

        time.sleep(1)

    except KeyboardInterrupt as e:
        print('Closing serial '+port+' before interrupting ...')
        ser.close()
        exit()

VERSION = '0.02'
firstStart = True

port = '/dev/ttyS2'
baudrate = 19200
bytesize = 8
parity = 'N'
stopbits = 1
timeout = 1
xonxoff = False
rtscts = False
dsrdtr = False
write_timeout = None
inter_byte_timeout = None

try:
    os.system('cls' if os.name == 'nt' else 'clear')
    print('')
    print('PySerial version : '+serial.VERSION)
    firstStart = False

    print('')
    print('Opening serial '+port+' ...')
    ser = serial.Serial(port, baudrate, bytesize, parity, stopbits, timeout,
    xonxoff, rtscts, write_timeout, dsrdtr, inter_byte_timeout)
except ValueError as e:
    print(repr(e))
except SerialException as e:
    print(repr(e))

if ser.isOpen():
    print(ser.name + ' is open...')
    print('')

while True:

    try:
        cmd = raw_input('Enter command or \'exit\' : ')

        if cmd == 'exit':
            ser.close()
            exit()
        else:
            sendAtCommand(cmd)
    except KeyboardInterrupt as e:
        print('Closing serial '+port+' before interrupting ...')
        ser.close()
        exit()

1 个答案:

答案 0 :(得分:0)

好的,首先,谢谢大家的答案。最后我想出了如何解决这个问题。

我不知道为什么,但问题是我使用它的UART vcc引脚(连接到Linkit 7688 3v3引脚)为telegesis zigbee板供电。

现在,我只需连接两块板的GND,Tx和Rx,并使用外部电源供电,效果非常好。如果您对同一材料存在同样的问题,请参阅下图。

请勿使用红色框的VCC引脚,必须使用外部电源通过x2插座为电路板供电。

(对不起,因为我的英语质量很差)

Telegesis  ETRX357-DVK development kit

编辑:

啊,现在我不再读取1024字节的随机数据包了,我使用了一个单独的线程,如下所示:

g0 = g0.ToUpperInvariant();

if (!lookup.TryGetValue(g0, out g0))
    Console.WriteLine("Wrong Grade Format!");

然后就把

def folder_struct = new File('C:\\Json_Results\\results.json').withReader { reader ->
    slurper.parse(reader)
}
打开串行连接后,在主程序中

我希望这对某些人有用,即使我知道它不是完美的编程(不要像我那样捕捉异常......)