Armadilloフォーラム

Armadillo-420(Linux3.14)でUSBシリアル通信不正

sirakawa

2025年7月24日 20時38分

==========
製品型番:Armadillo-420
Debian/ABOSバージョン:atmark-dist v1.55.1
カーネルバージョン:Linux 3.14.36-at13
3G/LTE モジュール情報 (Debianのみ):
その他:
==========
いつもお世話になっております。

【構成】
 [Armadillo-420] - [USBハブ] - [対向機]
 このような構成でUSBシリアル通信をしています。
 動作確認用に、同じサイズ(3600バイト)・同じデータ(連番データ)を対向機から毎秒受信しています。
 対向機に対してデータ送信指示を送って、データ受信を行っています。
 Armadillo-420側ではデバイスファイルをopen/send/read/closeするプログラムを使用しています。

【通信設定】 ※仕様で決まっているため、変更不可。
 ボーレート:921600
 パリティ:なし
 フロー制御:なし

【事象】
以下の事象が起きています。
(a)受信サイズが想定値未満になるときがある。サイズは不定。データの末尾が欠落するのではなく、中盤のデータが欠落する。
(b)受信データの間に0x00が間に挟まるときがある。挟まる場所は不定。

今のところ、(a)(b)は同時に発生します。発生時間も不定です。
  期待値:・・・,0xa1,0xa2,0xa3,0xa4,・・・,0xd1,0xd2,0xd3,・・・,0xf6,0xf7,0xf8,・・・
  受信値:・・・,0xa1,0xa2,0x00,0xa3,0xa4,・・・,0xd1,0xf7,0xf8,・・・
  →事象(a):0xd2~0xf6が欠落している
   事象(b):0xa2の後に想定外の0x00が入っている

【お聞きしたい内容】
(a)について
 フロー制御を使用していないUSBシリアル通信であるため、データの欠落は回避しようがないでしょうか?

(b)について
 (a)はまだ理解できるのですが、こちらが理解できません。
 どのような時にこれが起こり得るか、心当たりのある方いらっしゃいませんでしょうか?

事象について、問題箇所の切り分け(アプリケーション/カーネル/対向機/その他)ができておりません。
例えばreadでの読み出しサイズが1200のとき、0x00も含めて1200バイトとなっているため、現状はアプリケーションが原因ではないという想定をしています。また、対向機の送信データがどうなっているかを確認しようとしています。
このような状況で申し訳ございませんが、ご回答いただけますと幸いです。よろしくお願いいたします。
解析の方法の参考情報などでも構いません。

コメント

溝渕です。

> (a)について
>  フロー制御を使用していないUSBシリアル通信であるため、データの欠落は回避しようがないでしょうか?

そうですね。一般論ですが、フロー制御はこのようなデータ欠落を防止する為に存在します。フロー制御無効の場合は(特に非リアルタイムOSであるLinuxの場合は)データが欠落する可能性があります。

データの欠落を防止するには、フロー制御を有効にすうか、ユーザーランドで(zmodemのような)プロトコル実装をするのが良いかと思います。

> (b)について
>  (a)はまだ理解できるのですが、こちらが理解できません。
>  どのような時にこれが起こり得るか、心当たりのある方いらっしゃいませんでしょうか?

心当たりはありませんが、切り分け方法だけ。

以下2つが考えられます。
- 実際に0x00が送信されている(だからArmadilloが受信する)
- 実際には0x00が送信されていない(だけどArmadilloが受信する)

>  [Armadillo-420] - [USBハブ] - [対向機]

Armadillo-420-USBハブ間であれば、USBアナライザ、
USBハブ-対向機間であれば、プロトコルアナライザやオシロスコープ
で確認可能かと思います。

他には、Armadillo-420のtty設定で充填文字(sttyコマンドでいうところのofill)が設定されていないか等、プログラムの確認をする事も有益かと思います。