WriteFile出错,GetLastError得到87。

helen_alone 2008-04-12 01:10:17
设置如下,能进行接收数据,但是发送数据返回87。总是发不出去
m_handle=CreateFile(g_comm.comm,GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(m_handle==INVALID_HANDLE_VALUE)
return false;

//初始化串口,READBUFFER,WRITEBUFFER是用户自己定义的
SetupComm(m_handle,SERIAL_BUF_NUM,SERIAL_BUF_NUM);
PurgeComm(m_handle,PURGE_TXCLEAR|PURGE_RXCLEAR);

//设置DCB参数
if(!GetCommState(m_handle,&dcb))
{
CloseHandle(m_handle);
return false;
}
dcb.BaudRate=atol(g_comm.btl);
dcb.ByteSize=atoi(g_comm.data);
if(g_comm.parity == "无")
dcb.Parity=NOPARITY;
else if(g_comm.parity == "奇")
dcb.Parity=ODDPARITY;
else
dcb.Parity=EVENPARITY;
if(g_comm.stop == "1")
dcb.StopBits=ONESTOPBIT;
else
dcb.StopBits=TWOSTOPBITS;
if(!SetCommState(m_handle,&dcb))
{
CloseHandle(m_handle);
return false;
}
//设置超时值
COMMTIMEOUTS to;
to.ReadIntervalTimeout=MAXDWORD;
to.ReadTotalTimeoutConstant=500;
to.ReadTotalTimeoutMultiplier=10;
to.WriteTotalTimeoutConstant=0;
to.WriteTotalTimeoutMultiplier=0;
if(!SetCommTimeouts(m_handle,&to))
{
CloseHandle(m_handle);
return false;
}
if(!SetCommMask(m_handle,EV_RXCHAR))
{
CloseHandle(m_handle);
return false;
}


发送函数:
BOOL fWriteStat =WriteFile(m_handle, pBuf->pBuf+pBuf->wReadPtr, num, &sendnum, NULL);
int err=GetLastError();
...全文
3946 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xinbgzs 2010-09-29
嗯,果真,
memset(&writeOS, 0, sizeof(OVERLAPPED));
writeOS.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
然后再WriteFile(hCom,pBuffer,dwLength,&dwWrite,&writeOS)就好了,然后等待完成即可

if(GetLastError() == ERROR_IO_PENDING)
GetOverlappedResult(hCom,&writeOS,&dwTranslate,TRUE);
回复
十月兔 2010-09-21
glacierful是对的,我也遇到了这个问题,按他的方法解决了
回复
glacierful 2010-08-12
今天我也遇上了这个问题,搜到了这个帖子,没有答案。
我自己解决了,把答案写出来,但不知道是否适合楼上的一些朋友。

WriteFile或者ReadFile时,最后一个参数需要传入一个OVERLAPPED结构,而且它的Offset和OffsetHigh两个成员需要设为0,hEvent成员需要一个事件(CreateEvent)。
回复
ocb0123 2010-03-17
dsfedfdsfdsfsdfsdfsdfsdf
回复
jixiangyong 2010-03-09
遇到同样问题 求方案
回复
btkxql 2008-09-18
我也遇到这样的问题当,怎么解决啊?
回复
xiaoQ008 2008-04-13
87的话
用 look_up查一下
应该是参数错误
回复
helen_alone 2008-04-13
接收数据是正确的,所以m_handle是有效的。
参数,那个NULL是不是有问题,因为我CreateFile是选择的带有异步的,发送不选择异步有问题吗?
回复
helen_alone 2008-04-13
接收数据是正确的,所以m_handle是有效的。
参数,那个NULL是不是有问题,因为我CreateFile是选择的带有异步的,发送不选择异步有问题吗?
回复
sanvl 2008-04-12
Debug模式 在下边监视name填入 @err,hr 可以看到错误信息
回复
Eleven 2008-04-12
Up!
回复
arong1234 2008-04-12
87表示ERROR_INVALID_PARAMETER,可能某个参数不合法
回复
scq2099yt 2008-04-12
up
回复
cnzdgs 2008-04-12
如果函数返回失败后再用GetLastError,函数返回成功时GetLastError的返回值不一定是0。
回复
CrownLiu 2008-04-12
m_handle是有效的吗?
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-12 01:10
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……