文字列0x00について – プログラミング – Home

通知
すべてクリア

[解決済] 文字列0x00について


BLUE
 BLUE
(@BLUE)
ゲスト
結合: 20年前
投稿: 1467
Topic starter  

環境は、W2K、VC++6.0です。
RS232Cのシリアル通信をおこなっています。

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

よろしくお願いします。


引用未解決
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

表示できない数値なんだからしょうがないよ。
0x0に限らず表示できない文字は他にもあるし。

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

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


返信引用
BLUE
 BLUE
(@BLUE)
ゲスト
結合: 20年前
投稿: 1467
Topic starter  

回答をありがとうございます。

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

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

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

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


返信引用
BLUE
 BLUE
(@BLUE)
ゲスト
結合: 20年前
投稿: 1467
Topic starter  

動作を確認する意味で下記のサンプルを書いてみました。

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')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

ぶっちゃけ俺は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
 BLUE
(@BLUE)
ゲスト
結合: 20年前
投稿: 1467
Topic starter  

ご指摘ありがとうございます。

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

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


返信引用
BLUE
 BLUE
(@BLUE)
ゲスト
結合: 20年前
投稿: 1467
Topic starter  

確認作業を行なった結果、問題の原因は受信プログラムのようです。というのも、

unsigned char buffer[100]

を,

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

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

00 01 02 03

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました