PICマイコンを使用してRS232C通信を行っています。
今回は送信側のデータについて相談です。
10進数のデータ(0~255)について、次の処理を行ってから、PC側にデータを送信したいと考えています。
①16進数に変換
②変換したら、ASCIIではなく、文字列としてPC側にデータ送信
10進数データが255の場合、
0xFFをPC側に送信し、PC側で0xFF (FF)を受信したいのですが、どのように記述すれば良いでしょうか?
10進->16進変換
Re: 10進->16進変換
返信ありがとうございます。
コンパイラは、C18を使用しています。<usart.h>をインクルードしています。
テストとして、PICマイコンから100を送信し、PC(TeraTerm)で確認した所、「d」(ASCII文字コードで100)を受信できました。
次の段階として、次の処理を行いたいのですが、どのように記述して良いのか分かりません。
10進数のデータ(0~255)について、次の処理を行ってから、PC側にデータを送信したいと考えています。
①16進数に変換
②変換したら、ASCIIではなく、文字列としてPC側にデータ送信
コンパイラは、C18を使用しています。<usart.h>をインクルードしています。
テストとして、PICマイコンから100を送信し、PC(TeraTerm)で確認した所、「d」(ASCII文字コードで100)を受信できました。
次の段階として、次の処理を行いたいのですが、どのように記述して良いのか分かりません。
10進数のデータ(0~255)について、次の処理を行ってから、PC側にデータを送信したいと考えています。
①16進数に変換
②変換したら、ASCIIではなく、文字列としてPC側にデータ送信
Re: 10進->16進変換
これはどういう意味ですか?高校生 さんが書きました:②変換したら、ASCIIではなく、文字列としてPC側にデータ送信
ASCIIではないということは、EBCDICかなんかですか?
例えば0~31を送信する時、具体的にどのようなバイト列を送信したいですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 10進->16進変換
この「10進数のデータ」は、どのような形式で格納されていますか?高校生 さんが書きました:10進数のデータ(0~255)について
1桁ずつ数字で表現した文字列ですか?
それともBCD(Binary-coded decimal)ですか?
その他の形式ですか?
少なくとも、PICのメモリは普通にビットを格納するやつだと思うし、
そもそもC言語の仕様で数値はビット列で表現された2進数で格納することになっているので、普通の数値(int型とかunsigned char型とか)は10進数のデータではないはずですよね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 10進->16進変換
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進数のデータではないはずですよね。
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進数のデータではないはずですよね。
Re: 10進->16進変換
引用部分は引用部分であるとわかりやすいように書いてください。
(ASCII、各数値を2桁の十六進数に変換してLF区切りで出力、アルファベットは大文字)
とか(EBCDIC、各数値を2桁の十六進数に変換してLF区切りで出力、アルファベットは大文字)
とかではなく、ですね?
でしたら、多分、難しい変換を考えずに得られた8bitデータをUSART送信用データのレジスタにそのまま入れればいいでしょう。
無駄に謎形式の「10進データ」に変換する必要すらないでしょう。
ちなみに、Tera Termのデバッグモードを用いると送られてくるバイト列を十六進数で確認できます。
Tera termのちょっとした裏技: Crescent
送りたいバイト列は高校生 さんが書きました: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
とか
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
とかではなく、
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進変換
みけ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の裏技を使用して早速試してみました。
[試したコードの一部]
[結果]
Teratermに表示される文字は、・(ドット?)です。
送信用データが00のときも、FFのときも、・(ドット)が表示されてしまいます。
[データを変えてテスト]
送るデータを、
vol_R = (double)ADreadR / 10.13;
に変更すると、dと表示されます。 (このとき、vol_R=100を送信しています。)
dと表示されている時に、Shift + Escの裏技を行ってみましたが、Teratermの表示はdのまま変わりませんでした。
まず、送りたいデータは、次のデータです。(例: 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進変換
みけ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が受信用レジスタに保存される…
と考えて、次はマイコンで受信させてみたいと思います。
大変失礼しました。
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が受信用レジスタに保存される…
と考えて、次はマイコンで受信させてみたいと思います。
Re: 10進->16進変換
マイコンはASCIIのことは何も考えずに指定された数値を送信します。高校生 さんが書きました:私は、次のように当初理解していました。
PIC側で100というデータを送っているのに、Tera Termは、dと表示されてしまう。
⇒PIC側でASCIIに勝手に変換して送っているのかと思い、PIC側でデータ変換する必要があると考えていました。
しかし、実は、受信側(Tera Term)でASCIIに変えてしまっていたということなんですね。
(理解が間違えていたら訂正していただけると助かります。)
Tera Termは、受信した数値をASCIIに基づいて文字に変換して表示したり、エスケープシーケンスの処理をしたりします。
「ASCIIに変換」ではありません。
ASCII - Wikipedia
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)