質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2860閲覧

シリアル通信速度を変更したい(Python,RaspberryPi,IM920)

KKK

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/21 06:30

編集2022/01/21 14:42

前提・実現したいこと

前提
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から設定を変更してみましたが、
プログラムを実行すると設定が初期化されてしまいました

 

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/01/21 06:38

コードを見るに、シリアル通信じゃなくてI2C通信のようですが
KKK

2022/01/21 07:18

確かにI2C通信の方が適切ですね、修正します ありがとうございます
guest

回答3

0

IM920 のデータシートには、最大ボーレートは 38400 bps と記載されていましたので、115200bpsに変更することはできないと思われます。

投稿2022/01/21 13:00

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KKK

2022/01/21 14:41

すみません、自分が使用しているのはIM920sLでした、すぐに修正します
guest

0

Raspberry Pi用IM無線HATとやらは これ ですね?

IM920とUARTで通信しているのはHATに乗っているUART-I2C変換ICとやらです。
取説の最後のページに乗っている回路図を見ると、PIC18F14K40とあるので、要するにマイコンでI2CとUARTの変換をしています。

取説にとくにこのマイコンに対する詳しい説明は見つけられませんでしたので
「メーカーに聞くしかない」という身も蓋もない結論になりそうです。

聞く前に試すとするなら
pythonコードでRead_920Write_920でコマンドをそのまま読み書きしていそうなので
シリアル設定のコマンドを送ってみてあとはマイコンもそれに追従するかどうかですね。

投稿2022/01/21 07:06

編集2022/01/21 07:19
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KKK

2022/01/21 07:32 編集

そうです、そちらです なるほど、マイコンで行っているのはI2CとUARTの変換…なんとなく理解が進んだような気がします、ありがとうございます 確かにメーカーに聞くのが一番確実かもしれません、回答ありがとうございます なるほど、確かにTXDAという送信コマンドを記述していますね、メーカーに聞く前に一度、設定のコマンドを書き込むことを試してみようと思います、ありがとうございます
guest

0

自己解決

プログラミングによる解決ではないですが、とりあえず変更はできました
プログラミングを実行したから設定が初期化されたと思っていましたが、
SBRTコマンドでシリアル通信速度を変更するだけでは設定は保存されず、
ENWRコマンドを先に行い、書き込みの記憶を可能な状態にする必要があったみたいです

シリアル通信速度を変更するとなぜか通信ができなくなるという新たな問題が発生しましたが、
とりあえず変更はできたので自分なりに頑張ってみようと思います、親切に対応してくださった方々、本当にありがとうございました

投稿2022/01/22 07:10

KKK

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2022/01/22 08:22

>なぜか通信ができなくなる im920のボーレートを変えても i2c-uart 変換側のボーレートが変わっていないからです
KKK

2022/01/22 12:33

なるほど…i2c-uartということはRaspberryPiの設定でしょうか? そこら辺の理解が浅くて申し訳ないのですが、どうすればi2c-uart 変換側のボーレートを変更できるのか教えていただけると幸いです
yuki23

2022/01/22 15:40

> どうすればi2c-uart 変換側のボーレートを変更できるのか教えていただけると幸いです ozwk さんの回答をお読みになったはずですが、もう忘れてしまったのでしょうか? 「メーカーに聞くしかない」です
KKK

2022/01/23 05:23

なるほど、そうですね すみません、ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問