用WIN32 API写一个串口读写的程序,
采用 OVERLAPPED 方式, 
为read port单独开一个线程, 如果有 EV_RXCHAR 发生
就调用ReadOver(hComm, lpBuf, &dwRead)函数ReadOver函数如下:
BOOL ReadOver(HANDLE hComm, char *lpBuf, DWORD *lpRead)
{

    OVERLAPPED osReader = {0};
BOOL bReadStatus = TRUE; DWORD  ErrorResult ;
*lpRead = 1 ;
const DWORD READ_BUFFER_SIZE = 1 ;    // Create the overlapped event. Must be closed before exiting
    // to avoid a handle leak.
    osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    if (osReader.hEvent == NULL)
       // Error creating overlapped event; abort.
   return 0;       // Issue read operation.
bReadStatus = ReadFile(hComm, lpBuf, READ_BUFFER_SIZE, lpRead, &osReader);
if (!bReadStatus){
ErrorResult = GetLastError();
if (ErrorResult == ERROR_IO_PENDING){
WaitForSingleObject(osReader.hEvent, 1000);
return 1 ;
} else {
return 0 ;
}
} else {
return 0;
};
         // immediately read
         return 1;
}为了便于调试, 我将串口的RXD和TXD短接
敲键向串口发送字符"X"
每次都能收到 EV_RXCHAR 事件
但一调用ReadOver, 
在ReadFile后, GetLastError() 返回值都是998L,
查阅MSDN, 发现998对应的宏如下;
998 Invalid access to memory location.  ERROR_NOACCESS 为什么, 每次都是这个错误, 
更请高手指点指点

解决方案 »

  1.   

    在CreateFile中设置读文件的权限
     HANDLE hFile=CreateFile(FilePathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);这样就OK啦
      

  2.   


    我们项目中要求采用 FILE_FLAG_OVERLAPPED 模式, 不能用 FILE_ATTRIBUTE_NORMAL 模式我试过你的方式, 结果连writefile都过不去.还有没有其他的办法
      

  3.   

    问题已经解决, 是我没有给接收字符的字符指针分配空间, 如下: 
    char    *lpBuf;
    DWORD   lpREAD;ReadOver( hComm, lpBuf, &lpRead);结果当然是内存冲突了.