シリアル通信でのデータ受信
シリアル通信にてデータを連続的に受信するプログラムを
つくりたいと思っています.
以下のプログラムを作成して,
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_RATE 57600
#define BYTE_SIZE 5000 //250
#define PARITY NOPARITY //EVENPARITY
#define STOP_BIT TRUE
#define F_PARITY ONESTOPBIT
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;
}
お礼
Wr5 様 有難うございました。 自己解決しました。 サーバー側からの送信信号しか見ていませんでしたが、クライアント側(Windows)から接続を確立し、その後0x02を送信させると同じ現象が発生しました。 その後リトライで再度0x02を送信するのですが、そのときにクライアントがkeepalive状態に成っていて、同じデータを送信していました。 この時には0x02をデータとして表示しています。 この事から、単独で0x02の1バイトを送信出来ないと判断しました。 参考文献を読まないといけないと思いますが、Windowsパソコンから送信して同じ結果に成っているので そういうものだと判断しておきます。 今回は有難うございました。
補足
Wr5 様 ご丁寧な回答有難うございます。 Identificationに関しては、プログラムでデータを増えるようにしましたが、やはり0x02の1バイトだけが送れません。 おそらく、お知らせ頂いた部分に何らかの不具合が有るだろうとは思いますので、もうしばらくプログラムの見直し等して見ます。 又なにか判りましたらお知らせ頂けると大変有りがたいです。 以上宜しくお願いします。