在Python中使用PySerial与GSM调制解调器通信
我有一个DWM-156 GSM modem。下面你可以看到,添加到我的电脑插上这个GSM调制解调器连接到USB端口后的设备列表:在Python中使用PySerial与GSM调制解调器通信
需要注意的是,我将调制解调器连接到我的电脑时,它都会使用不同的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
>>>
我的问题:
- 虽然我没有收到任何回应?
- 为什么在第三个节目扔无法打开端口“COM13”当我试图连接到COM12?
- 有没有更高效和更好的方式使用GSM调制解调器来嗅探呼叫? (我想打电话给我用拨号电话机插在我的GSM调制解调器的SIM卡,并记录原始数据,该通信过程中传输。)
- 虽然我没有收到任何回应?
你永远不会调用serialPort.read()
阅读任何回应。
开始=“2”>
- 为什么在第三个节目扔掉它不能打开端口“COM13”当我试图连接到COM12?
的Serial
类来自lib\site-packages\serial\serialwin32.py
,并围绕Win32Serial
类的包装。
Win32Serial
继承自SerialBase
的lib\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
- 但我怀疑这是背景干扰,它涉及到它在设备管理器屏幕截图中描述为“调试”端口,也许它不能正常打开。
- 有没有更高效,更好的方式使用GSM调制解调器来嗅探呼叫? (我想打电话给我用拨号电话机插在我的GSM调制解调器的SIM卡,这期间的通信记录的原始数据传输。)
我不明白这一点。 “拨打SIM卡”是什么意思?什么原始数据?您将无法使用串行链接来录制手机通话音频数据......并且您可能无法录制由其他内容发送的调制解调器数据,因为Python将打开串行端口,而另一个程序将无法打开它。
谢谢你的回答。 ** 1 - **我将'serialPort.read()'添加到了我的代码中,但没有任何更改。 ** 2 - **是的,我用'“COM12”替换'12',现在它的输出就像输出到其他端口一样。 ** 3 - **我在我的GSM调制解调器中插入了一张SIM卡,对不对?此SIM卡有一个电话号码。我想用拨号电话拨打此号码。然后我想用python来回答这个调用。而且我还想将在此通信期间传输的数据存储在文件中。 (使用接受调用的相同python程序) – Abraham
我可以请求您将我的程序的修改版本添加到您的答案中吗? – Abraham
你需要做的不仅仅是把'serialPort.read()'放入 - 至少print(serialPort.read())。可能会很快进入read()调用,以至于没有任何内容可以立即读取,因此您需要等待,然后检查接收缓冲区的等待数据。我没有任何我知道可用的示例代码,或者任何需要测试的代码,所以我无法真正添加一个有用的修改版本 - 但这个问题和两个答案看起来像代码要等待和阅读: http://*.com/questions/13017840/using-pyserial-is-it-possble-to-wait-for-data。 – TessellatingHeckler