繁体   English   中英

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

[英]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
>>> 

我的问题:

  1. 虽然我没有收到任何回复?
  2. 为什么在我尝试连接到COM12时,在第三个程序中抛出的异常无法打开端口“ COM13”
  3. 是否有使用GSM调制解调器监听呼叫的更有效,更好的方法? (我想使用拨号电话呼叫插入到GSM调制解调器中的SIM卡,并记录在此通信过程中传输的原始数据。)
  1. 虽然我没有收到任何回复?

您永远不会调用serialPort.read()来读取任何响应。

  1. 为什么在我尝试连接到COM12时,在第三个程序中抛出的异常无法打开端口“ COM13”?

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将打开串行端口,而另一个程序将无法打开它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM