2015-06-20 60 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