通信の制御コードに関して

解決


トリコ  2009-05-08 00:11:17  No: 34292

Delphiに限らずのことなのですが、教えてください。
ASCIIの制御コードに関してです。

通信で帰ってきたコマンドが'COM'だとします。
これは厳密に言うとSTX + 'COM' + CR + LF  だとします。
この制御文字のSTX、CR、LFの扱いがよくわかりません。

例えば
ReadCom :String;  とし、
ReadComに帰ってきたコマンドを代入します。

このReadComの中身は、
ReadCom[1] = STX
ReadCom[2] = 'C'
ReadCom[3] = 'O'
ReadCom[4] = 'M'
ReadCom[5] = CR
ReadCom[2] = LF
という考えかたでよろしいでしょうか?

また、帰ってきたコマンドが'COM'であるか比較したい場合は
if ReadCom = 'COM' then
と比較すればよいのか、制御文字も含めて比較するのかがわかりません。

説明が下手で申し訳ありませんが、よろしくお願いします。


トリコ  2009-05-08 00:13:04  No: 34293

間違いがありました。

ReadCom[1] = STX
ReadCom[2] = 'C'
ReadCom[3] = 'O'
ReadCom[4] = 'M'
ReadCom[5] = CR
ReadCom[2] = LF  ×  →  ReadCom[6] = LF  ○
に修正します


deldel  2009-05-08 01:32:38  No: 34294

デバッグ環境でReadComの内容を調べるのが一番早いと思うのですが・・・

STXというのが分からないのですが、CRなら#13というChar型の文字、
LFなら#10というChar型の文字になるのですかね?


トリコ  2009-05-08 02:17:13  No: 34295

deldelさんありがとうございます。
はじめからデバッグ環境で追っていけば解決できる問題でしたね。
デバッグしてためしたところ、
if ReadCom = 'COM' thenではなく
#2(STX) #13(CR) #10(LF) とともに比較しなければならないことがわかりました。

後もう少しで気持ちが晴れそうなので教えてください。
もともと通信でCRとかLFという制御コードが含まれたコマンドが帰ってきた場合、文字が一文字ずつコマンドで送られてくると思います。
結局通常文字、制御文字にかかわらず帰ってくるものはInteger型で帰ってきて、Char型にキャストしてあげなければならないのですよね?

だからReadCom: Integer;
となり、
比較するときは
if Char(ReadCom) = Char($02)+'COM'+Char($0D)+Char($0A) then
としなければならないのですよね?


まつ  2009-05-08 02:17:14  No: 34296

STXやCR、LFを含むてチェックするかどうかは、あなたの作りかた次第です。
何かの機器との通信データのやり取りだと思いますので、その機器のプロトコルに合わせてチェックしてくださいとしか答えようがないと思います。
ちなみに一般的にSTX(Start of Text:テキストの先頭)はASCIIコードでは#2です。


可視文字だけ  2009-05-08 02:27:47  No: 34297

>帰ってきたコマンドが'COM'であるか比較したい
のであれば、
if Trim(ReadCom) = 'COM' then
だよ。制御コードまで比較する必要はないはず。


トリコ  2009-05-08 02:34:14  No: 34298

おー!
やはり制御文字まで比較しないでもよい関数があったのですね。
色々知れました、聞いてよかったです。

みなさん回答ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加