2017-05-30 143 views
1

我正在使用以下python脚本在串行端口ttyUSB1上写入AT + CSQ。 但我什么都看不懂。从串行端口写入和读取

但是,当我在minicom上激活AT + CSQ时,我得到了所需的结果。

这个脚本有什么问题?

日志: 手动脚本

[email protected]:~# python se.py 
Serial is open 
Serial is open in try block also 
write data: AT+CSQ 
read data: 
read data: 
read data: 
read data: 

日志:

小型机控制台

1. ate 
OK 

2. at+csq 
+CSQ: 20,99 

3. at+csq=? 
OKSQ: (0-31,99),(99) 

我怎样才能得到这些结果在下面的python脚本?

import serial, time 

#initialization and open the port 

#possible timeout values: 

# 1. None: wait forever, block call 

# 2. 0: non-blocking mode, return immediately 

# 3. x, x is bigger than 0, float allowed, timeout block call 

ser = serial.Serial() 

ser.port = "/dev/ttyUSB1" 

ser.baudrate = 115200 

ser.bytesize = serial.EIGHTBITS #number of bits per bytes 

ser.parity = serial.PARITY_NONE #set parity check: no parity 

ser.stopbits = serial.STOPBITS_ONE #number of stop bits 

ser.timeout = None   #block read 

#ser.timeout = 0    #non-block read 

ser.timeout = 3    #timeout block read 

ser.xonxoff = False  #disable software flow control 

ser.rtscts = False  #disable hardware (RTS/CTS) flow control 

ser.dsrdtr = False  #disable hardware (DSR/DTR) flow control 

ser.writeTimeout = 2  #timeout for write 

try: 

    ser.open() 

    print("Serial is open") 

except Exception, e: 

    print "error open serial port: " + str(e) 

    exit() 

if ser.isOpen(): 

    try: 

     print("Serial is open in try block also") 

     ser.flushInput() #flush input buffer, discarding all its contents 

     ser.flushOutput()#flush output buffer, aborting current output 

        #and discard all that is in buffer 

     #write data 

     ser.write("AT+CSQ") 
     time.sleep(1) 
#  ser.write("AT+CSQ=?x0D") 

     print("write data: AT+CSQ") 
#  print("write data: AT+CSQ=?x0D") 

     time.sleep(2) #give the serial port sometime to receive the data 

     numOfLines = 1 

     while True: 

      response = ser.readline() 

      print("read data: " + response) 

      numOfLines = numOfLines + 1 

      if (numOfLines >= 5): 

       break 

     ser.close() 

    except Exception, e1: 

     print "error communicating...: " + str(e1) 

else: 

    print "cannot open serial port " 
+0

1.在minicom中,您似乎首先发送了消息,但没有看到您使用可格式化的Python代码发送该消息。 2.当你在minicom中发送一个字符串时,你还可以按回车键作为“\ r”或“\ n”(不知道哪一个可能没关系),并且当你用python发送字符串时您必须明确地将Enter键的击键放入您发送的字符串中,因为它不会自动发送。因此,可能需要确保您发送“ate \ n”(或者它可能是\ r,不确定),然后检查确定响应,然后同样将“\ r”(或“\ n”)添加到您发送的其他字符串。 – barny

+0

请正确格式化问题中的代码。 – hlovdal

+0

嗨, hlovdal,我能够使用现有的代码来获取所需的输出, 抱歉,格式不正确。 :( 这里是我的输出: 根@ imx6slzbha:〜/ python_exercises#蟒蛇serial_tty_working.py 端口打开 写入数据:AT + CSQ = X0D 读取数据:? 读取数据: 读取数据:^ RSSI:19 读取数据: 读取数据:^ HCSQ: “LTE”,46,53,161,30 我可以使用带方便抓取LTE RSSI() 感谢 你有任何想法如何。使用单个python脚本编写多个命令并读取输出l一行一行。 谢谢 –

回答

0

您的AT命令处理两个非常根本的缺陷:

time.sleep(1) 

if (numOfLines >= 5): 

他们是怎么坏的?除非您解决这些问题,否则任何事情都无法解决,因此我的意思是彻底改变您发送和接收命令和响应的方式。

将AT命令发送到调制解调器是一种通信协议,就像任何其他协议一样,其中某些部分和行为是必需的而不是可选的。就像你不会写一个完全忽略它从HTTP服务器返回的响应的HTTP客户端一样,你绝不能写一个程序把AT命令发送到调制解调器,并完全忽略调制解调器发回的响应。

AT命令是一个链路层协议,窗口大小为1 - 1。因此,在发送命令行之后,发送方必须等待,直到收到调制解调器的响应,它完成处理命令行,并且这种响应被称为最终结果代码

如果调制解调器在使用最终结果代码之前使用70毫秒,则必须等待至少70毫秒才能继续,如果使用4秒钟,则必须等待至少4秒才能继续,如果使用几分钟(和是的,有AT命令可能需要几分钟才能完成),你必须等待几分钟。如果调制解调器在一个小时内没有响应,您唯一的选择是1)继续等待,2)放弃或3)断开连接,重新连接并重新开始。

这就是为什么sleep是这样一种可怕的方法,在最好的情况下是浪费时间的炸弹。它和踢狗一样有用,它们可以阻止你移动。是的,它可能实际上工作了一段时间,但在某些时候,你会对采取这种方法感到抱歉...

而对于numOfLines有没有办法提前知道调制解调器将响应多少行。如果您的调制解调器只用一行代码与ERROR最终结果代码进行响应,该怎么办?代码会死锁。

所以这行号码计数必须完全消失,而你的代码应该发送一个命令行,然后等待调制解调器的响应行reading and parsing的最终结果代码。

但在此之前潜水过深到这个问题的答案,通过阅读V.250规范开始,至少所有第5章的这是界定AT命令的基本标准,并会为实例教你一之间的区别命令命令行。而且,如果你不在做一个命令行,所以调制解调器永远不会开始处理你发送的命令。

相关问题