[DIARY] コンディションが悪いのでコードの修正でも
![]()
公開日 2026年1月22日 最終更新日 2026年1月22日 by JE2UFF_Toshi
おはようございます。流石に大寒波到来で、今朝は冷え込んでいます。現在の気温は-2℃で、風もそこそこ有りますから体感温度はかなり低いですね。お空も天気もご機嫌斜めの状況です。お空は大寒波のように長引かなければ良いのですが。
昨日は磁気嵐の影響で10m~17mまで殆どまともに受信出来ない状態でした。17mや15mで少しだけアジアが入っていますが、信号は極端に弱い。
20mは比較的信号は沢山見えますが、未交信局は少なくEUの入り口辺りまでしか見えません。
しかもコールしてもQSO出来るとは限らないので、ワッチしていても暇になるので、昨年作ったアンテナ切替器の気になる部分の修正をCopilotと一緒に実施しました。
現状の問題は時々データパケットを取りこぼす事が有ると言うことです。取りこぼしても前の状態を保持しているので、現状のアンテナ群では特に問題は無いのですが、今後アンテナを追加したりすると問題となるので、コンディションが悪い時間を利用して対処しました。
CI-Vって簡単そうで意外と奥が深く、素人が作ったコードなので、カットアンドトライで作り上げているため、以下の課題がありました。
- 表示が切り替わらない時がある
- 切り替わるがタイミングが遅い
- ???表示になるときがある
本来であれば切り替わらない事が有ると大きな問題なのですが、幸いなことに40m~10mは同じアンテナを使用しているので、切り替わらなかったとしても選択しているアンテナは同じなので問題とはならない。
しかし、今度トラディショナルとWARCを別のアンテナにしたりすると、大きな問題となったりする。
これらの問題は、もう一度バンドを切り替えて戻せば以降問題無く動作する。
コードをCopilotに読み込ませて、上記の課題がナゼ発生するのかを解析させました。
コードを解析して貰った所
- 毎loopで受信データを捨てている
- 毎loop2秒間だけ受信データを取り込む方式だった
- パケット境界がズレるとデコードに失敗する
当初、VFOでいきなり周波数を動かしたときなど多くのパケットが一気に流れてくるので、パケットの切れ目が分からなく成ったりしてミスデコードが多かったので2秒間だけ読み込んだデータを基準にデコード処理をしていた。
良かれと思い実施していた内容が、実は課題の原因になっていることが分かったので、これらの部分を修正した。
対応柵として
- 毎loop捨てていたデータを捨てないようにした
- 常時受信バッファを読み続ける方式に変更(MicroPythonなのでリングバッファ方式を採用)
- 終端のFDを見つけたら1パケットを確定させる
変更の一部として、受信バッファデータを受信バッファを常時監視する方式に変更しました。
rx_buffer = []
def read_civ_packets():
global rx_buffer
packets = []
while uart1.any():
b = uart1.read(1)
if not b:
break
rx_buffer.append(b[0])
# パケット終端 FD を検出
if b[0] == 0xFD:
# FE FE で始まる位置を探す
for i in range(len(rx_buffer)):
if rx_buffer[i] == 0xFE and rx_buffer[i+1] == 0xFE:
packet = rx_buffer[i:]
packets.append(packet)
rx_buffer = [] # バッファクリア
break
return packets
そしてloop内を若干変更して、取りこぼしゼロ、遅延ゼロ、???ゼロのコードになりました。
コードをmain.pyに変更してRaspberry Pi picoに書込再起動すると、動作がキビキビして動くようになりました。効果有りかなと喜んでいたのですが・・・
実際にバンドを切り替えたり、コンディションが未だ良い20mでQSOをしたりしていると、有る点に気が付きました。
今までは取りこぼしが多かったと言うよりも、切り替えた後の2秒間のデータのみを保持していたので全然気が付かなかったのですが、遅延ゼロにした関係で送信時に表示が???になることが分かりました。
これはコード自体が受信時のデータを受ける前提で書かれているため、送信時のコマンドは一切解読はしておりません。従って送信コマンドが来ても受け付けないので???表示になってしまいます。
いろいろ考えたのですが、アンテナ切替器なので受信時に切り替えてから使用するのが一般であり、逆に送信周波数表示迄してしまうと、CWのスプリット運用などでは表示がちらつき意味を成さない事になります。
また、受信時に切替を行い確認後に送信に移るので、送信コマンドは無視する仕様を追加しました。
送信コマンドを無視するフィルタは以下になります。
for msg in packets:
# コマンド判定
if len(msg) > 6:
cmd = msg
subcmd = msg[5]
# RX 周波数 (1C 03) 以外は無視
if not (cmd == 0x1C and subcmd == 0x03):
if DEBUG:
print("Ignore non-RX packet:", msg)
continue
これによりTXコマンドは完全に無視され、送信時に表示が???になるのが無くなりました。
全体的に非常に良くなったので、更なるおかしな部分が無いか、これでまたしばらく使ってデバッグをしていこうと思います。
コンディションが悪いのが幸いして、このようにコードの解析修正をしたりするのが出来ました。たまには何も聞こえないと言う状況も無線デトックスになり良いかもしれませんね。
にほんブログ村 ↑ブログランキング参加中。クリックでランキングが上がりますので、ご支援をお願いします。

関連記事:
- [DIARY] アプリの連携強化 公開日 2021年12月4日 最終更新日 2021年12月4日 by JE2UFF_Toshi 今日も強い風が吹いています。朝は静かだったのですが、日が高くなると同時に強くなっていきました。昨日は朝から三重まで出かけて...
- [DIARY] 余ったラズパイにHam Clockを入れてみた おはようございます。強烈な寒さですね。昨日は、当地は雪こそ降りませんが、外気温は5℃以下の1日でした。 コンディションもパッとしませんでしたので、余っていたラズパイ3B+にHam Clockをインストールして使ってみよう...
- [DIARY] やっとPCを交換しついでにOS変更 公開日 2022年1月15日 最終更新日 2022年1月15日 by JE2UFF_Toshi おはようございます。連日強風と低温画続いています。本日からは少し改善するとのことですが、どのような天気になるか心配ですね。...







