10進->16進変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
高校生

10進->16進変換

#1

投稿記事 by 高校生 » 9年前

PICマイコンを使用してRS232C通信を行っています。
今回は送信側のデータについて相談です。

10進数のデータ(0~255)について、次の処理を行ってから、PC側にデータを送信したいと考えています。
①16進数に変換
②変換したら、ASCIIではなく、文字列としてPC側にデータ送信

10進数データが255の場合、
0xFFをPC側に送信し、PC側で0xFF (FF)を受信したいのですが、どのように記述すれば良いでしょうか?

non
記事: 1097
登録日時: 14年前

Re: 10進->16進変換

#2

投稿記事 by non » 9年前

シリアル通信用のライブラリがあると思うのですが、使用する環境を教えてください。コンパイラは何?
non

高校生

Re: 10進->16進変換

#3

投稿記事 by 高校生 » 9年前

返信ありがとうございます。

コンパイラは、C18を使用しています。<usart.h>をインクルードしています。

テストとして、PICマイコンから100を送信し、PC(TeraTerm)で確認した所、「d」(ASCII文字コードで100)を受信できました。
次の段階として、次の処理を行いたいのですが、どのように記述して良いのか分かりません。

10進数のデータ(0~255)について、次の処理を行ってから、PC側にデータを送信したいと考えています。
①16進数に変換
②変換したら、ASCIIではなく、文字列としてPC側にデータ送信

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 10進->16進変換

#4

投稿記事 by みけCAT » 9年前

高校生 さんが書きました:②変換したら、ASCIIではなく、文字列としてPC側にデータ送信
これはどういう意味ですか?
ASCIIではないということは、EBCDICかなんかですか?
例えば0~31を送信する時、具体的にどのようなバイト列を送信したいですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 10進->16進変換

#5

投稿記事 by みけCAT » 9年前

高校生 さんが書きました:10進数のデータ(0~255)について
この「10進数のデータ」は、どのような形式で格納されていますか?
1桁ずつ数字で表現した文字列ですか?
それともBCD(Binary-coded decimal)ですか?
その他の形式ですか?

少なくとも、PICのメモリは普通にビットを格納するやつだと思うし、
そもそもC言語の仕様で数値はビット列で表現された2進数で格納することになっているので、普通の数値(int型とかunsigned char型とか)は10進数のデータではないはずですよね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

高校生

Re: 10進->16進変換

#6

投稿記事 by 高校生 » 9年前

1. 例えば0~31を送信する時、具体的にどのようなバイト列を送信したいですか?

00~1Fというバイト列を送信したいです。



2. 次の内容について、すみません。自分の理解が浅くて、答えられないです。
PICマイコンで、外付け可変抵抗の電圧値を10BitでA/D変換しています。
0~1023のデジタル値に変換して、それを8bitデータにして、0~255までの値をUSART通信で送りたいです。

送るデータは、00~FFまでのバイト列で送りたいです。

この「10進数のデータ」は、どのような形式で格納されていますか?
1桁ずつ数字で表現した文字列ですか?
それともBCD(Binary-coded decimal)ですか?
その他の形式ですか?

少なくとも、PICのメモリは普通にビットを格納するやつだと思うし、
そもそもC言語の仕様で数値はビット列で表現された2進数で格納することになっているので、普通の数値(int型とかunsigned char型とか)は10進数のデータではないはずですよね。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 10進->16進変換

#7

投稿記事 by みけCAT » 9年前

引用部分は引用部分であるとわかりやすいように書いてください。
高校生 さんが書きました:1. 例えば0~31を送信する時、具体的にどのようなバイト列を送信したいですか?

00~1Fというバイト列を送信したいです。
送りたいバイト列は

コード:

30 30 0A 30 31 0A 30 32 0A 30 33 0A 30 34 0A 30
35 0A 30 36 0A 30 37 0A 30 38 0A 30 39 0A 30 41
0A 30 42 0A 30 43 0A 30 44 0A 30 45 0A 30 46 0A
31 30 0A 31 31 0A 31 32 0A 31 33 0A 31 34 0A 31
35 0A 31 36 0A 31 37 0A 31 38 0A 31 39 0A 31 41
0A 31 42 0A 31 43 0A 31 44 0A 31 45 0A 31 46 0A
(ASCII、各数値を2桁の十六進数に変換してLF区切りで出力、アルファベットは大文字)
とか

コード:

F0 F0 25 F0 F1 25 F0 F2 25 F0 F3 25 F0 F4 25 F0
F5 25 F0 F6 25 F0 F7 25 F0 F8 25 F0 F9 25 F0 C1
25 F0 C2 25 F0 C3 25 F0 C4 25 F0 C5 25 F0 C6 25
F1 F0 25 F1 F1 25 F1 F2 25 F1 F3 25 F1 F4 25 F1
F5 25 F1 F6 25 F1 F7 25 F1 F8 25 F1 F9 25 F1 C1
25 F1 C2 25 F1 C3 25 F1 C4 25 F1 C5 25 F1 C6 25
(EBCDIC、各数値を2桁の十六進数に変換してLF区切りで出力、アルファベットは大文字)
とかではなく、

コード:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
ですね?
でしたら、多分、難しい変換を考えずに得られた8bitデータをUSART送信用データのレジスタにそのまま入れればいいでしょう。
無駄に謎形式の「10進データ」に変換する必要すらないでしょう。

ちなみに、Tera Termのデバッグモードを用いると送られてくるバイト列を十六進数で確認できます。
Tera termのちょっとした裏技: Crescent
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

高校生

Re: 10進->16進変換

#8

投稿記事 by 高校生 » 9年前

みけCATさま ありがとうございます。

まず、送りたいデータは、次のデータです。(例: 0~31までとした場合。)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

実際は、0~255までの値を送りたいので、00~FF(2バイト)となります。

教えていただいたTeratermの裏技を使用して早速試してみました。

[試したコードの一部]

コード:

//変数定義
static	unsigned short	sens_R_send, 		//Send data

//A/D変換
SetChanADC(ADC_CH0);    	//チャンネルを切り替える場合
ConvertADC();
while( BusyADC());      	//AD変換が終わるまで待つ
ADreadR = ReadADC();    	//AD変換値読込み

//送信用データ
vol_R_send = ADreadR>>2;			//exchange 10bit for 8bit (Red)

//データ送信
if (flash_sw==0){
		WriteUSART(vol_R_send);
		delay_ms(100);
		}
[結果]
Teratermに表示される文字は、・(ドット?)です。
送信用データが00のときも、FFのときも、・(ドット)が表示されてしまいます。

[データを変えてテスト]
送るデータを、
vol_R = (double)ADreadR / 10.13;
に変更すると、dと表示されます。 (このとき、vol_R=100を送信しています。)
dと表示されている時に、Shift + Escの裏技を行ってみましたが、Teratermの表示はdのまま変わりませんでした。

高校生

Re: 10進->16進変換

#9

投稿記事 by 高校生 » 9年前

みけCATさま

大変失礼しました。
Tera Termのiniファイルを次のように書き換えていませんでした。
; Display all characters (debug mode)
Debug=on

これをした所、ちゃんとバイトデータで表示されました。

ありがとうございます。

初歩的な質問ですみませんでした。

私は、次のように当初理解していました。
PIC側で100というデータを送っているのに、Tera Termは、dと表示されてしまう。
⇒PIC側でASCIIに勝手に変換して送っているのかと思い、PIC側でデータ変換する必要があると考えていました。

しかし、実は、受信側(Tera Term)でASCIIに変えてしまっていたということなんですね。
(理解が間違えていたら訂正していただけると助かります。)
今の状態で、0x00~0xFFというデータを、今度はマイコンに受信させると、受信側のマイコンはちゃんと0x00~0xFFが受信用レジスタに保存される…
と考えて、次はマイコンで受信させてみたいと思います。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 10進->16進変換

#10

投稿記事 by みけCAT » 9年前

高校生 さんが書きました:私は、次のように当初理解していました。
PIC側で100というデータを送っているのに、Tera Termは、dと表示されてしまう。
⇒PIC側でASCIIに勝手に変換して送っているのかと思い、PIC側でデータ変換する必要があると考えていました。

しかし、実は、受信側(Tera Term)でASCIIに変えてしまっていたということなんですね。
(理解が間違えていたら訂正していただけると助かります。)
マイコンはASCIIのことは何も考えずに指定された数値を送信します。
Tera Termは、受信した数値をASCIIに基づいて文字に変換して表示したり、エスケープシーケンスの処理をしたりします。
「ASCIIに変換」ではありません。

ASCII - Wikipedia
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る