2017-09-19 17 views
0

私はGSMモデム「D-Link DWM-157」を持っています。私はこのモデムを使ってSMSとUSSDコードを送信したいと思っています。 smsを送信するにはsmstools3を使用し、すべてがOKです。 USSDコードを送信する目的は、SIMカードを充電するために天びんを回収することです。 USSDコードを送信するには、smstools3も使用したいと思います。問題は、ポート/ dev/ttyUSB0からUSSDコードを送信すると、/ dev/ttyUSB1ポートからの応答を受け取る必要があることです。私はこの動作についてsmstoolsフォーラムで尋ねました。そして、彼らは私に、USSDコードの送受信に2つのポートを使用するモデムを教えてくれました。 smstools3に特定のポート経由でUSSDコードを送信し、それが別のポートからの回答を受け取るようなオプションがあるとは思いません(フォーラムでこれについて尋ねましたが、まだ回答していません)。だから私は、ポート(すなわち/ dev/ttyUSB1)を継続的に聴いて、USSDコードの回答を受け取り、パーズする簡単なプログラムを書こうと思っています。 USSDコードはsmstools3によって送信されますが、回答は私のプログラムによって受信されます。私はSMSD経由USSDコードを送信PythonでGSMモデムの出力を読む

#!/usr/bin/python 
import serial, time 
from time import sleep 
import threading 
def serial_def(): 
    ser = serial.Serial() 
    ser.port = "/dev/ttyUSB1" 
    ser.baudrate = 9600 
    ser.timeout= 5 
    ser.xonxoff = False 
    ser.rtscts = False 
    ser.dsrdtr = False 
    ser.open() 

    if ser.isOpen(): 
     print (ser.name+ " is open ...\n") 
    print "Thread started... \n" 

    while True: 
     out=ser.readline()  
     print out 

:これを行うために、私は次のコードを書いた

私は唯一の空白行を取得何も出力されない場合: ./receive_ussd_gsm.py

/dev/ttyUSB1 is open ... 

Thread statred... 
は、

と私はSMSD経由USSDコード送るとき:

# smsd -C GSM1 
    Communicating with GSM1. (Press Ctrl-C to abort.) 
    (If you need to send Ctrl-Z, use Alt-Z) 
    Default device is /dev/ttyUSB0 
    Press Enter to start or type an another device name. 

    Opening device /dev/ttyUSB0 
    Ready. 
    ATE1 
    OK 
    ATZ 
    OK 
    at+cusd=1,"*140*11#",15 
    OK 

を私はfollowiを取得エラー:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 754, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "./receive_ussd_gsm.py", line 31, in serial_def 
    out=ser.readline() 
    File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read 
    'device reports readiness to read but returned no data ' 
SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?) 

出力を正しく得ることができます。しかし私は自分のプログラムでそれを持っていたい。 miniterm.pyを使用しているとき、私はまた、上記のエラーを与える

device disconnected or multiple access on port? 

!!:ところで、私はこれを取得なぜ私にはわからない時にポートに接続された1つのプログラムを使用します

# miniterm.py 

--- Available ports: 
--- 1: /dev/ttyUSB0   'D-Link DWM-157' 
--- 2: /dev/ttyUSB1   'D-Link DWM-157' 
--- 3: /dev/ttyUSB2   'D-Link DWM-157' 
--- 4: /dev/ttyUSB3   'D-Link DWM-157' 
--- Enter port index or full name: 2 
--- Miniterm on /dev/ttyUSB1 9600,8,N,1 --- 
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- 

--- exit --- 
Exception in thread rx: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 754, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/local/bin/miniterm.py", line 445, in reader 
    data = self.serial.read(self.serial.in_waiting or 1) 
    File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read 
    'device reports readiness to read but returned no data ' 
SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?) 

答えて

0

私はこの問題を解決するために適切な方法またはより正確にサンプル純粋なPythonコードを見つけることができませんでしたので、私は別の方法で私の問題を修正しました。 IはUSSDコードを送信した結果を受信するために、次のbashコマンド(コード)を使用:

(stty raw; cat >> /tmp/gsm1_ussd) < /dev/ttyUSB1 

Iは、サブプロセスモジュールを使用して私のPythonプログラム内のコードを使用して、結果を解析します。私はそれが何の問題もなく大きな仕事をしていると思います。ところで、特定のポート経由でUSSDコードを送信し、フォーラムで私に答えたときに別のポートから回答を受け取る方法はありません。

関連する問題