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
と比較すればよいのか、制御文字も含めて比較するのかがわかりません。
説明が下手で申し訳ありませんが、よろしくお願いします。
間違いがありました。
ReadCom[1] = STX
ReadCom[2] = 'C'
ReadCom[3] = 'O'
ReadCom[4] = 'M'
ReadCom[5] = CR
ReadCom[2] = LF × → ReadCom[6] = LF ○
に修正します
デバッグ環境でReadComの内容を調べるのが一番早いと思うのですが・・・
STXというのが分からないのですが、CRなら#13というChar型の文字、
LFなら#10というChar型の文字になるのですかね?
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
としなければならないのですよね?
STXやCR、LFを含むてチェックするかどうかは、あなたの作りかた次第です。
何かの機器との通信データのやり取りだと思いますので、その機器のプロトコルに合わせてチェックしてくださいとしか答えようがないと思います。
ちなみに一般的にSTX(Start of Text:テキストの先頭)はASCIIコードでは#2です。
>帰ってきたコマンドが'COM'であるか比較したい
のであれば、
if Trim(ReadCom) = 'COM' then
だよ。制御コードまで比較する必要はないはず。
おー!
やはり制御文字まで比較しないでもよい関数があったのですね。
色々知れました、聞いてよかったです。
みなさん回答ありがとうございました。
ツイート | ![]() |