データの受信を待って、受信データを読み出します。
以下のような手順で、受信データを処理します。
INPUT#ステートメント、LINE INPUT#ステートメントでは、CR(0Dh)またはカンマ(,)を受信するまで受信を待ち続けます。そのため、通信回線のエラーによりこれらのデータが欠落した場合や、通信回線が切断された場合、フリーズしたような状態になります。 従って、受信したデータの取り出しには、INPUT#ステートメント、LINE INPUT#ステートメントを使用しないでください。
const ComFile = 3 '通信ファイル番号 '+---------------------------------------------------------------------------+ '| | '| 【関数名】 rcvcom$(f.no%, para$, timeout%, chartout%, esc$) | '| 【機能】 データ受信を待って、受信データを読み出す | '|ファイル番号 f.no% | '| 通信パラメータ para$ | '| タイムアウト timeout% | '| キャラクタ間タイムアウト | '| chartout% | '| エスケープキー esc$ | '| 受信データ | '| | '| 【処理内容】 | '| ・データの受信を待ち、受信データを戻り値とします。 | '| ・以下の条件で、受信待ちを終了します。 | '| -CR(キャリッジリターン)を受信 | '| -受信データがなく、指定されたタイムアウト時間(timeout%)が経過 | '| -1キャラクタ以上受信後、指定されたタイムアウト時間(chrtout%)が経過 | '| -エスケープキーの押下 | '| | '+---------------------------------------------------------------------------+ function rcvcom$(f.no%, para$, timeout%, chartout%, esc$) private r.dat$ private r.len% private wk$ open para$ as #f.no% '通信ファイルオープン r.dat$ = "" timea = timeout% '受信開始待ちタイマセット while 1 wait 0,&h19 '受信orキーorタイムアウトを待つ r.len% = loc(#f.no%) if r.len% > 0 then while 1 timea = chartout% '受信継続待ちタイマセット wait 0,&h19 '受信orキーorタイムアウトを待つ r.len% = loc(#f.no%) if r.len% > 0 then r.dat$ = r.dat$ + input$(r.len%, #f.no%) if right$(r.dat$,1) = chr$(&h0d) then rcvcom$ = r.dat$ close #f.no% exit function endif else wk$ = inkey$ if (wk$ = esc$) or (timea = 0) then 'エスケープキー押下、 'またはタイムアウト時終了 rcvcom$ = r.dat$ close #f.no% exit function endif endif wend else wk$ = inkey$ if (wk$ = esc$) or (timea = 0) then 'エスケープキー押下、 'またはタイムアウト時終了 rcvcom$ = "" close #f.no% exit function endif endif wend end function '=============================================================================== ' Main '=============================================================================== private rcvdata$ key 30,"m" while 1 print "receiving..."; rcvdata$ = rcvcom$(ComFile, "com2:115200,n,8,1", 100, 10, "m") 'タイムアウト:10秒 'エスケープキー:[M1] print rcvdata$ wend