前提・実現したいこと
前提
Raspberry Pi用IM無線HATを使用して、IM920sLとRaspberryPi4B間のI2C通信を行っています
また、IM920sL(PC側)とIM920sL(RaspberryPi側)間でシリアル通信を行っています
言語はPythonで、付属のサンプルコードを使用しています。
1つ目がライブラリ、2つ目が送受信のサンプルプログラムです
実現したいこと
シリアル通信速度がデフォルトでは19200bpsなので、115200bpsに変更したいと考えています
シリアル通信速度の変更方法についてご教授いただけると幸いです(解決のヒントになりそうなものなどを頂けるだけでも非常に助かります)
該当のソースコード
Python
1# -*- coding: utf-8 -*- 2 3""" 4im_wireless.py : IM920(c/s)をHATにて使うライブラリ 5(C)2019 interplan Corp. 6 7Ver. 0.010 2019/07/08 test version 8 9本ソフトウェアは無保証です。 10本ソフトウェアの不具合により損害が発生した場合でも補償は致しません。 11改変・流用はご自由にどうぞ。 12""" 13 14import time 15import smbus 16import RPi.GPIO as GPIO 17 18# ピンアサイン (BCM) 19IRQ_PIN = 17 # PIC I2C割り込みピン 20XMIT_PIN = 18 # 送信中出力ピン 21SLEEP_PIN = 22 # スリープピン 22RESET_PIN = 23 # リセットピン 23BUSY_PIN = 27 # BUSYピン 24 25RXBUF_MAXSIZE = 0x400 26 27 28class IMWireClass: 29 30 def __init__(self, sladr): # 初期化 31 self.rxbuf_head = 0 # i2c受信バッファ 32 self.rxbuf_tail = 0 33 self.rxbuf_num = 0 34 self.rxbuf_maxsize = RXBUF_MAXSIZE 35 self.i2c_rxbuf = [0] * self.rxbuf_maxsize 36 #self.i2c_rxbuf = np.zeros(self.rxbuf_maxsize, dtype='U250') 37 self.slave_adr = sladr 38 39 GPIO.setmode(GPIO.BCM) # GPIO設定 40 GPIO.setup(RESET_PIN, GPIO.OUT) 41 GPIO.setup(XMIT_PIN, GPIO.IN) 42 GPIO.setup(SLEEP_PIN, GPIO.IN) 43 GPIO.setup(IRQ_PIN, GPIO.IN) 44 GPIO.setup(BUSY_PIN, GPIO.IN) 45 46 GPIO.output(RESET_PIN, 1) 47 48 self.i2c = smbus.SMBus(1) # i2cの準備 49 50 [self.i2c.read_byte(self.slave_adr) for i in range(300)] # 変換ICのバッファ初期化 51 52 # GPIO割り込み設定 必要に応じてXMITやSLEEPも使用 53 GPIO.add_event_detect(IRQ_PIN, GPIO.RISING, callback=self.irq_intrpt, bouncetime=5) 54 #GPIO.add_event_detect(XMIT_PIN, GPIO.RISING, callback=self.xmit_intrpt, bouncetime=1) 55 #GPIO.add_event_detect(SLEEP_PIN, GPIO.RISING, callback=self.slp_intrpt, bouncetime=1) 56 57 self.Reboot_920() 58 59 def remove_interrupt(self, port): # GPIO割り込み削除 60 GPIO.remove_event_detect(port) 61 62 def Reboot_920(self): # 再起動 63 GPIO.output(RESET_PIN, 0) 64 time.sleep(500e-3) 65 GPIO.output(RESET_PIN, 1) 66 time.sleep(500e-3) 67 68 def Write_920(self, cmd): # Moduleにコマンドを入力 69 busy_sts = 0 70 if not '?' == cmd[0] : # コマンドの先頭がWake-up用トリガならModuleはSleep中と想定 71 busy_sts = self.busy_status() 72 while busy_sts: 73 time.sleep(1e-3) 74 busy_sts = self.busy_status() 75 76 #print('>'+cmd) # コマンドを表示 77 self.i2c.write_i2c_block_data(self.slave_adr, 0, [ord(i) for i in cmd]) 78 79 def Read_920(self): # 受信データを返す 80 buf = '' 81 if self.rxbuf_num >= 1: # 受信データ(レスポンス含む)があれば 82 buf = self.i2c_rxbuf[self.rxbuf_head] 83 self.rxbuf_head += 1 84 self.rxbuf_head &= self.rxbuf_maxsize - 1 85 self.rxbuf_num -= 1 86 87 return buf 88 89 def irq_intrpt(self, gpio): # I2C割り込み 90 if gpio == IRQ_PIN: 91 i2c_rxlen = 0 92 while i2c_rxlen == 0: # 受信データ長を取得 93 i2c_rxlen = self.i2c.read_byte(self.slave_adr) 94 95 if i2c_rxlen >= 1: # データ保存処理 96 buf = '' 97 while i2c_rxlen >= 1: 98 buf += chr(self.i2c.read_byte(self.slave_adr)) 99 i2c_rxlen -= 1 100 self.i2c_rxbuf[self.rxbuf_tail] = buf 101 102 self.rxbuf_tail += 1 # バッファの更新処理 103 self.rxbuf_tail &= self.rxbuf_maxsize - 1 104 self.rxbuf_num += 1 105 if self.rxbuf_num > self.rxbuf_maxsize: # バッファを上書きしたら 106 self.rxbuf_num = self.rxbuf_maxsize 107 self.rxbuf_head += 1 # headを更新 108 self.rxbuf_head &= self.rxbuf_maxsize - 1 109 110 def slp_intrpt(self, gpio): # SLEEP 111 slp_sts = 1 112 113 def xmit_intrpt(self, gpio): # ルート探索,ACK返送,中継でもここに来る 114 xmit_sts = 1 115 116 def busy_status(self): # busyのHIGH/LOWを返す 117 return GPIO.input(BUSY_PIN) 118 119 def gpio_clean(self): # プログラム終了時に必ず使用 120 GPIO.cleanup()
Python
1# -*- coding: utf-8 -*- 2 3""" 4raspihat_TXsample001.py : im_wireless.pyを使用し、受信データを出力かつテキスト保存 5 子機へACKを返す 6 Crlt+Cでプログラムを終了する 7(C)2019 interplan Corp. 8 9Ver. 0.010 2019/07/08 test version 10 11本ソフトウェアは無保証です。 12本ソフトウェアの不具合により損害が発生した場合でも補償は致しません。 13改変・流用はご自由にどうぞ。 14""" 15 16import im_wireless as imw 17 18# datalog 19FILE_NAME = '/../../media/pi/USB/Savelog.txt' 20 21# i2c 22SLAVE_ADR = 0x30 # hatのI2Cアドレスは0x30 ~ 0x33 23 24 25# Main 26if __name__ == '__main__': 27 iwc = imw.IMWireClass(SLAVE_ADR) # classの初期化 28 29 try: 30 while True: 31 rx_data = iwc.Read_920() # 受信処理 32 if len(rx_data) >= 1: # 受信してない時は''が返り値 (長さ0) 33 print(rx_data, end='') # 受信データを画面表示 34 35 with open(FILE_NAME, 'a') as f: # ファイルを開く 36 f.write(rx_data) # 1dataをファイル末尾に書き込み 37 38 if len(rx_data) >= 11: # 11は受信データのノード番号+RSSI等の長さ 39 if (rx_data[2]==',' and 40 rx_data[7]==',' and rx_data[10]==':'): 41 rxid = rx_data[3:7] # 子機(送信機)のIDを抽出 42 txbuf = 'TXDA' + rxid # コマンドにCR+LFはいらない 43 print('>', txbuf) 44 iwc.Write_920(txbuf) # コマンドを送信 45 46 except KeyboardInterrupt: # Ctrl + C End 47 iwc.gpio_clean() 48 print ('END') 49
試したこと
IM920-USBを使用してteratermから設定を変更してみましたが、
プログラムを実行すると設定が初期化されてしまいました
回答3件
あなたの回答
tips
プレビュー