![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
こんにちは、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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
なぜ通信には16進数文字列が使われるのでしょうか シリアル通信や、xbeeなど、通信には16進数文字
ネットワーク
-
teratrermを使ったデータの送信について
Windows 10
-
シリアル通信プログラミングでのバイナリデータ送信
C言語・C++・C#
-
-
4
Visual Basic でのコードをASCII変換、16進変換したものを元に戻す方法を教えてください
Visual Basic(VBA)
-
5
シリアル通信プログラム(受信)について
C言語・C++・C#
-
6
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
7
WriteFile()でのデータ送信ができなくなる
C言語・C++・C#
-
8
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
9
シリアル通信の出力バッファと送信完了イベントについて
C言語・C++・C#
-
10
PLCとPCの通信
Visual Basic(VBA)
-
11
バイナリデータ受信時のデータ順
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
C言語の勉強しています。すみま...
-
%dなどの違い
-
TCL言語で文字列検索方法を教え...
-
アルファベットをカウント、
-
[C++]WCHARの1文字目しか表示で...
-
文字列にある特定文字の数
-
プログラム問題・・・
-
Excelシートを固定長のテキスト...
-
プログラムによく出てくるst...
-
数字の入った配列をファイルへ...
-
ポインターのポインターについ...
-
#include <stdio.h> int main(v...
-
c#で他のアプリの文字入力フォ...
-
VB6.0でのバイナリデータの扱い...
-
char型配列の最大要素数
-
関数に文字列を渡すことについて
-
WSH(VBS)でJSONの文字列を読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムによく出てくるst...
-
nullと""、\\0とEOFの違いにつ...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
16進数を2文字ずつ配列に格納し...
-
シリアル通信で0x00を送信した...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
構造体→文字列→構造体 をする方法
-
VBA-DLLの引数受け渡しについて
-
[C++]WCHARの1文字目しか表示で...
-
数字の入った配列をファイルへ...
-
VB6.0でのバイナリデータの扱い...
-
引用符と二重引用符
-
こんなことって可能なのですか...
-
char型配列の最大要素数
-
sprintf関数について教えて下さ...
-
C言語の課題で困っています;
おすすめ情報