在python中使用PySerial与GSM调制解调器通信

时间:2015-06-20 05:42:59

标签: python python-2.7 gsm pyserial modem

我有DWM-156 GSM modem。下面您可以看到将此GSM调制解调器插入USB端口后添加到计算机的设备列表:

enter image description here 请注意,每次将调制解调器连接到计算机时,都会使用不同的COM端口号。

现在我想使用Python或任何其他语言向此调制解调器发送一些AT命令。实际上我想回拨/拨打电话拨打电话并记录在通讯期间转移的原始数据。在搜索之后,我在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. 为什么在第三个程序中,当我尝试连接到 COM12 时,无法打开端口'COM13'
  3. 是否有更有效和更好的方式使用GSM调制解调器来嗅探电话? (我想使用拨号电话设备拨打我在GSM调制解调器中插入的SIM卡,并记录在此通信过程中传输的原始数据。)

1 个答案:

答案 0 :(得分:1)

  
      
  1. 虽然我没有收到任何回复?
  2.   

您永远不会致电serialPort.read()阅读任何回复。

  
      
  1. 为什么在第三个程序中它无法打开端口&#39; COM13&#39;我正在尝试连接到COM12?
  2.   

Serial类来自lib\site-packages\serial\serialwin32.py,是Win32Serial类的包装。

Win32Serial继承自SerialBase中的lib\site-packages\serial\serialutil.py,并通过调用SerialBase初始化来初始化自己。

SerialBase通过为port属性分配您提供的端口值来设置其端口值,该属性调用SerialBase.setPort(port)

setPort(port)检查传入的值是字符串还是数字。它是一个数字,因此它会在makeDeviceName(port)类中调用Win32Serial

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 - 但我怀疑这是背景分散注意力,并且它与设备管理器屏幕截图中描述为&#39;调试&#39;端口,也许它无法正常打开。

  
      
  1. 是否有更有效和更好的方式使用GSM调制解调器来嗅探电话? (我想使用拨号电话设备拨打我在GSM调制解调器中插入的SIM卡,并记录在此通信过程中传输的原始数据。)
  2.   

我不明白这一点。 &#34;拨打SIM卡&#34;是什么意思?什么原始数据?您无法使用串行链接录制电话呼叫音频数据......您可能无法记录其他内容发送的调制解调器数据,因为Python将打开串行端口另一个程序无法打开它。