gpt4 book ai didi

c++ - ReadFile 只读取一个缓冲区字符?

转载 作者:行者123 更新时间:2023-11-30 03:06:07 25 4
gpt4 key购买 nike

我正在编写一个程序,通过 USB 通过虚拟 com 端口与电机驱动器通信。我正在使用 windows.h file-io 与其通信(CreateFile、WriteFile、ReadFile)。我可以完美地写入驱动器,但在尝试读取时遇到问题。出于某种原因,ReadFile 似乎只从缓冲区中读入一个字符。这是我的代码:

#define READ_BUFF_SIZE 500
#define READ_TIMEOUT 5000
void ReadInput(HANDLE hComm)
{
DWORD dwRead, dwRes;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};
char lpBuf[READ_BUFF_SIZE] = {0};

osReader.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
if(osReader.hEvent==NULL){
cerr<<"Error creating overlapped handle!";return;}

if(!fWaitingOnRead){
if(!ReadFile(hComm, lpBuf, READ_BUFF_SIZE, &dwRead, &osReader)){
if(GetLastError()!=ERROR_IO_PENDING)
{cout<<"Error: "<<GetLastError()<<endl;return;}
else
fWaitingOnRead = TRUE;
}
else {cout<<"a\n";PrintInput(lpBuf,dwRead);}
}

if(fWaitingOnRead){
dwRes = WaitForSingleObject(osReader.hEvent,READ_TIMEOUT);
cout<<"\n\nAfter WaitForSingleObject."<<endl;
switch(dwRes)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(hComm,&osReader,&dwRead,TRUE))
cout<<"Error in Comm"<<endl;
else
{cout<<"b\n\n";PrintInput(lpBuf,dwRead);}
fWaitingOnRead = FALSE;
break;

case WAIT_TIMEOUT:
cout<<"wait timeout"<<endl;
break;

default:
cout<<"Default Case"<<endl;
break;
}

}
}

dwRead 似乎总是设置为 1。我将获取驱动器输出的第一个字符(撇号),但不会读取其余字符。我发现了一些变通方法,如果我将其修改为只需要一个字符,然后循环读取,它就会执行。
此外,我需要查询驱动器以获得响应,因此在调用此 ReadInput 函数之前,我必须调用 WriteBuffer 来发送一个字符。如果我在读取和写入调用之间放置一个延迟(~10-50 毫秒),它会读取整个内容。

有人对此有任何想法吗?这不是一个大问题,因为我找到了一些解决方法,但过去几天一直困扰着我。

编辑:对 tinman 问题的澄清。

最佳答案

您需要调用SetCommTimeouts使用适当的设置。这是我使用的一些代码。您应该查看 COMMTIMEOUTS 的 MSDN 文档结构。

// Only use read interval timeout. Do not use total read/write timeout.
COMMTIMEOUTS commtimeouts = { min((1000 + GetBaudrate() - 1) / GetBaudrate(), 1), 0, 0, 0, 0 };
SetCommTimeouts(m_hFile, &commtimeouts);

当然,您也可以提供总读取超时而不是间隔超时。

来自 MSDN :从通信设备读取时,ReadFile 的行为由使用 SetCommTimeouts 设置和检索的当前通信超时确定和 GetCommTimeouts功能。如果未能设置超时值,可能会出现不可预测的结果。有关通信超时的更多信息,请参阅 COMMTIMEOUTS .

关于c++ - ReadFile 只读取一个缓冲区字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com