文字列0x00について

[戻る]
BLUE 2007/12/22(土) 08:02:29
環境は、W2K、VC++6.0です。
RS232Cのシリアル通信をおこなっています。

相手(送信機)が垂れ流しで送ってくるデータをエディットボックスに表示するという簡単なプ
ログラムを書いています。
ほとんどの文字は表示できますが、相手が0x00を送ってくると、何も表示されません。
C言語では、0x00が文字列の終端コードだと思いますが、0x00を認識する方法をご存知でした
ら教えてください。

よろしくお願いします。

wclrp ( 'o') 2007/12/22(土) 09:53:48
表示できない数値なんだからしょうがないよ。
0x0に限らず表示できない文字は他にもあるし。

相手から送られてくるデータが文字ではないのなら
文字として扱わなければいいんじゃない。

受信したデータ数(バイト数)と
unsigend char型のバッファ(文字列じゃない)として処理し
16進数にして表示すればいいんじゃない。
表示できる文字でも16進数にしてしまうけど。

BLUE 2007/12/22(土) 11:08:57
回答をありがとうございます。

書き忘れていましたが、MFCを使用していますので、CStringを使って文字列の処理をしていま
す。受信内容を記憶する型はLPVOIDですので、ここにCStringのパラメータを入れてます。

回答していただいたように0x00は直接表示できませんので、16進数の段階で値を判別して、0
x01だったらSOH、0x02だったらSTXが表示できるように変換しています。

この変換で実際にSOHやSTXは表示できています。しかし同じ方法を使っても0x00がNULと表示
されません。

ためしにchar型で同様の変換方法を行ないましたが、だめでした。
基本的に文字列操作の知識が不足していますので、初歩的なミスをしているかもしれませんが、
どうしたら正しく表示できるでしょうか。

BLUE 2007/12/22(土) 11:21:06
動作を確認する意味で下記のサンプルを書いてみました。

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を認識することができるでしょうか?

wclrp ( 'o') 2007/12/22(土) 13:57:04
ぶっちゃけ俺は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 );

BLUE 2007/12/22(土) 14:53:52
ご指摘ありがとうございます。

確かにLPVOIDですので、型は何でも大丈夫ですね。
型をunsigned charにして、例示してくださったサンプルを実行しましたが、
相変わらず0x00が表示されません。

CStringの変換過程で失われているのでしょうか?

BLUE 2007/12/22(土) 16:39:01
[[解決]]
確認作業を行なった結果、問題の原因は受信プログラムのようです。というのも、

unsigned char buffer[100]

を,

unsigned char buffer[]={0x00,0x01,0x02,0x03};

と置き換え、受信に関係なく文字列の処理の部分だけ確認したところ、

00 01 02 03

と表示されましたので、文字列の処理は正常に行なわれていました。
通信方法については別スレッドを立てます。

ありがとうございました。

古いスレッドには追加発言できません。