![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
シリアル通信にてデータを連続的に受信するプログラムを
つくりたいと思っています.
以下のプログラムを作成して,
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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
シリアル通信プログラム(受信)について
C言語・C++・C#
-
シリアル通信の受信待ちについて
C言語・C++・C#
-
-
4
シリアル通信時のデータ受信方法
Visual Basic(VBA)
-
5
シリアル通信でのread関数の戻り値
C言語・C++・C#
-
6
Linuxでのシリアル通信についてですが、受信のときにデータがずれた状態で送られてくることがあります
C言語・C++・C#
-
7
RS232cを用いた送信プログラム
C言語・C++・C#
-
8
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
Excel VBA テキストインポート...
-
ポケコン PC-E650 の...
-
COBOLの定義について
-
阿武町4630万円誤送金事件。町...
-
不規則なデータのfft処理
-
ディベートに関して質問です。...
-
EXCEL データをコピーして別シ...
-
ACCESS VBA インデックスが有効...
-
質問です スマホのデータを真っ...
-
エクセルのVBA メッセージボッ...
-
COD測定の滴定
-
エクセルで一連の文字列の左端...
-
メモ帳(テキストデータ)をExc...
-
SDカード メーカーや値段によ...
-
C#でserialPort送信。RS232Cへ。
-
平均値の計算の仕方は?
-
MATLABでのFFTについて
-
エクセルで2つの時系列のデー...
-
MATLAB - 3D Matrix の体積を計...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
S9タイプからXタイプにデータ...
-
Excelのマクロでワードのテキス...
-
エクセルで2つの時系列のデー...
-
Accessで該当データにフラグを...
-
ユーザーフォームのテキストボ...
-
シーケンサにパソコンからアク...
-
EXCELVBAでSQLserverからデータ...
-
[C言語] コメント文字列を無視...
-
VBAを使ってOutlookメール本文...
-
プログラミング python pandas ...
-
VBA 毎日取得するデータを順番...
-
<VB>String→Object
-
カンマからスラッシュに
おすすめ情報