串口操作WriteFile在win98下正常,win2000下出错,请帮忙up或提供线索! 可能是你的程序有问题,没有细看你的程序,但是WriteFile是可以在2000下很好的运行。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 writefile应该是没错的,查查其他的错,2000下对句柄的检查比98更严格 兄弟,串口通讯在2000/NT下CreateFile()一定要设置OVERLAPPED结构呀 如果在CreateFile()指定了OVERLAPPED结构,那WriteFile也应该指定OVERLAPPED但却NULL,肯定不行的(特别在win2000/NT下)我以前也碰到同样的问题,开始在98下没有考虑OVERLAPPED结构,能正确发送和接收,但在2000下,就无办法通过,后来仔细一看CSDN才醒悟过来最好,把CreateFile()的代码也拿来看看如果指定了OVERLAPPED结构,就要用GetLastError()来确定操作的结果请看:void CSerialPort::WriteChar(){ // 将m_szWriteBuff里的字符发送到输入缓冲区 BOOL bWrite=TRUE; // BOOL bResult=TRUE; // 函数操作情况 DWORD BytesSend=0; // 发送字节数 DWORD dwError=0; ResetEvent(m_hWriteEvents); EnterCriticalSection(&m_csCommunicationSync); if (bWrite) { // 初始化异步结构:进行端口操作时这两个参数被忽略 m_ov.Offset=0; m_ov.OffsetHigh=0; // 清空缓冲区 // PURGE_TXABORT: 既使发送操作没有完成,也终止所有的重叠发送操作,立即返回 // PURGE_RXABORT: 既使接收操作没有完成,也终止所有的重叠发送操作,立即返回 // PRUGE_TXCLEAR: 清除发送缓冲区 // PRUGE_RXCLEAR: 清除接收缓冲区 PurgeComm(m_hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); bResult = WriteFile(m_hCom, m_szWriteBuff, strlen((char*)m_szWriteBuff), &BytesSend, &m_ov ); if (!bResult) { //出错 switch(dwError = GetLastError()) { case ERROR_IO_PENDING: { BytesSend=0; bWrite=FALSE; break; } default: { ProcessErrorMsg("WriteFile()"); break; } } //end switch(dwError == GetLastError()) } else { LeaveCriticalSection(&m_csCommunicationSync); } } // end if (bWrite) if (!bWrite) { bWrite=true; bResult=GetOverlappedResult(m_hCom, &m_ov, &BytesSend, true); LeaveCriticalSection(&m_csCommunicationSync); if (!bResult) { ProcessErrorMsg("GetOverlappedResutl()"); } } // end if (!bWrite) if (BytesSend != strlen((char*)m_szWriteBuff)) { TRACE("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSend, strlen((char*)m_szWriteBuff)); }}希望对你有帮助。 OVERLAPPED overlapped; //OVERLAPPED structureOVERLAPPED overlappedwrite;OVERLAPPED overlappedread;overlapped.Internal=0;overlapped.InternalHigh=0;overlapped.Offset=0;overlapped.OffsetHigh=0;overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //这个很重要,不信你可以注释掉,看看结果会怎样。FHandle = CreateFile( PortName, GENERIC_READ || GENERIC_WRITE, 0, // Not shared NULL, // No security attributes OPEN_EXISTING, FILE_FLAG_OVERLAPPED||FILE_ATTRIBUTE_NORMAL , 0 );.........overlappedwrite.Internal=0;overlappedwrite.InternalHigh=0;overlappedwrite.Offset=0;overlappedwrite.OffsetHigh=0;overlappedwrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);//这个很重要,不信你可以注释掉,看看结果会怎样。WriteFile( FHandle,&csp,dwDataSize,&nSent, &overlappedwrite);{ error=GetLastError(); if (error==ERROR_IO_PENDING)//写成功 {//以下是读,可不管 GetOverlappedResult(com_handle,&overlappedwrite,&dwNumBytesWritten,TRUE); overlappedread.Internal=0; overlappedread.InternalHigh=0; overlappedread.Offset=0; overlappedread.OffsetHigh=0; overlappedread.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL); COMSTAT comstat; DWORD dwLength; DWORD dwError; DWORD dwEvtMask=0; BOOL serive=TRUE; Sleep(delaytime); while (serive) { WaitCommEvent(com_handle,&dwEvtMask,&overlappedread); ClearCommError(com_handle,&dwError,&comstat); dwLength=comstat.cbInQue; if (dwLength<1) { break; } BOOL fReadStat=FALSE; memset(Bytes,0,sizeof(dwLength)); fReadStat=::ReadFile(com_handle,&Bytes,dwLength,&dwBytesTransferred,&overlappedread); }}系统是win2000//一定要考虑OVERLAPPED,不然没法做。 qiuanhong(练从难处练,用从易处用) :大哥,“系统是win2000一定要考虑OVERLAPPED,不然没法做。”真的这样吗?我因为比较讨厌OVERLAPPED时的WriteFile的操作才没有使用OVERLAPPED的方式来操作。这下我惨了,还是得用这个讨厌的东西!不过真的很感谢你。 做好了,别忘了再来这里跟贴,大家学习学习!!!!!呵呵~~~~fei 超级烦 如何在MFC工程中加入corba!!! 大家帮忙看看基础的知识 CheaderCtrl何时被创建及QQ窗口问题 求助!我的源码是啥问题 为什么不能绑定 请问在C++中结构体数据类型和共用体数据类型有什么区别? 有谁会vc下的位图打印啊?问了两天了,都没有人吗? 高手请进,在线等:数据库ACESS,要用到sum,group by 等查询,总是报莫名其妙的错,救命啊 散分!!!!!!!!!! 如果我在方法中生成了一个线程,在对线程的处理过程中发现我想调用对象的另一个方法,我该怎么办? 应用程序错误 调试 却不能 我想买台笔记本,价格在8000rmb以下,请大家给个意见
但却NULL,肯定不行的(特别在win2000/NT下)
我以前也碰到同样的问题,开始在98下没有考虑OVERLAPPED结构,能正确发送和接收,但在2000下,就无办法通过,后来仔细一看CSDN才醒悟过来最好,把CreateFile()的代码也拿来看看如果指定了OVERLAPPED结构,就要用GetLastError()来确定操作的结果
请看:void CSerialPort::WriteChar()
{
// 将m_szWriteBuff里的字符发送到输入缓冲区
BOOL bWrite=TRUE; //
BOOL bResult=TRUE; // 函数操作情况 DWORD BytesSend=0; // 发送字节数
DWORD dwError=0;
ResetEvent(m_hWriteEvents); EnterCriticalSection(&m_csCommunicationSync); if (bWrite)
{
// 初始化异步结构:进行端口操作时这两个参数被忽略
m_ov.Offset=0;
m_ov.OffsetHigh=0; // 清空缓冲区
// PURGE_TXABORT: 既使发送操作没有完成,也终止所有的重叠发送操作,立即返回
// PURGE_RXABORT: 既使接收操作没有完成,也终止所有的重叠发送操作,立即返回
// PRUGE_TXCLEAR: 清除发送缓冲区
// PRUGE_RXCLEAR: 清除接收缓冲区
PurgeComm(m_hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); bResult = WriteFile(m_hCom,
m_szWriteBuff,
strlen((char*)m_szWriteBuff),
&BytesSend,
&m_ov
);
if (!bResult)
{ //出错
switch(dwError = GetLastError())
{
case ERROR_IO_PENDING:
{
BytesSend=0;
bWrite=FALSE;
break;
}
default:
{
ProcessErrorMsg("WriteFile()");
break;
}
} //end switch(dwError == GetLastError())
}
else
{
LeaveCriticalSection(&m_csCommunicationSync);
}
} // end if (bWrite) if (!bWrite)
{
bWrite=true; bResult=GetOverlappedResult(m_hCom,
&m_ov,
&BytesSend,
true); LeaveCriticalSection(&m_csCommunicationSync); if (!bResult)
{
ProcessErrorMsg("GetOverlappedResutl()");
}
} // end if (!bWrite) if (BytesSend != strlen((char*)m_szWriteBuff))
{
TRACE("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSend, strlen((char*)m_szWriteBuff));
}
}希望对你有帮助。
OVERLAPPED overlappedwrite;
OVERLAPPED overlappedread;overlapped.Internal=0;
overlapped.InternalHigh=0;
overlapped.Offset=0;
overlapped.OffsetHigh=0;
overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //这个很重要,不信你可以注释掉,看看结果会怎样。FHandle = CreateFile(
PortName,
GENERIC_READ || GENERIC_WRITE,
0, // Not shared
NULL, // No security attributes
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED||FILE_ATTRIBUTE_NORMAL ,
0
);.........overlappedwrite.Internal=0;
overlappedwrite.InternalHigh=0;
overlappedwrite.Offset=0;
overlappedwrite.OffsetHigh=0;
overlappedwrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
//这个很重要,不信你可以注释掉,看看结果会怎样。WriteFile( FHandle,&csp,dwDataSize,&nSent, &overlappedwrite);
{
error=GetLastError();
if (error==ERROR_IO_PENDING)//写成功
{
//以下是读,可不管
GetOverlappedResult(com_handle,&overlappedwrite,&dwNumBytesWritten,TRUE);
overlappedread.Internal=0;
overlappedread.InternalHigh=0;
overlappedread.Offset=0; overlappedread.OffsetHigh=0; overlappedread.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
COMSTAT comstat;
DWORD dwLength;
DWORD dwError;
DWORD dwEvtMask=0;
BOOL serive=TRUE;
Sleep(delaytime);
while (serive)
{
WaitCommEvent(com_handle,&dwEvtMask,&overlappedread);
ClearCommError(com_handle,&dwError,&comstat);
dwLength=comstat.cbInQue;
if (dwLength<1)
{
break;
}
BOOL fReadStat=FALSE;
memset(Bytes,0,sizeof(dwLength));
fReadStat=::ReadFile(com_handle,&Bytes,dwLength,&dwBytesTransferred,&overlappedread);
}
}系统是win2000
//一定要考虑OVERLAPPED,不然没法做。
大哥,“系统是win2000一定要考虑OVERLAPPED,不然没法做。”真的这样吗?
我因为比较讨厌OVERLAPPED时的WriteFile的操作才没有使用OVERLAPPED的方式来操作。
这下我惨了,还是得用这个讨厌的东西!
不过真的很感谢你。
呵呵~~~~fei