[ttssh2-dev 543] Re: ticket #45271 / Serial Hard Flow

アーカイブの一覧に戻る
NAGATA Shinya maya.****@gmail*****
2023年 1月 22日 (日) 13:14:45 JST


永田です。

> ハードフローに問題あり、と指摘をいただいています。
> https://osdn.net/projects/ttssh2/ticket/45271
> 問題ないだろう、と思っていたのですが…

たぶんずっといじってないところなので、もし問題があるなら
2.3 のころから問題があったのではないか、という気がします。
それゆえに「本当だろうか」と思いつつも、確実に検証できると機器と
知識がないので手をつけられずにいました。


> テスト方法など tools/ttcomtester/README.md を参照ください。

README.md のに記述は「期待する動作」「実際に起こった期待した動作」
「実際に起こった期待しない動作」のどれを書いたのか分からない、
また「動作」と「動作を確認できるプログラムの出力」の混在があり、
どう書いたら報告になるのかよくわかりません。
ですので、行った操作と、それに対する表示を書きます。
私の環境のせいで期待する動作をしておらず、テストになっていない
可能性がありますが、最後まで試してみました。


= 環境
- 機器1
  - Windows 8.1
    - マザーボードに付いてるシリアルポート
- 機器2
  - Windows 10
    - USB-Serial 変換器
- ケーブル
  - ストレートケーブル
  - リバース変換アダプタ

詳細: https://osdn.net/users/nmaya/pf/Tera_Term_test/wiki/serial
ttcomtester は XP で動きませんが、XP で動くならシリアルポートがある
(USB変換器ではない)別の PC でも試すことができます。


= テスト
- 動作確認
  - 機器1: "ttcomtester.v16.exe --device com1 --rts on --verbose" を実行する
    - 機器1: パラメータが表示される
      - Rts Flow control は 1 になっている
  - 機器1: `o` を押す
    - 機器1: "open com='com1'" と表示される
    - 機器1: "read pending" と表示される
  - 機器1: `r` を押す
    - 機器1: RTS=0, 1" と表示される
  - 機器1: `r` を押す
    - 機器1: "RTS=1, 1" と表示される
  - 機器2: "ttcomtester.v16.exe --device com3 --rts hs --verbose" を実行する
    - 機器2: パラメータが表示される
      - Rts Flow control は 2 になっている
  - 機器2: `o` を押す
    - 機器2: "open com='com3'" と表示される
    - 機器2: "read pending" と表示される

> 機器1 -> 機器2, RTS 機器1/on 機器2/hs
>> 1文字送信
  - 機器1: `:` を押す
    - 機器1: "send mode" と表示される
  - 機器1: `a` (`:` 以外のキー)を押す
    - 機器1: "send 61, 1 byte" と表示される
    - 機器2: なにも表示されない *1
>> まとめて送信
  - 機器1: `:` を押す
    - 機器1: "command mode" と表示される
  - 機器1: `s` を押す
    - 機器1: "send big data 32768 bytes" と表示される
    - 機器2: なにも表示されない
    - 機器1: "sened" と表示される

*1 README.md には「`:` 以外のキーを押すと、機器2に送信される」とあり
ますが、機器2にはなにも表示されません。送信はしているのに実際には
送信されていない、実際に受信されているのに受信できていないように
見えます。

> 機器2 -> 機器1, RTS 機器1/on 機器2/hs
>> 1文字送信
  - 機器2: `:` を押す
    - 機器2: "send mode" と表示される
  - 機器2: `a` (`:` 以外のキー)を押す
    - 機器2: "send 61, 1 byte" と表示される
    - 機器1: "read:" と表示される
    - 機器1: "1 :61" と表示される
>> まとめて送信
  - 機器1: `:` を押す
    - 機器1: "command mode" と表示される
  - 機器1: `s` を押す
    - 機器1: "send big data 32768 bytes" と表示される
    - 機器2: "14 :" ... と表示される
    - 機器2: 上の行の動作が繰り返される
    - 機器1: "sened" と表示される


- RTS/CTSハードフローテスト
> 機器1 -> 機器2, RTS 機器1/on 機器2/off
  - 機器2: `r` を押す
    - 機器2: "RTS=0, 0" と表示される *2
  - 機器1: `:` を押す
    - 機器1: "send mode" と表示される
  - 機器1: `a` (`:` 以外のキー)を押す
    - 機器1: "send 61, 1 byte" と表示される
    - 機器2: なにも表示されない
>> まとめて送信
  - 機器1: `:` を押す
    - 機器1: "command mode" と表示される
  - 機器1: `s` を押す
    - 機器1: "send big data 32768 bytes" と表示される
    - 機器2: なにも表示されない
    - 機器1: "sened" と表示される

*2 EscapeCommFunction() が成功していない?
私の持っている USB-Serial 変換器 は RTS に対応していない?
GetLastError したら 0x87 が返ってきました。

> 機器1 -> 機器2, RTS 機器1/on 機器2/off
  - 機器2: `r` を押す
    - 機器2: "RTS=1, 0" と表示される
>> 1文字送信
  - 機器1: `:` を押す
    - 機器1: "send mode" と表示される
  - 機器1: `a` (`:` 以外のキー)を押す
    - 機器1: "send 61, 1 byte" と表示される
    - 機器2: なにも表示されない
>> まとめて送信
  - 機器1: `:` を押す
    - 機器1: "command mode" と表示される
  - 機器1: `s` を押す
    - 機器1: "send big data 32768 bytes" と表示される
    - 機器2: "wait_read:" と表示される
    - 機器2: "1024 :" ... と表示される
    - 機器2: "read pending" と表示される
    - 機器2: 1回だけで、その後が続かない
    - 機器1: "sened" と表示される

機器1 -> 機器2 への送信はうまくいかない。
big の送信も、RTS の値によりできるのではなく、気まぐれな感じ(後述)
この向きの送信はテストに使えない。

> 機器2 -> 機器1, RTS 機器1/on 機器2/on
  - 機器2: `r` を押す
    - 機器2: "RTS=1, 0" と表示される
>> 1文字送信
  - 機器2: `:` を押す
    - 機器2: "send mode" と表示される
  - 機器2: `a` (`:` 以外のキー)を押す
    - 機器1: "read:" と表示される
    - 機器1: "1 :61" と表示される
    - 機器1: なにも表示されない
>> まとめて送信
  - 機器1: `:` を押す
    - 機器1: "command mode" と表示される
  - 機器1: `s` を押す
    - 機器1: "send big data 32768 bytes" と表示される
    - 機器2: "read:" と表示される
    - 機器2: "14 :" ... と表示される
    - 機器2: 上の行の動作が繰り替えされる
  - 機器2: 繰り替えされている間に `r` を押す (RTS off)
    - 文字列の表示は止まらない
  - 機器2: 繰り替えされている間に `r` を押す (RTS on)
    - 文字列の表示は止まらない
    - 機器1: "sened" と表示される


- Tera Term で RTS/CTSテスト
> 機器1 ttcomtester 機器2 Tera Term, RTS 機器1/on 機器2/?
  - 機器1: "ttcomtester.v16.exe --device com1 --rts on --verbose" を実行する
    - 機器1: パラメータが表示される
      - Rts Flow control は 1 になっている
  - 機器1: `o` を押す
    - 機器1: "open com='com1'" と表示される
    - 機器1: "read pending" と表示される
  - 機器2: Tera Term でシリアル接続
    - パラメータ: COM1, 9600, 8bit, none, 1bit, RTS/CTS
  - 機器2: `a` を押す
    - 機器2: なにも表示されない("echo local" off のため)
    - 機器1: "read:" と表示される
    - 機器1: "1 :61" と表示される
  - 機器2: `a` を押す
    - 機器2: なにも表示されない("echo local" off のため)
    - 機器1: "read:" と表示される
    - 機器1: "1 :61" と表示される
  - 機器1: `r` を押す
    - 機器1: "RTS=0, 1" と表示される
  - 機器2: `a` を押す
    - 機器2: なにも表示されない("echo local" off のため)
    - 機器1: なにも表示されない
  - 機器2: `a` を押す
    - 機器2: なにも表示されない("echo local" off のため)
    - 機器1: なにも表示されない
  - 機器1: `r` を押す
    - 機器1: "RTS=1, 1" と表示される
    - 機器1: "read:" と表示される
    - 機器1: "2 :61 61" と表示される


= まとめ
私の持っている機器が「検証に足る機器ではない」可能性があり、
かつ私の限られた理解でまとめると、こんな感じになりました。

機器1 -> 機器2
| 1 RTS | 2 RTS | 1char | big |
| on    | hs    | x     | *2  |
| on    | off*1 | x     | *2  |
| on    | on *1 | x     | *2  |
機器2 -> 機器1
| 1 RTS | 2 RTS | 1char | big |
| on    | hs    | o     | o   |
| on    | off*1 | o     | o   |
| on    | on *1 | o     | o   |
*1 戻り値が 0 なので本当にセットされているのか不明
*2 機器2の RTS がどの値でも、送信2-3回につき1回ほど受信側に表示される。
ただし 1024 のかたまり1個分だけ

機器1 -> 機器2 ではテストにならない。環境の問題?
機器2 -> 機器1 ではテストできていそうだが、本当に大丈夫か?

機器2 -> 機器1 での結果:
> 1文字
機器1 で RTS=off にしている間は機器2での入力が機器1に表示されず、
機器1 で RTS=on にしたときにまとめて機器1に表示される。
ラインモニタは持っていないので「本当にケーブルに流れていない
のか」はではわかりませんでした。
> big
データ送信中に受信側で `r` を押して RTS を切り替えても止まらない。


= おまけ
ttcomtester での 機器1 -> 機器2 の1文字送信はうまくいきません。

しかし、どこか見た記憶だけでソースを見つけられないのですが、
正常に動作しないプログラムが、いちど Tera Term で COM ポートを開くと
正常に動作するようになる、という話を聞いたことがあります。

それで、機器2でいちど Tera Term でシリアル接続をして終了し、その後
ttcomtester を立ち上げると1文字送信がうまくいくようになります。


-- 
TeraTerm Project https://ttssh2.osdn.jp/
NAGATA Shinya <maya.****@gmail*****>



ttssh2-dev メーリングリストの案内
アーカイブの一覧に戻る