C++ WriteFile()和ReadFile()异步不写入或读取

C++ WriteFile()和ReadFile()异步不写入或读取,c++,winapi,serial-port,C++,Winapi,Serial Port,我正在尝试使用writefile和readfile函数通过串行端口连接发送和接收字符串。我必须异步执行此操作,因为要读取的字节数总是不同的,readfile只会挂起或阻塞,直到获得正确的字节数。现在我尝试异步执行此操作,我的writefile函数不会发送任何数据,而我的readfile函数似乎被跳过,因为下一行开始执行此操作时没有读取任何字符。不确定这是我的重叠结构问题还是超时问题。但我在这一刻被困住了 超时 void Serial::OpenPortRead() { HANDLE sSeria

我正在尝试使用
writefile
readfile
函数通过串行端口连接发送和接收字符串。我必须异步执行此操作,因为要读取的字节数总是不同的,
readfile
只会挂起或阻塞,直到获得正确的字节数。现在我尝试异步执行此操作,我的
writefile
函数不会发送任何数据,而我的
readfile
函数似乎被跳过,因为下一行开始执行此操作时没有读取任何字符。不确定这是我的重叠结构问题还是超时问题。但我在这一刻被困住了

超时

void Serial::OpenPortRead()
{
HANDLE sSerial =  CreateFile(L"COM3",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
//Timeout Settings
COMMTIMEOUTS    CommTimeouts;   
GetCommTimeouts(sSerial, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout            = 5000; 
    CommTimeouts.ReadTotalTimeoutMultiplier     = 2; 
    CommTimeouts.ReadTotalTimeoutConstant       = 10; 
    CommTimeouts.WriteTotalTimeoutMultiplier    = 50; 
    CommTimeouts.WriteTotalTimeoutConstant      = 500; 

//Port Settings
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
dcbSerialParams.BaudRate=CBR_19200;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;

SetCommState(sSerial,&dcbSerialParams);//Apply Settings to Handle




}
写文件函数

void Serial::WritePort(CString buffer)
{


DWORD bytes;//pointer to hold number of bytes written
USES_CONVERSION;
CW2A buf((LPCWSTR)buffer);//Convert unicode to ascii



OpenPortRead();
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

WriteFile(sSerial, buf,strlen(buf),&bytes,&overlapped_structure);//Send string


}
int Serial::ReadPort(CString buf){

OpenPortRead();// Open Serial Communication for reading

const int buffer_size = 10;
 char buffer[10];//buffer to hold recieved string

memset (buffer, 0, buffer_size * sizeof (char));
int n, num,iTemp,i=0;
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

DWORD bytesRead;//pointer to number bytes read


ReadFile(sSerial,&buffer,buffer_size,&bytesRead,&overlapped_structure);// begin read



//Used this function because return would be filled with extra raw data characters
buffer[n] = StringLength(buffer, &n);//find length of string returned
num = n;
读取文件功能

void Serial::WritePort(CString buffer)
{


DWORD bytes;//pointer to hold number of bytes written
USES_CONVERSION;
CW2A buf((LPCWSTR)buffer);//Convert unicode to ascii



OpenPortRead();
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

WriteFile(sSerial, buf,strlen(buf),&bytes,&overlapped_structure);//Send string


}
int Serial::ReadPort(CString buf){

OpenPortRead();// Open Serial Communication for reading

const int buffer_size = 10;
 char buffer[10];//buffer to hold recieved string

memset (buffer, 0, buffer_size * sizeof (char));
int n, num,iTemp,i=0;
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

DWORD bytesRead;//pointer to number bytes read


ReadFile(sSerial,&buffer,buffer_size,&bytesRead,&overlapped_structure);// begin read



//Used this function because return would be filled with extra raw data characters
buffer[n] = StringLength(buffer, &n);//find length of string returned
num = n;

MSDN包含有关如何在串行端口通信中使用重叠I/O的详细信息:


在WriteFile/ReadFile之后,您需要等待重叠事件。感谢您的回复,但可能有一个例子可以帮助我解决重叠I/O的问题,即它会在稍后完成,并且您的程序可以在进行过程中继续运行。等待它完全消除了一开始使用它的意义。无论您的问题是什么,重叠I/O都不是答案。