用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 为什么, 每次都是这个错误,
更请高手指点指点
采用 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 为什么, 每次都是这个错误,
更请高手指点指点
解决方案 »
- 在CListCtrl::OnLvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult)函数中怎样过滤只显示符合条件的行
- 如何把图标加到系统托盘上
- ADO+DBGrid,错误提示" 不支持此接口"
- 【急切咨询】多线程中关于:变量编译不通过的问题!!
- "超越基类的虚拟函数"是什么意思呀?
- 多选文件时,CFileDialog::GetNextPathName得到的路径会有双斜杠,请问怎么解决
- 分析dll工具用什么,哪里提供下载?
- 大连vc程序员薪水如何
- Process Monitor注册表监控是如何实现的?
- 如何解密rarÎ文件?
- 如何把一个CTreeCtrl和一个树形数据结构关联在一起?
- 数据保密的问题
HANDLE hFile=CreateFile(FilePathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);这样就OK啦
我们项目中要求采用 FILE_FLAG_OVERLAPPED 模式, 不能用 FILE_ATTRIBUTE_NORMAL 模式我试过你的方式, 结果连writefile都过不去.还有没有其他的办法
char *lpBuf;
DWORD lpREAD;ReadOver( hComm, lpBuf, &lpRead);结果当然是内存冲突了.