永田です。 > ハードフローに問題あり、と指摘をいただいています。 > 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*****>