ReadFile(hSerial,buffer,25,& dwBytesRead,0);
嘿ppl
我的问题是如何在调用ReadFile之前找出我的ReadFile语句将返回多少个字符?我正在与之通信的设备根据发送的内容返回不同的数据。关于上面的ReadFile,在那个例子中,我知道返回的数据长度是25个字符,但是如果我不知道答案,我怎么能用一个足以接收任何数据量的变量替换25。
在我的代码中你会看到我有2个Readfile语句,在这两种情况下我知道我会收到的数据量,我发送了一个固定的数字,当我不知道这个数量时会发生什么?
#include "stdafx.h"
#include "windows.h"
BOOL SetCommDefaults(HANDLE hSerial);
void StripCRLFandPrint(char *command);
char buffer[1000];
HANDLE hSerial;
DWORD dwBytesRead = 0;
DWORD dwBytesWritten = 0;
char trash;
int main(int argc, char* argv[])
{
hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0 , 0 , OPEN_EXISTING , 0 , 0);
if (hSerial == INVALID_HANDLE_VALUE) return GetLastError();
SetCommDefaults(hSerial);//Initializing the Device Control Block
COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=50;
timeouts.ReadTotalTimeoutConstant=50;
timeouts.ReadTotalTimeoutMultiplier=10;
timeouts.WriteTotalTimeoutConstant=50;
timeouts.WriteTotalTimeoutMultiplier=10;
char szRxChar[3];//varialble holds characters that will be sent
szRxChar[0] = '?';
DWORD y =0, z =0;
char buf[327];// will hold the data received
memset(buf,0,327);//initializing the buf[]
memset(buffer,0,10000);
WriteFile( hSerial , &szRxChar , 1, &dwBytesWritten ,0);
ReadFile( hSerial , buf , sizeof(buf), &dwBytesRead , 0);
printf("Retrieving data...\n\n");
//Displaying the buffer
printf( "%s",buf);
printf("\nData Read: %i\n",dwBytesRead);
printf("Enter an option:");
scanf("%c%c",&szRxChar,&trash);//Reading the next command to be sent
while(szRxChar[0] != '1')//Press one to exit
{
memset(buffer,0,10000);
//StripCRLFandPrint(szRxChar);
WriteFile( hSerial , &szRxChar, 1, &dwBytesWritten ,0);
ReadFile( hSerial , buffer , 25, &dwBytesRead , 0);
printf("%s",buffer);
printf("\nData Read: %i\n",dwBytesRead);
printf("\n");
printf("Enter an Option:");
scanf("%c%c",&szRxChar,&trash);
}
CloseHandle(hSerial);// Closing the handle
return 0;
}
答案 0 :(得分:0)
您无法知道您的要求,因为没有软件可以预测远程端的行为。因此,读数应该在不同的线程中进行。在读取线程中,您可以指示ReadFile一次读取一个字节。您可以选择同时读取更多字节,但之后您可能会收到来自其他部分的完整消息,但仍然没有收到通知,因为ReadFile被阻止等待更多数据。
自己创建线程代码可能具有挑战性。我建议您搜索已经为您处理此问题的库。
答案 1 :(得分:0)
您永远不会确切知道发送了什么,但不是放25
,而是使用sizeof(buffer)
。
请记住,ReadFile()
并不完美。我在较慢的硬件上遇到过问题,而ReadFile()
并不总是在通过COM端口发送的完整消息中读取。因此,尽管速度较慢,但逐字节读取以确保获取整个消息可能是有益的:
int c;
DWORD dwBytesRead = 0;
if (!(pcState[readerPort] & PORT_OPEN)) {
RecvIndex = 0;
Sleep(1000);
return;
}
ReadFile(hComm[readerPort], buff, 1, &dwBytesRead, NULL); // array of handles used here
c = buff[0];
if (dwBytesRead == 0) { // possible end of transmission
if (RecvTimer++ > 3) {
RecvTimer = 0;
if (RecvIndex) { // have receive some data prior
keyBuf[RecvIndex] = 0;
RecvIndex = 0;
processBuffer(keyBuf);
memset(keyBuf, 0, sizeof(keyBuf));
}
}
} else {
RecvTimer = 0; //Restart timer
if (RecvIndex == 0) { // first character
memset(keyBuf, 0, sizeof(keyBuf));
keyBuf[0] = (unsigned char)c;
RecvIndex = 1;
} else { // get remaining characters
if (RecvIndex < sizeof(keyBuf))
keyBuf[RecvIndex++] = (unsigned char)c;
}
}
在上面的例子中,keyBuf
是一个私有类变量,上面的代码是在while
循环中调用的函数的一部分。