シリアル通信にてデータを連続的に受信するプログラムを
つくりたいと思っています.
以下のプログラムを作成して,
main関数のcountを増やして,繰り返しreadを行おうとすると,
出力結果として,
時,分,秒,ID,値B,値C,値Dというフォーマットで
0, 9,30, 1,514,708,542,290
0, 9,30, 2,515,707,542,288
0, 9,30, 3,514,709,542,287
0, 9,30, 4,514,707,543,289
0, 9,30, 5,514,708,542,289
0, 9,30, 6,514,708,542,292
0, 9,30, 7,514,708,542,291
0, 9,30, 8,514,708,542,289
0, 9,30, 9,514,708,543, 0, 9,39,35,514,708,542,289
(この後フが連続)
フフフフフフフフフフフフフフフ ク 0, 9,39,36,514,708,542,290
0, 9,39,37,515,709,541,291
0, 9,39,38,514,707,542,286
0, 9,39,39,514,708,542,281
0, 9,39,40,514,708,542,284
0, 9,39,41,514,707,542,286
0, 9,39,42,514,707,542,290
0, 9,39,43,514,709,542,290
0, 9,30, 9,514,708,543, 0, 9,39,35,514,708,542,289
フフフフフフフフフ・・・再びフ
となってしまいます.
問題としては
・フがたくさんでてきてしまう.
・1サイクルの最後で改行ができていない
・1サイクルが終わって次のサイクルに入る時までの
間にデータが失われている.
・2サイクル目になぜか1サイクル目の値が残っている?
などがあります.
どなたか解決方法を教えていただけると大変助かります.
よろしくお願いします.
-------------------------------
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <stdio.h>
#define COM_PORT_NAME"COM2"
#define BAUD_RATE57600
#define BYTE_SIZE5000 //250
#define PARITYNOPARITY //EVENPARITY
#define STOP_BITTRUE
#define F_PARITYONESTOPBIT
HANDLE hComm;// シリアルポートとの通信ハンドル
bool ComInit()
{
// シリアルポートを開ける
hComm = CreateFile(
COM_PORT_NAME,/* シリアルポートの文字列 */
GENERIC_READ | GENERIC_WRITE,
/* アクセスモード:読み書き */
0,/* 共有モード:他からはアクセス不可 */
NULL,/* セキュリティ属性:ハンドル継承せず */
OPEN_EXISTING,/* 作成フラグ: */
FILE_ATTRIBUTE_NORMAL,/* 属性: */
NULL/* テンプレートのハンドル: */
);
if (hComm == INVALID_HANDLE_VALUE) {
printf("シリアルポートを開くことが出来ませんでした。\n");
return false;
}
// 通信属性を設定する
DCB dcb;
GetCommState(hComm, &dcb); /* DCB を取得 */
dcb.BaudRate = BAUD_RATE;
dcb.ByteSize = BYTE_SIZE;
dcb.Parity = PARITY;
dcb.fParity = STOP_BIT;
dcb.StopBits = F_PARITY;
SetCommState(hComm, &dcb); /* DCB を設定 */
return true;
}
void ComEnd()
{
// ハンドルを閉じる
CloseHandle(hComm);
}
bool ReadData(char *buff, unsigned int max_size)
{
DWORD dwErrors; /* エラー情報 */
COMSTAT ComStat; /* デバイスの状態 */
DWORD dwCount; /* 受信データのバイト数 */
DWORD dwRead; /* ポートから読み出したバイト数 */
ClearCommError(hComm, &dwErrors, &ComStat);
dwCount = ComStat.cbInQue;
FILE *fid;
fid=fopen("test.txt", "w");
printf("%d %d\n", dwCount, max_size);
fprintf(fid,"%d %d\n", dwCount, max_size);
fclose(fid);
if (dwCount > max_size) {
printf("バッファサイズが足りません。\n");
return false;
}
if(hComm != NULL){
ReadFile(hComm, buff, dwCount, &dwRead, NULL);
if (dwCount != dwRead) {
printf("データの受け取りに失敗しました。\n");
return false;
}
}
return dwRead;
}
int main(int argc, char* argv[])
{
char buff[BYTE_SIZE];
int count = 0;
int data_length;
FILE *fid2;
fid2=fopen("test2.txt","w");
ComInit();
while(1){
if(count == 2) break;
count++;
data_length=ReadData(buff, strlen(buff));
printf("%s ",buff);
fprintf(fid2, "%s ",buff);
}
fclose(fid2);
ComEnd();
return 0;
}
No.4ベストアンサー
- 回答日時:
先ほどの訂正と追加です。
3.dcb.Bytesizeを8にして、while文を無限ループにし
(countのif~break文を削除し), strlen(buff)のところを
BYTE_SIZEにしてみてください。データが取りこぼしなく
表示されませんか。
#通信が終わらないという問題は、受信ができない問題
とは別問題なので、今は考えていません
4.3.でデータの取りこぼしがあれば、送信側・受信側とも、
BaudRateを低く(9600bpsとか)してみて改善されるかどうか、
確認してください。
データの取りこぼしが通信速度によるものなら、フロー制御など
も考えないといけませんね。ところで、今頃聞くのもなんなんですが、
送信側・受信側は、どのような環境をお使いなんでしょう?
No.3
- 回答日時:
もう少し具体的に情報を書いてもらったほうが、
回答するのが楽になります。
とりあえず、以下の点については、どうでしょうか?
確認事項
1.COM2に正常にデータが送信されてきていますか?
(ハイパーターミナル等を起動して、データ受信を確認する)
2.dcb.Bytesizeを7、8にすると受信に失敗するとありますが、
具体的にはどういう風に失敗するのでしょうか?
#やはり5000という値は、おかしいと思います。
なぜに5000?化けたり、ロストとしたりは、
この辺りが原因のような気もしますが。
3.dcb.Bytesizeを8にして、while文を無限ループにし
(countのif~break文を削除し), strlen(buff)のところを
100とすると、受信したデータが画面に表示されませんか?
No.2
- 回答日時:
#defineでSTOP_BITとF_PARITYの名前と値の対応関係がおかしい気がしますが、
とりあえず、値をセットする側でうまく(?)吸収されてますね。
ところで、dcb.ByteSizeが5000になりますが、ここは、1バイトのビット数を
指定する場所ですね。通常7か8を指定するはずですが、5000としているのは、
何か理由があるのでしょうか。
また、main関数のReadData(buff, strlen(buff))の部分ですが、buffが
初期化されていないので、strlen(buff)がどのような値になるかわからない
気がするのですが、その辺りはいかがですか。
strlen(buff)の部分を100とかの固定値にすると、結果はどのようになりますか?
シリアル通信について、私も初心者なので、この辺りからのアプローチしか
できませんが、問題解決の一助になれば幸いです。
たびたびありがとうございます.
お礼が遅くなり申し訳ありません.
dcb.bytesizeを7あるいは8とすると
データの受け取りで失敗してしまうのです・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
シリアル通信プログラム(受信)について
C言語・C++・C#
-
Linuxでのシリアル通信についてですが、受信のときにデータがずれた状態で送られてくることがあります
C言語・C++・C#
-
-
4
シリアル通信時のデータ受信方法
Visual Basic(VBA)
-
5
シリアル通信の受信待ちについて
C言語・C++・C#
-
6
シリアル通信でのread関数の戻り値
C言語・C++・C#
-
7
WriteFile()でのデータ送信ができなくなる
C言語・C++・C#
-
8
RS232cを用いた送信プログラム
C言語・C++・C#
-
9
シリアル通信でのデータ分け
C言語・C++・C#
-
10
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
-
11
CreateFile関数でCOMポートが開けない
C言語・C++・C#
-
12
visual C++ でaruduinoとシリアル通信
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
S9タイプからXタイプにデータ...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
VBにおいてフォーム間の変数の...
-
VBA 空白セルを削除ではない方...
-
大学のゼミのレポートがムカつ...
-
エクセルで2つの時系列のデー...
-
[C言語] コメント文字列を無視...
-
VBAを使ってOutlookメール本文...
-
ユーザーフォームのテキストボ...
-
シーケンサにパソコンからアク...
-
C# でDataTableの更新を高速化...
-
EXCELVBAでSQLserverからデータ...
-
Excelのマクロでワードのテキス...
-
0が含まれる幾何平均が「#NUM!」
-
WEBサイトの構築。表示データと...
-
CString型の文字列連結について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
多量のSUMIF式を軽くしたい
-
エクセルで2つの時系列のデー...
-
Excelのマクロでワードのテキス...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
VBAを使ってOutlookメール本文...
-
Accessで該当データにフラグを...
-
合計3TBのデータのハッシュ値を...
-
シーケンサにパソコンからアク...
-
S9タイプからXタイプにデータ...
-
カンマからスラッシュに
-
VBAでシートからコンボボックス...
-
VBA 毎日取得するデータを順番...
-
ビットシフトについて
-
ユーザーフォームのテキストボ...
-
EXCELVBAでSQLserverからデータ...
-
特定のデータの抽出方法を教え...
おすすめ情報