高分跪求串口问题:createfile 返回错误5 拒绝访问

yysongge 2007-11-19 01:48:16
程序频繁初始化串口。程序运行一段时间都正常。但是过一段时间后createfile()返回 INVALID_HANDLE_VALUE 用GetLastError()得到错误号为5 拒绝访问。不知道是什么原因。是不是createfile()过于频繁的原因。跪求大牛解答

初始化串口程序为


初始化串口程序如下:(没有加入收发缓冲区初始化以及清空操作是因为已经在另外的函数中完成一次.不需要频繁操作)


BOOL CSerialPort::InitPort_Send(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message)
UINT portnr, // portnumber (1..4)
UINT baud, // baudrate
char parity, // parity
UINT databits, // databits
UINT stopbits, // stopbits
DWORD dwCommEvents, // EV_RXCHAR, EV_CTS etc
UINT writebuffersize) // size to the writebuffer
{
//AfxMessageBox( "INIT ");

m_pOwner = pPortOwner;
m_nPortNr = portnr;
m_dwCommEvents = dwCommEvents;

BOOL bResult = FALSE;
char *szPort = new char[50];
char *szBaud = new char[50];
EnterCriticalSection(&m_csCommunicationSync);
// if the port is already opened: close it
if (m_hComm != NULL)
{
CloseHandle(m_hComm);
m_hComm = NULL;
}

Sleep(0);

// prepare port strings
sprintf(szPort, "COM%d ", portnr);
sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d ", baud, parity, databits, stopbits);

// get a handle to the port
m_hComm = CreateFile(szPort,
GENERIC_READ ¦ GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);

if (m_hComm == INVALID_HANDLE_VALUE)
{
// port not found

DWORD dwError = GetLastError();
delete [] szPort;
delete [] szBaud;

LeaveCriticalSection(&m_csCommunicationSync);

Flag_stop = TRUE;

return FALSE;
}

// set the timeout values
m_CommTimeouts.ReadIntervalTimeout = MAXDWORD;
m_CommTimeouts.ReadTotalTimeoutMultiplier = MAXDWORD;
m_CommTimeouts.ReadTotalTimeoutConstant = 20;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;

// configure
if (SetCommTimeouts(m_hComm, &m_CommTimeouts))
{
if (SetCommMask(m_hComm, dwCommEvents))
{
if (GetCommState(m_hComm, &m_dcb))
{
m_dcb.EvtChar = 'q ';
m_dcb.fRtsControl = RTS_CONTROL_ENABLE; // set RTS bit high!
if (BuildCommDCB(szBaud, &m_dcb))
{
if (SetCommState(m_hComm, &m_dcb)) ; // normal operation... continue
else
ProcessErrorMessage( "SetCommState() ");
}
else
ProcessErrorMessage( "BuildCommDCB() ");
}
else
ProcessErrorMessage( "GetCommState() ");
}
else
ProcessErrorMessage( "SetCommMask() ");
}
else
ProcessErrorMessage( "SetCommTimeouts() ");

delete [] szPort;
delete [] szBaud;

// release critical section
LeaveCriticalSection(&m_csCommunicationSync);

TRACE( "Initialisation for communicationport %d completed.\nUse Startmonitor to communicate.\n ", portnr);

Flag_stop = FALSE;
return TRUE;
}
...全文
1991 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
scj_201 2011-12-30
  • 打赏
  • 举报
回复
路过, 顶贴, 拿分, 闪人!
用户 昵称 2011-12-30
  • 打赏
  • 举报
回复
既然这样,你直接用完就关就行了。
chayedanwc 2011-12-30
  • 打赏
  • 举报
回复 1
FILE_FLAG_OVERLAPPED楼主用的异步模式?
那你还能这样频繁的开关端口么,读写未完成,端口占用了,再次打开端口就会出现“ERROR_ACCESS_DENIED”入口被拒绝的错误。
cheetahcheer 2011-12-13
  • 打赏
  • 举报
回复
其实你可以这样试一下:
将if (m_hComm != NULL)
{
CloseHandle(m_hComm);
m_hComm = NULL;
}
改为
if (m_hComm != NULL)
{
CloseHandle(m_hComm);
sleep(10);
m_hComm = NULL;
}
关闭串口和打开串口的间隔时间太短就会造成
error 5:Access Denied,希望对你有所帮助!
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
接分是王道!
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
不明LZ在说什么
yysongge 2007-12-05
  • 打赏
  • 举报
回复
给分
yysongge 2007-11-21
  • 打赏
  • 举报
回复
程序频繁初始化串口因为板子上有一个USB转串口的芯片。上位机定时向板子发送检测数据,板子如果一段时间没有收到收据那说明串口出了问题。则会把USB转串口的芯片复位一次。上位机再次发数据前则要打开一次串口。所以要频繁的初始化串口。加了if(CloseHandle(hCom))依然不行。

TO jameshooo 关闭串口时先中断所有操作是指什么?应为采用的是重叠I/O方式所以收发都是在后台进行怎么样能够关闭收发的后台程序呢?

我是刚开始学习VC++的。问题很菜。见笑了
jameshooo 2007-11-19
  • 打赏
  • 举报
回复
关闭串口时先中断所有操作,然后关闭,要确保串口已经被关闭,然后才能打开
一条晚起的虫 2007-11-19
  • 打赏
  • 举报
回复
程序频繁初始化串口。
//为什么?

if(CloseHandle(hCom))
//关闭串口时加判断,不成功可以再处理
goodboyws 2007-11-19
  • 打赏
  • 举报
回复
正在进行数据操作的时候,CloseHandle(m_hComm); 有可能失败,这样串口会被占用
jimoguilai2 2007-11-19
  • 打赏
  • 举报
回复
if (m_hComm != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
stivenjia 2007-11-19
  • 打赏
  • 举报
回复
用串口调试器看看是不是已经被占用

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧