はじめまして。最近VC++をはじめたばかりの初心者ですがよろしくお願いします。
現在RS232Cを通じて、ある装置をシリアル転送で制御するプログラムを作成していま
す。
ある装置は、データをアスキーコード(0x**)の形にして転送することで制御が可能とな
ります。
実現を考えている仕様は、エディットボックスに数字を入力し、その後ボタンをクリッ
クするとその数字がアスキーコードに変換され、データが装置に転送される、というも
のです。
エディットボックスに入力された数字をGetWindowTextで取得、それをatofで実数型にす
る、まではできるのですが、実数をアスキーコードに変換する方法が分かりません。こ
の後の操作について、知恵を貸していただきたいと思っています。
また、これ以外にもっと簡単に実現する方法があれば是非お願いします。
変換例:123という実数→0x31,0x32,0x33というBYTE型配列に変換
環境:Windows XP VC++.NET MFC マルチドキュメント形式
>文字、文字列を16進に変換
> http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+26372
これはちょっと違うんじゃない?
> これはちょっと違うんじゃない?
違いますね、、、orz
勘違いしました。BYTE型配列でしたね。
> 変換例:123という実数→0x31,0x32,0x33というBYTE型配列に変換
数値として持っているならば、sprintfで文字列にすることで、
123-> 0x31, 0x32, 0x33 という文字配列が取得できます。
char s[] = 123;
s[ 0 ] = '1' = 0x31;
s[ 1 ] = '2' = 0x32;
s[ 2 ] = '3' = 0x33;
s[ 3 ] = '\0' = 0x00;
> GetWindowTextで取得
でそのまま、文字列で持っていれば変換は不必要なんじゃないかな。
(GetWindowText->atof->sprintfで無意味な変換している)
私の解釈が悪いのかな?
以下のif分はどうなると思いますか?
char a = '1';
char b = 0x31;
if(a == b){
//一致
}else{
//不一致
}
質問の内容をきちんと説明しなおした方がいいような気がしますが。
シリアルでアスキーコードを送信してコントロールするというのは別に珍しい話では
なくてよくある話ですよね。
例えば、SN020020254#という風に用は文字列で送信するわけです。
で、文字列は通常アスキーコードで表現されていますから、特に変換が必要ではないはず
です。
エディットボックスに0x53 0x4e 0x30 0x32 0x30 0x30 0x32 0x30 0x32 0x35 0x34 0x23と
入力してSN020020254#と送信したいというのであれば、話は別ですけれど。
なのでBlueさんの書かれている通り、そのまま送ればよいと思います。
あがが、誤字
誤)
例えば、SN020020254#という風に用は文字列で送信するわけです。
正)
例えば、SN020020254#という風に要は文字列で送信するわけです。
よく考えたら、「アスキーコード = 文字」ではないですね。
コントロールコードも入るんだった。
ただ、通常はコントロールコードはフロー制御に使うと思うので
基本的に送信データは文字列に相当する部分を使っていたような気がします。
僕は単純に\x0~\xFFの配列変数を作り、そのまま変換しています。
PATIOさんのご意見にもあるとおりに、RS-232Cの通信方法、
「\x02 STX \x03 ETXではさみ、間はすべてアスキーコード」
を使えば悩まずにうまくいくと思います。
アスキーコードは、sprintf等を使えば楽に変換できるはずです。
追記
浮動小数点をsprintfやatof等で変換して送信するのは誤差等を招きとても危険です。
装置側と整数部分と小数点部分の桁を決めます。
例
12.34場合、
3.14159 X 100 314.159
int()を使って小数点部分を切り捨てます。
314.159→314
ここではすでにint等の整数型になっています。
sprint等で桁を合わせます。
314→'0314'
この値、'0','3','1','4'を通信で扱うようにします。
.netやvb・c#・(MFCの専用関数)等で固定小数点を使わない限り、
通信でそのまま使うのは良くないです。
浮動小数点は誤差を招きます。
#C++ std等にあるかも知れませんが.........