hiroasap
@hiroasap

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

シリアルポートの16進数を処理したい

シリアルポートの16進数を処理したい

VC2019で無線機とシリアル通信をするプログラムを作っています。
無線機からは16進数でデータが送られてきてそれの処理をするのがわかりません
のでご教示願えますか
以前他の無線機ではデータがアスキーコードで送られてきたので処理することが
出来たのですが16進数ですとどう処理するのかわかりませんのでお願いします
言語 C++ MFC利用
シリアルを受信のコード

int RADIO1::Readrs232c(CString* RS_Send, CString* RS_Read)
{
CString SSD, RRD;
char In[1024];
DWORD lRead;
int  itemp;

//HANDLE hPort;
int Ret = 0;

strcpy_s(In, 1024, "    ");
//フフフフのゴミが出てしまうのでここでスペース代入

Ret = ReadFile(   // データの受信
    ComPort,   
    //  通信デバイスのハンドル: CreateFile()で取得したハンドルを指定
    In,       
    // 受信バッファーのポインタを指定: 受信データがここに格納されます。
    1024,        
    // 受信するバイト数を指定: ここで指定するバイト数を受信するか
    //またはタイムアウト時間がくるまで
    // ReadFile()関数は( getc()のように )待ちます
    &lRead,  //  実際に受信したバイト数(DWORD)が格納されるポインタを指定
    NULL   // 通信とは関係ない引数なのでNULLを指定
);

if (Ret == FALSE)     //失敗した場合
{
    printf("ReadFile failed. \n");
    CloseHandle(ComPort);
    exit(0);
}

//アスキーの場合は下記で処理出来てます
RRD = In;
*RS_Read = RRD;

//とりあえずintに変換してみました
int kari;
kari = int(In);

return 0;

}

他のシリアル通信モニタープログラムで無線機からの受信したデータを確認したところ
FE FE 00 94 00 60 57 01 07 00 FD
となっていて
中の意味は下記のようになってます
FEFEはコマンド先頭のコード
00は宛先アドレス
94は送信元のアドレス
00はコマンド
60 57 01 07 00
はデータで 0070015760 です
FDはコマンド末尾のコード

vc2019でブレークでkariを16進数で確認した値です
0x6ed1a660

0

2Answer

他のシリアル通信モニタープログラムで無線機からの受信したデータを確認したところ
FE FE 00 94 00 60 57 01 07 00 FD
となっていて・・・

上のように、"FE FE 00 94 00 60 57 01 07 00 FD"と出力させたいのでしょうか?


無線機からは16進数でデータが送られて・・・

その無線機の型式や品名が分かれば、もう少しアドバイスできるかも知れません。

0Like

Comments

  1. @hiroasap

    Questioner

    回答ありがとうございます。
    無線機はICOM IC-7300です
    この例でいいますと
    "FE FE 00 94 00 60 57 01 07 00 FD"
    FEFEのあとの00がコマンドで周波数を表示する意味です
    そのあとの60 57 01 07 00が実際の中身で0007015760が周波数の値を
    取り出したいです
    他にもコマンド01がモードだったりします
    プログラムの方はポインターの使い方がよくわかってなくて苦戦してます

  2. ↑ こちらの取説で 各種フォーマットが理解できました。

    VC++MFCでプログラムを作るのは、他の無線機用のプログラムを改造している ということでしょうか? (おっしゃる通り、ポインターの理解がネックになりますね)
    Pythonであれば、C\C++よりデータの取り扱いが楽にできると思いますが。

  3. CI-V のライブラリが出回っていないかネットを探してみました。
    役に立つか分かりませんが、3つ挙げておきます。

取得部分は何かのサンプルで試しているのでしょうけど
エラーが出ていないなら周波数の値が配列 In に入っているでしょ?

そこから取り出すのにポインタは特に不要かと思います

あとその受信形式はアスキー(テキスト形式)に対してバイナリ形式になります
16進は表示の問題だけで関係ありません

0Like

Your answer might help someone💌