技術情報

データの受信を待って、受信データを読み出す

機能

データの受信を待って、受信データを読み出します。

説明

以下のような手順で、受信データを処理します。

  1. タイムアウト時間を設定
  2. タイムアウトまたは、受信バッファにデータが入るまで待つ(WAITステートメント)
  3. 受信バッファ内のデータ数(LOC関数)を確認し、データがあれば読み出す(INPUT$関数)

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

お問合せ

QBdirect