UARTから送られてきたデータとチェックサム(16進2桁)をPIC側で計算して、
間違えがないかチェックしたいのですが、
sscanfをPIC18F26K22, MPLAB X IDE v5.20とXC8 v2.05にて動くか書いてみましたが、
ビルドが通りませんでした。
sscanfをコメントアウトするとビルドが通るのでPICでサポートしていないみたいです。
本題です。
例えば、送られてきたデータとチェックサムが下記のように配列に格納されていて、
チェックサムの文字をそのまま16進の文字として扱うにはどのようにすればいいでしょうか?
よろしくお願いします。
配列:char deta[6] = {"GGAE2E"}; // 最後の2文字がチェックサムです。
No.5
- 回答日時:
文字コードが ASCII であると仮定したうえでたぶんだいたい余計な話.
文字をその文字コードで比較するなら
if (deta[len - 2] >= 0x30 && deta[len - 2] <= 0x39)
よりも
if (deta[len - 2] >= '0' && deta[len - 2] <= '9')
あるいは
if ('0' <= deta[len - 2] && deta[len - 2] <= '9')
のように文字定数を使った方がいい.
さらに, 「おかしなデータがやってくることはない」という前提で話をするなら
if (deta[len - 2] >= 0x30 && deta[len - 2] <= 0x39) {
tmp1 = deta[len - 2];
}else{
tmp1 = deta[len - 2] + 0x20; // 大文字を小文字に変換
}
(を適当になおすことにして) よりも
tmp1 = deta[len-2];
if (tmp1 > '9') {
tmp1 += 10 - 'A';
}
tmp1 &= 0x0f;
の方が (じっと見ないとわからないけど) 簡単かもしれない.
ちなみに「データ」は英語で
data
と書く (ふだん使わないけど単数形は datum).
No.3
- 回答日時:
上位1桁目をint tmp1に
下位1桁目をint tmp0に
代入したら、 2桁の16進数は tmp1 * 0x10 + tmp0 (あるいは、シフト演算を使って tmp1 << 4 + tmp0) になる、ということはご理解いただけますか?
10進数 で 十の位 が4 一の位が 7 なら、 4 × 10 + 7 = 47 です。
16進数でも考えは同じです。
> sprintfだと配列に数値が入りますので、単純にifで比較できませんでした。
何の事を言っているのか、何故急にsprintfが出てきたのかわかりませんが。
回答ありがとうございます。
VC2017上で書いてみましたが出力が、0x385となってしまいます。
ソースを記載しますので誤っている箇所をご指摘願います。
int main() {
char deta[7] = { "GGAE2E" }; //0x32:0x45(小文字は0x65)
int len = 0;
int tmp1 = 0;
int tmp0 = 0;
int tmp2 = 0;
len = strlen(deta);
if (deta[len - 2] >= 0x30 && deta[len - 2] <= 0x39) {
tmp1 = deta[len - 2];
}else{
tmp1 = deta[len - 2] + 0x20; // 大文字を小文字に変換
}
if (deta[len - 1] >= 0x30 && deta[len - 1] <= 0x39) {
tmp0 = deta[len - 1];
}else{
tmp0 = deta[len - 1] + 0x20; // 大文字を小文字に変換
}
printf("len:%d\n\n",len);
printf("結合前:0x%x:0x%x\n",tmp1,tmp0);
tmp2 = (tmp1 * 0x10) + tmp0;
printf("結合:0x%x\n\n",tmp2);
while (1) {}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- au(KDDI) auからの 【重要なお知らせ】 は本物? 6 2022/04/07 22:09
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
曜日を格納する配列の大きさ
-
文字列操作
-
C++で入力した文字列から数字を...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
プログラムによく出てくるst...
-
c言語のstrncpyについて
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
【速いブラインドタッチ】手を...
-
VBAにてcolorindexを変数に格納...
-
日付チェック関数について
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
C言語のintとcharの違いってな...
-
擬似コード 長さがmの配列でな...
-
CImage GetBitsメソッドについて
-
配列の要素数に変数を入れたい...
-
ヘッダファイルと構造体
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
WSH(VBS)でJSONの文字列を読み...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
数字の入った配列をファイルへ...
-
構造体→文字列→構造体 をする方法
-
VB6.0でのバイナリデータの扱い...
-
char型配列の最大要素数
-
[C++]WCHARの1文字目しか表示で...
-
アルファベットをカウント、
-
VBA-DLLの引数受け渡しについて
-
c#で他のアプリの文字入力フォ...
-
C言語の勉強しています。すみま...
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
おすすめ情報
>16進文字(char) → 対応するint への1桁だけ変換する関数
この処理部はできましたが、int型の変数、例:「int tmp;」に変換して、
char deta[6] = {"GGAE2E"}; のGGAEから算出したチャックサムが入っている
int型の変数、例:「int check = 0x7e;」と比較したいです。
sprintfだと配列に数値が入りますので、単純にifで比較できませんでした。
ここの処理がうまくゆけば完成なのですが・・・
大変恐縮ですが、ご教示いただけないでしょうか。
訂正します。
>この処理部はできましたが、2つのint型の変数を1つの変数、例:「int tmp;」に変換して。