2013-02-15 180 views
1

我试图使用writefilereadfile函数通过串行端口连接发送和接收字符串。我必须异步执行此操作,因为要读取的字节数将始终不同,并且readfile只会挂起或阻塞,直到获得正确的字节数。现在我试图异步执行此操作,因此我的writefile函数将不会发送任何数据,并且我的readfile函数似乎会被跳过,因为下一行开始执行它,而不读取任何字符。不知道这是我的Overlapped结构还是我的超时问题。但我在这一刻卡住了。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; 
+0

在WriteFile/ReadFile之后,您需要等待重叠事件。 – 2013-02-15 15:09:27

+0

感谢您的回复,但可能是一个帮助我的例子 – user1704863 2013-02-15 15:13:21

+1

重叠I/O的要点是它会在*稍后*完成,并且您的程序可以在正在进行时继续运行。等待它完全消除了首先使用它的要点。无论您的问题是什么,重叠的I/O都不是答案。 – 2013-02-15 15:22:11

回答