所以我试图通过使用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()
答案 0 :(得分:0)
好的,首先,谢谢大家的答案。最后我想出了如何解决这个问题。
我不知道为什么,但问题是我使用它的UART vcc引脚(连接到Linkit 7688 3v3引脚)为telegesis zigbee板供电。
现在,我只需连接两块板的GND,Tx和Rx,并使用外部电源供电,效果非常好。如果您对同一材料存在同样的问题,请参阅下图。
请勿使用红色框的VCC引脚,必须使用外部电源通过x2插座为电路板供电。
(对不起,因为我的英语质量很差)
编辑:
啊,现在我不再读取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)
}
打开串行连接后,在主程序中。
我希望这对某些人有用,即使我知道它不是完美的编程(不要像我那样捕捉异常......)