こんにちは、プログラミング初心者の粉と申します。
現在シリアル通信を勉強しております。
cbInQueでバイト数を取得したいのですが、1バイトしか取得出来ていなく困っています。
受信用プログラムをVistaで起動し、送信用プログラムをXPで起動しています。
送信プログラムで「aaaaa」と入力しても受信プログラムの結果は「aフフフフフフフフフフフフ (1:1)」といった結果です。
なぜ1バイトしか取得出来ていないのかがわかりません。
送信プログラムが悪いのでしょうか?
(私の頭が悪いのは間違いないですが。)
どうか教えて頂けないでしょうか?
/* --- 受信用 --- */
#include <windows.h>
#include <iostream>
using namespace std;
void main(void)
{
HANDLE hComm;
char buff[10];
DWORD dwSize;
DWORD dwCount;
DWORD dwErrors;
COMSTAT ComStat;
hComm = CreateFile(
"COM7",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if( hComm == INVALID_HANDLE_VALUE ) exit( 1 );
cout << "--> Receive Wait <--\n";
while(1){
ClearCommError(hComm, &dwErrors, &ComStat);
dwCount=ComStat.cbInQue;// 1byteしか受信出来てないのはなぜ?
if(dwCount > 0){
ReadFile(hComm, buff, dwCount, &dwSize, NULL);
cout << buff << "(" << dwCount << ":" << dwSize << ")\n";
break;
}
}
cout << "--> Receive Complete <--\n";
CloseHandle(hComm);
}
/* --- 送信用 --- */
#include <windows.h>
#include <stdio.h>
#include <string.h>
void main(void)
{
HANDLE hComm;
DWORD size;
char ss[20];
hComm = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if( hComm == INVALID_HANDLE_VALUE ) exit( 1 );
while(1){
printf("Input: Send Data >");
scanf("%s", ss);
if(strcmp(ss, "exit") == 0) //exitを入力すると終了
break;
WriteFile(hComm, ss, strlen(ss), &size, NULL);
}
CloseHandle(hComm);
}
表示が「aフフフフフフフフフフフフ (1:1)」なのは、受信したデータを「文字列」として扱う時のコードが不適切だからです。
「文字列終端」について勉強してください。
データが1バイトしか受信出きていないのは、「そういうこともある」のがシリアルの性質だから(それ以外の通信手段でもそれほど珍しいパターンではありません)です。
絶対に1バイトずつしか取得できないわけではないけど、期待通りのバイト数のデータが読み出せる保証はありません。
有難う御座います。
勉強して出直して参ります!
ツイート | ![]() |