
こんにちは、VC++初心者です。
現在、下記サイトのプログラムをもとにシリアル通信用プログラムを作成しています。
http://www.takebay.net/~daigo-ao/paddlewiki.pl/t …
例えば、editboxに02 31 32 33 03と入力したら、0x02 0x31 0x32 0x33 0x03として送信するところまではできました。
ただし、00と入力したとき、0x00として送信することができません。
どうすれば0x00を送信できるか、ご教授お願いいたします。
m_editSend.GetWindowText()にて入手したstrSendのデータから、SPACEを除いて、
0xをつけてhexにしてから、Send()にて送信しています。
void CSerial2Dlg::OnBnClickedButtonSend()
{
CString strSend;
CString strSendCMD;
CString bw;
int i, n, i2;
unsigned int hex;
m_editSend.GetWindowText(strSend); // ポート名を取得
char *buff = new char[strSend.GetLength()+1];
if(strSend.GetLength() == 0 || strSend == " "){ //送るものが無ければ終了
AfxMessageBox("送信するコマンドがありません。");
}
else{
strcpy(buff, strSend); //editboxのデータをbuff[]へコピー
i = 0;
n = 0;
bw = "\0";
while (buff[i] != '\n'){
if( buff[i] == ' ' || buff[i] == ':' || buff[i] == ',')//SPEACEorコロンorカンマをSKIPして送信する。
else{
bw += buff[i];//2文字ためる
n++;
}
if(n == 2){
sscanf(bw, "%x", &hex); //bwに2文字溜まったら、hexに変換
strSendCMD += hex;
bw = "\0"; //変換が終わったらClear
n = 0; //カウントもリセット
}
i++;
}
m_serial->Send(strSendCMD, strlen(strSendCMD));
}
delete [] buff ; //bufferの開放
}
下記のプログラムで、 WriteFileにて送信しています。
void CSerialCommunication::Send(LPCSTR str, DWORD strLength)
{
if (m_hComm == NULL) {
AfxMessageBox("COMポートが開かれていません");
return;
}
// ** 送信! **
DWORD dwWrite; // COMポートに送ったバイト数
WriteFile(m_hComm, str, strLength, &dwWrite, NULL);
}
No.3ベストアンサー
- 回答日時:
>普通、皆さんはシリアル通信の際、どのように変数使用していらっしゃるのでしょうか。
すでに回答にありますが、「文字列」が「NULL(0x00)終端」であることが問題の為、CString型は使えません。
char型配列のように内容に限らず(バイナリー)データとして扱える型を使用します。
質問のソースでは、
・2桁の文字列を数値(バイナリー値)に変化する処理(sprinfのあたり)
・Send()の引数の型の変更
を行えば対処可能です。
No.4
- 回答日時:
>普通、皆さんはシリアル通信の際、どのように変数使用していらっしゃるのでしょうか。
通常は固定電文を仕様化した上で通信を行うので、大概は構造体をごそっと送る方が多いですね。
ただ、質問されたようなケースでは(もちろん動的なエリア確保をする手もありますが…)、手っ取り早く全文字コードを送信する為には、変数「hex」(sscanfにて取得したデータ)を1文字ずつ送る手もありますね。
例:
---------------
char send[2]={0,0}; // 変数追加
// 中略
if(n == 2){
sscanf(bw, "%x", &hex); //bwに2文字溜まったら、hexに変換
send[0] = (char) hex;
m_serial->Send(send,1); // ここで1バイト送ってしまう
bw = "\0"; //変換が終わったらClear
n = 0; //カウントもリセット
}
// 後略
---------------
ご丁寧な説明ありがとうございます。
固定電文を仕様化してプログラムを作成したいところですが、
汎用性を持たせるために、あえてeditboxにいちいち電文を入れる様式でやっております。
char型でないと0x00は送信できないということも理解できました。
ご教示いただいた方法で挑戦してみます。
アドバイスありがとうございました。
No.2
- 回答日時:
「CSerialCommunication::Send」はご自分で作られた関数ですので、このままでOKだと思います。
それよりも問題はCStringを使用している事にあります。
0x00(NULL)は文字列の終端として扱われますので、いくらCStringに追加しても文字数としては増えません。
例:
---------------
CString strText;
strText += '1';
strText += '2';
strText += '3';
strText += (char)0x00;
strText += (char)0x00;
strText += (char)0x00;
ASSERT(strText.GetLength() == 3); // 3が返る
---------------
文字コードを全て送りたい場合にはCString以外の変数を使う事をお勧めします。
ご回答ありがとうございます。
普通、皆さんはシリアル通信の際、どのように変数使用していらっしゃるのでしょうか。
データ通信をするのに、0x00が遅れないんでは制御すらできないので、なんとかプログラムを作り上げたいのですが。
お知恵を拝借できれば幸いです。
No.1
- 回答日時:
「CSerialCommunication::Send()」は文字列を送信する関数です。
0x00は文字ではない為,送信できません。
送信するデータに0x00が含まれている場合はその時点で文字列終端(\0)と同じ意味になります。
どうしても文字ではない,0x00を送信するのであればバイナリデータを送信する関数をクラスに追加するか,別途バイナリ送信に対応したシリアル通信用プログラムを用意するしかありません。また,メインソースのstrSendCMDもバイナリデータが扱える配列に変更する必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PIC18F26K22でsscanf関数を使い...
-
Shift_JIS(16進)を文字に変換す...
-
WSH(VBS)でJSONの文字列を読み...
-
数字の入った配列をファイルへ...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
VBAのプログラムで、DIAG = 1# ...
-
引数で指定された配列の要素数...
-
配列の要素数に変数を入れたい...
-
VB.NETでファイル名順にファイ...
-
CStringからchar*への型変換に...
-
ポインタ
-
配列の問題
-
ヒープメモリの解放について
-
可変引数について。
-
C# Listを使わずに2次元配列の...
-
ダイアログから、ドキュメント...
-
C言語 ファイルの指定された行...
-
C# ArrayListを二次元配列のよ...
-
NULLとブランクの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WSH(VBS)でJSONの文字列を読み...
-
バイナリファイル中の日本語文...
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
%dなどの違い
-
_tcscpy_s(wcscpy_s)の第二引数...
-
プログラムによく出てくるst...
-
TCL言語で文字列検索方法を教え...
-
構造体→文字列→構造体 をする方法
-
プログラム問題・・・
-
C++で入力した文字列から数字を...
-
16進数を2文字ずつ配列に格納し...
-
[C++]WCHARの1文字目しか表示で...
-
シリアル通信で0x00を送信した...
-
char型配列の最大要素数
-
VB6.0でのバイナリデータの扱い...
-
sprintf関数での文字列変換につ...
-
Excelシートを固定長のテキスト...
-
c#で他のアプリの文字入力フォ...
-
CSVファイルの「”」について
おすすめ情報