環境は、W2K、VC++6.0です。
RS232Cのシリアル通信をおこなっています。
相手(送信機)が垂れ流しで送ってくるデータをエディットボックスに表示するという簡単なプ
ログラムを書いています。
ほとんどの文字は表示できますが、相手が0x00を送ってくると、何も表示されません。
C言語では、0x00が文字列の終端コードだと思いますが、0x00を認識する方法をご存知でした
ら教えてください。
よろしくお願いします。
表示できない数値なんだからしょうがないよ。
0x0に限らず表示できない文字は他にもあるし。
相手から送られてくるデータが文字ではないのなら
文字として扱わなければいいんじゃない。
受信したデータ数(バイト数)と
unsigend char型のバッファ(文字列じゃない)として処理し
16進数にして表示すればいいんじゃない。
表示できる文字でも16進数にしてしまうけど。
回答をありがとうございます。
書き忘れていましたが、MFCを使用していますので、CStringを使って文字列の処理をしていま
す。受信内容を記憶する型はLPVOIDですので、ここにCStringのパラメータを入れてます。
回答していただいたように0x00は直接表示できませんので、16進数の段階で値を判別して、0
x01だったらSOH、0x02だったらSTXが表示できるように変換しています。
この変換で実際にSOHやSTXは表示できています。しかし同じ方法を使っても0x00がNULと表示
されません。
ためしにchar型で同様の変換方法を行ないましたが、だめでした。
基本的に文字列操作の知識が不足していますので、初歩的なミスをしているかもしれませんが、
どうしたら正しく表示できるでしょうか。
動作を確認する意味で下記のサンプルを書いてみました。
CString Buffer; //受信内容を記憶するバッファ
CString strText; //検索する文字列を格納する
CString strEdit; //エディットボックスに表示する文字列
strText = 0x01;
if( Buffer == strText )
{
strEdit = SOH;
}
m_edit.SetWindowText( strEdit ); //エディットボックスに転送
上記のプログラムで0x01を受信すると、エディットボックスにはSOHと表示されます。
しかし、これを以下のようにすると思うような結果が出ません。
CString Buffer; //受信内容を記憶するバッファ
CString strText; //検索する文字列を格納する
CString strEdit; //エディットボックスに表示する文字列
strText = 0x00;
if( Buffer == strText )
{
strEdit = NUL;
}
m_edit.SetWindowText( strEdit ); //エディットボックスに転送
当然といえば当然のことですが、0x00を受信してもなにも表示されません。
受信バッファの型がLPVOIDで、これはWINDOWSのAPIの仕様ですので絶対に変更できません。
この条件下で、どうすれば0x00を認識することができるでしょうか?
ぶっちゃけ俺はRS232Cのシリアル通信してないからよくわかりません。
CString Buffer; //受信内容を記憶するバッファ
これにどうやってデータを入れているのか?
strText = ~ってした時点で
strTextには'\0'の後ろのデータはコピーされずに無視してしまうし。
なぞだ?
受信バッファの型がLPVOIDなのは何を指定してもいいよって意味でしょ。
CStringを使わずunsigend char型のバッファで受信して
それと受信したバイト数があれば
文字列じゃないから終端コードとか気にしなくていい。
CString hex;
unsigend char buffer[100];
受信するデータが100バイト超えてたら問題になるけど
あくまでもこれは例ですので
int size = 受信したバイト数;
strEdit = ";
for(int i=0; i<size; ++i)
{
hex.Format(%02x ,buffer[i]);
strEdit += hex;
}
m_edit.SetWindowText( strEdit );
ご指摘ありがとうございます。
確かにLPVOIDですので、型は何でも大丈夫ですね。
型をunsigned charにして、例示してくださったサンプルを実行しましたが、
相変わらず0x00が表示されません。
CStringの変換過程で失われているのでしょうか?
確認作業を行なった結果、問題の原因は受信プログラムのようです。というのも、
unsigned char buffer[100]
を,
unsigned char buffer[]={0x00,0x01,0x02,0x03};
と置き換え、受信に関係なく文字列の処理の部分だけ確認したところ、
00 01 02 03
と表示されましたので、文字列の処理は正常に行なわれていました。
通信方法については別スレッドを立てます。
ありがとうございました。