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;
}

最佳答案

您无法知道自己要什么,因为没有软件可以对远程终端的行为做出预测。因此,读取应在其他线程中进行。在读取线程中,您可以指示ReadFile一次读取一个字节。您可以选择同时读取更多字节,但是这样会冒着从另一部分接收到完整消息的风险,但仍然无法得到通知,因为ReadFile被阻止等待更多数据。

自己创建线程代码可能很困难。我建议您搜索已经为您处理此问题的库。

关于c++ - C++(使用<windows.h>进行串行通信)-如何事先查明ReadFile()方法将读取多少个字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5662782/

10-11 21:47