2015-06-20 219 views
0

我有一個DWM-156 GSM modem。下面你可以看到,添加到我的電腦插上這個GSM調制解調器連接到USB端口後的設備列表:在Python中使用PySerial與GSM調制解調器通信

enter image description here 需要注意的是,我將調制解調器連接到我的電腦時,它都會使用不同的COM端口號。

現在我想發送一些AT命令到這個調制解調器使用Python或任何其他語言。實際上,我想用撥號電話接聽/撥打電話,並記錄通信期間傳輸的原始數據。在搜索之後,我在SO中發現了this問題。其中一個應答者建議下面的代碼:

import serial 

serialPort = serial.Serial(port=PORT_NUMBER,baudrate=115200,timeout=0,rtscts=0,xonxoff=0) 
def sendatcmd(cmd): 
    serialPort.write('at'+cmd+'\r') 

print 'Loading profile...', 
sendatcmd('+npsda=0,2') 

我更換PORT_NUMBER 9,10和12這是結果:

>>> ================================ RESTART ================================ 
>>> 
Loading profile... 
>>> #for port = 9 
>>> ================================ RESTART ================================ 
>>> 
Loading profile... 
>>> #for port = 10 
>>> ================================ RESTART ================================ 
>>> 

Traceback (most recent call last): 
    File "C:\Users\ghasemi.IT\Desktop\testGSMModem.py", line 3, in <module> 
    serialPort = serial.Serial(port=12,baudrate=115200,timeout=0,rtscts=0,xonxoff=0) 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 38, in __init__ 
    SerialBase.__init__(self, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\serial\serialutil.py", line 282, in __init__ 
    self.open() 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 66, in open 
    raise SerialException("could not open port %r: %r" % (self.portstr, ctypes.WinError())) 
SerialException: could not open port 'COM13': WindowsError(2, 'The system cannot find the file specified.') 
>>> #for port = 12 
>>> 

我的問題:

  1. 雖然我沒有收到任何迴應?
  2. 爲什麼在第三個節目扔無法打開端口「COM13」當我試圖連接到COM12
  3. 有沒有更高效和更好的方式使用GSM調制解調器來嗅探呼叫? (我想打電話給我用撥號電話機插在我的GSM調制解調器的SIM卡,並記錄原始數據,該通信過程中傳輸。)

回答

1
  1. 雖然我沒有收到任何迴應?

你永遠不會調用serialPort.read()閱讀任何迴應。

  • 爲什麼在第三個節目扔掉它不能打開端口「COM13」當我試圖連接到COM12?
  • Serial類來自lib\site-packages\serial\serialwin32.py,並圍繞Win32Serial類的包裝。

    Win32Serial繼承自SerialBaselib\site-packages\serial\serialutil.py,並通過調用SerialBase初始化程序初始化自身。

    SerialBase通過分配給port屬性的端口值設置其端口值,該端口值調用SerialBase.setPort(port)

    setPort(port)檢查傳入的值是字符串還是數字。這是一個數字,因此它在Win32Serial類中稱爲makeDeviceName(port)

    makeDeviceName(port)來電device(port)

    device(port)是加1的數,並把COM在它前面的函數:

    def device(portnum): 
        """Turn a port number into a device name""" 
        return 'COM%d' % (portnum+1) # numbers are transformed to a string 
    

    爲什麼?我不知道。但是如果你傳遞一個字符串,它不會改變它。嘗試給它一個字符串,而不是serial.Serial(port="COM12"...而不是serial.Serial(port=12 - 但我懷疑這是背景干擾,它涉及到它在設備管理器屏幕截圖中描述爲「調試」端口,也許它不能正常打開。

    1. 有沒有更高效,更好的方式使用GSM調制解調器來嗅探呼叫? (我想打電話給我用撥號電話機插在我的GSM調制解調器的SIM卡,這期間的通信記錄的原始數據傳輸。)

    我不明白這一點。 「撥打SIM卡」是什麼意思?什麼原始數據?您將無法使用串行鏈接來錄製手機通話音頻數據......並且您可能無法錄製由其他內容發送的調制解調器數據,因爲Python將打開串行端口,而另一個程序將無法打開它。

    +0

    謝謝你的回答。 ** 1 - **我將'serialPort.read()'添加到了我的代碼中,但沒有任何更改。 ** 2 - **是的,我用'「COM12」替換'12',現在它的輸出就像輸出到其他端口一樣。 ** 3 - **我在我的GSM調制解調器中插入了一張SIM卡,對不對?此SIM卡有一個電話號碼。我想用撥號電話撥打此號碼。然後我想用python來回答這個調用。而且我還想將在此通信期間傳輸的數據存儲在文件中。 (使用接受調用的相同python程序) – Abraham

    +0

    我可以請求您將我的程序的修改版本添加到您的答案中嗎? – Abraham

    +0

    你需要做的不僅僅是把'serialPort.read()'放入 - 至少print(serialPort.read())。可能會很快進入read()調用,以至於沒有任何內容可以立即讀取,因此您需要等待,然後檢查接收緩衝區的等待數據。我沒有任何我知道可用的示例代碼,或者任何需要測試的代碼,所以我無法真正添加一個有用的修改版本 - 但這個問題和兩個答案看起來像代碼要等待和閱讀: http://stackoverflow.com/questions/13017840/using-pyserial-is-it-possble-to-wait-for-data。 – TessellatingHeckler