2017-05-30 161 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命令的基本標準,並會爲實例教你一之間的區別命令命令行。而且,如果你不在做一個命令行,所以調制解調器永遠不會開始處理你發送的命令。