Python2.x系で使えるIM920のモジュールを作ってみた
一文書けば簡単に設定ができるので便利
とりあえずは使えそうなコマンドをモジュール化した(そのうち追加するかも)
IM920ってなんぞやって人は↓
920MHz無線モジュール IM920 – 無線ソリューション| [インタープラン interplan]
技術基準適合証明(技適・工事設計認証)取得済、ARIB STD-T108準拠、920MHz帯無線送受信モジュールIM920の仕様、技術資料です。
使い方・初期設定
- Pythonでシリアルポートが使えるようにすること!
$sudo pip install pyserial
- Python2.x系のみ動作確認済み
- Linuxのみ動作確認済み windowsで起動したい場合は、setSerial(mybaudrate)にある
port = ‘/dev/ttyUSB0’ を
port = ‘com12’ などにすると接続できる
- ペアリング
Srid(ボーレート,’ペアリングしたいID’)
ex) Srid(19200,’5187′)
- ペアリングしたIDを削除
Erid(ボーレート)
ex) Erid(19200)
- 文字列の送信
Send(ボーレート, ‘送信したい文字列’)
ex) Send(19200, ‘Hello’)
- 文字列の受信
Reception(ボーレート) ※returnで文字列が帰ってくる!
ex) print Reception(19200)
- 中継器化(リピータ)
Repeater(ボーレート) ※ctrl+cで終了する
ex) Repeater(19200)
- 固有IDの表示
Rdidボーレート
ex) Repeater(19200)
- ボーレートの設定
Sbrt(ボーレート, ‘ボーレート設定’)
※設定したいボーレートの設定を入れる
0:1200bps
1:2400bps
2:4800bps
3:9600bps
4:19200bps
5:38400bps
ex) Sbrt(19200, ‘4’)
プログラム
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' パッケージpyserialをインストールすること pytho2.x系で動作 Creater:Kaname Takano ''' import serial import binascii import signal import sys ''' ctrl+cの命令 ''' def signal_handler(signal, frame): sys.exit() ''' serial.Serialの設定 mybaudrate:ボーレート ''' def setSerial(mybaudrate): com = serial.Serial( port = '/dev/ttyUSB0', baudrate = mybaudrate, bytesize = serial.EIGHTBITS, parity = serial.PARITY_NONE, timeout = None, xonxoff = False, rtscts = False, writeTimeout = None, dsrdtr = False, interCharTimeout = None) #bufferクリア com.flushInput() com.flushOutput() return com ''' 固有IDの読み出し mybaudrate:ボーレート ''' def Rdid(mybaudrate): com = setSerial(mybaudrate) com.flushInput() com.write(b'RDID' + b'\r\n') com.flushOutput() print com.readline().strip() com.close() ''' ボーレートの設定 mybaudrate:現在のボーレート setbaudrate:セットするボーレート(文字列でもってくること) 0 1200bps 1 2400bps 2 4800bps 3 9600bps 4 19200bps 5 38400bps ''' def Sbrt(mybaudrate, setbaudrate): com = setSerial(mybaudrate) com.flushInput() com.write(b'ENWR' + b'\r\n') com.flushOutput() com.readline() com.write(b'SBRT ' + setbaudrate + b'\r\n') com.flushOutput() com.readline() com.write(b'DSWR' + b'\r\n') com.flushOutput() com.readline() com.close() ''' ペアリング mybaudrate:ボーレート args:ペアリングしたいID(文字列にすること) ''' def Srid(mybaudrate, args): com = setSerial(mybaudrate) com.flushInput() com.write(b'ENWR' + b'\r\n') com.flushOutput() com.readline() com.write(b'SRID ' + args + b'\r\n') com.flushOutput() com.readline() com.write(b'DSWR' + b'\r\n') com.flushOutput() com.readline() com.close() ''' ペアリングの削除 全て削除されるため注意! mybaudrate:ボーレート ''' def Erid(mybaudrate): com = setSerial(mybaudrate) com.flushInput() com.write(b'ENWR' + b'\r\n') com.flushOutput() com.readline() com.write(b'ERID' + b'\r\n') com.flushOutput() com.readline() com.write(b'DSWR' + b'\r\n') com.flushOutput() com.readline() com.close() ''' 送信 mybaudrate:ボーレート args:送信したい文字列 (数字の場合も文字列型にすること) ''' def Send(mybaudrate, args): com = setSerial(mybaudrate) com.flushInput() com.write(b'TXDA' + binascii.b2a_hex(args.decode('utf-8')) + b'\r\n') com.flushOutput() com.readline() com.close() ''' 受信 アスキーコードから文字列に変換したものを返す mybaudrate:ボーレート ''' def Reception(mybaudrate): com = setSerial(mybaudrate) com.flushInput() text = "" text = com.readline().decode('utf-8').strip() #受信と空白の削除 text = text.replace("\r\n","") text = text.split(":")[1] text = text.split(",") cngtext = "" for x in text: cngtext += chr(int(x,16)) com.close() return cngtext ''' 中継機化 mybaudrate:ボーレート ''' def Repeater(mybaudrate): com = setSerial(mybaudrate) com.flushInput() signal.signal(signal.SIGINT, signal_handler) while True: text = '' com.flushInput() text = com.readline().strip() if text == '': continue texts = text.split(':') if len(texts) > 1: text = text.split(":")[1] com.write(b'TXDA ' + text + b'\r\n') com.flushOutput() com.readline() if __name__ == '__main__': #ペアリング #Srid(19200,'5187') #削除 #Erid(19200) #文字列送信 #Send(19200, 'Hello') #文字列受信 #print Reception(19200) #中継機化 #Repeater(19200) #固有ID #Rdid(19200) #ボーレート設定 #Sbrt(19200, '4')
コメント
データを受信する時GitHubに上げられているsampleプログラム(組み込みライブラリ)でデータを受信し続けるように、while True:
print(略)
としたのですがずっと例外処理の部分が実行されてしまいます。
エラーメッセージ内容がわからないので回答しようがないです。