シリアル通信でのデータ受信
シリアル通信にてデータを連続的に受信するプログラムを
つくりたいと思っています.
以下のプログラムを作成して,
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;
}
補足
早々のご回答ありがとうございます。 ReadFileは正常終了していますが、 ポートから読み出したバイト数は「0」です。 コンパイルエラーは、タイムアウト設定の処理を コピーし忘れていました。 HANDLE hComm; /* シリアルポートのハンドル */ DCB dcb; char* pszBuf="1234567890"; /* 書込・読込領域 */ hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hComm, &dcb); /* DCB を設定 */ // タイムアウト設定 COMMTIMEOUTS to; to.ReadIntervalTimeout = 0; to.ReadTotalTimeoutMultiplier = 0; to.ReadTotalTimeoutConstant = 0; SetCommTimeouts(hComm,&to); DWORD dwRead; /* ポートから読み出したバイト数 */ DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ ClearCommError(hComm, &dwErrors, &ComStat); ReadFile(hComm, pszBuf, 10, &dwRead, NULL);