[英]Communicating with GSM modems using PySerial in python
我有一台DWM-156 GSM调制解调器 。 将此GSM调制解调器插入USB端口后,您可以在下面看到添加到我的计算机上的设备的列表:
请注意,每次将调制解调器连接到计算机时,它都会使用不同的COM端口号。
现在,我想使用Python或任何其他语言向该调制解调器发送一些AT命令。 实际上,我想接听/拨打拨号电话并记录在该通信过程中传输的原始数据。 搜索后,我在SO中找到了这个问题。 建议答案之一的以下代码:
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
>>>
我的问题:
- 虽然我没有收到任何回复?
您永远不会调用serialPort.read()
来读取任何响应。
- 为什么在我尝试连接到COM12时,在第三个程序中抛出的异常无法打开端口“ COM13”?
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将打开串行端口,而另一个程序将无法打开它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.