松尾です。 > こういう感じのプログラムを走らせたのかもしれませんね。 > https://www.youtube.com/watch?v=lwuZ7xYtMKk&t=140s ちょくちょくTera Termが出てくるのがおおっと思いますね。 > Tera Term のときのオシロスコープの結果を見たかったのですが、 : >> わかったこと > > - 接続先が DCE であること > PC RTS(output) = device RTS(input) > PC CTS(input) = device CTS(output) > - 「B. 今の RTS/CTS 制御」を想定している 同じ理解です。 >> - デバイスは RTS を無視して送信する > > そうではないように思います。 >> My circuit monitors its RTS input in case the PC wants to halt >> data flow on it's RTS (output) signal. たしかにそうですね。 >> - 57600bps速すぎない? > > 「USB 変換ケーブルだとバッファがあって、実際のポートだとバッファが > ないせいなのでは?」という予想を書いてくれていますね。 > 物理特性とか回路設計がわかっていれば、あるいはシリアルデバイスを > よく使う人であればわかるのかもしれませんが、だいたいこのくらいの > 早さだと送信遅延を設定する、みたいな目安があるのでしょうか? 1byte毎ディレイ追加/速度を落とせば改善するかもしれないですね。 8(byte)+1(start)+1(stop)+0(parity)=10bitに bpsを掛けたぐらいの時間? 多すぎですかねぇ・・。 行ごとディレイを入れるといい感じになるのは CR(enter)で処理をスタートすることが多いからかなと思います。 PC側はチップ内受信バッファが少なくても CPUがとても速ければ大丈夫かなとは思います。 多コアだしシステム全体に割り込み禁止して処理することもないはず。 最近のPC+OSならマウスポインタの動きのカクツキとか少ないですよね。 ただTera Termが遅くてOS内受信バッファが あふれることがあるかもしれないです。 デバイスのほうは、CTS=0としても直後の1byte程度 受信してしまうことがある前提で作るほうが安全だと思います PC(Tera Term) Device -------------------------+------------ チップが1byte送信準備中 <----- CTS=0 送信してしまうかも -----> どうなる? デバイス側は受信したあとフラッシュ扱うことが多いと思うので - 受信する - CTS=0出力 - 割り込み禁止 - Flash書き込み - 割り込み許可 割り込み禁止中の受信はどうなる? ドキドキするポイントが結構ありそうです。 Tera Term以外でokだったら、デバイス側は大丈夫なのかなと思います > - trunk の動き > dcb.fOutxCtsFlow=TRUE で OS(とかドライバ)にまかせる > > - r10587 > fOutxCtsFlow は有効にするものの、CTS が low だったら OS 任せに > せず送らない > -> これがダメだとすると、間に合ってない感じがするのでタイミング > のような気がします。 > 気になっているのですが、r10587 の修正を入れると、逆に今まで送れて > いた環境で送れなくなったり、送信が遅くなるということは考えられる > でしょうか? r10587 の修正で送信バッファに詰められなくなるので 遅くなるかもしれないです。 シリアル送受信処理は問題にいろいろ対応してきて 秘伝のソース状態だと思うので修正はなかなか緊張します。 Tera Termの送信フローが怪しいのかなと r10587 を見直していて アプリ側のフロー制御が全然できていないのがわかりました。 r10593で修正しました。 修正だけでなく TERATERM.ini に 次の項目を追加(値はデフォルト値)しました。 [serial.maniac] AppCTSDSRFlow = 1 RecieveBufferSize = 8192 SendBufferSize = 2048 XonLim = 2048 XoffLim = 2048 あかんなーというときパラメータの変更を試してもらえます。 これでもう一度ためしてもらいましょうか。