初始化串口失败 跪求解决办法

[复制链接]
2923|0
 楼主| yysongge 发表于 2007-11-18 15:11 | 显示全部楼层 |阅读模式
写了一个PC与单片机的串口通信程序.为了防止串口出错在每个数据帧之前都要初始化一次串口,所以串口初始化函数频繁被调用..现在程序运行一段时间后初始化串口程序就会出错返回&nbsp;&nbsp;&nbsp;INVALID_HANDLE_VALUE&nbsp;&nbsp;&nbsp;.单步调试的时候好像又没有这个问题.我在想是不是因为初始化过于频繁造成的.在程序中加了Sleep(1)函数也不行也不能Sleep(1)过长这样程序效率太低..现在不知道到底是什么原因造成的creatfile()错误.&nbsp;<br /><br /><br />&nbsp;现在的通信协议是这样的。上位机每100MS给下位机发送一个检测数据,下位机如果收到这个数据着不复位。如果一段时间没有收到这个数据则复位串口一次。下位机收到数据后会发送一个确认数据到上位机。上位机发送完一帧数据之后便停止发送等待下位机的确认信号。如果收到确认信号则开始下一帧发送。如果在一段时间内没有收到下位机的确认信号则重发数据。在发送每一帧数据前初始化一次串口这样保证串口在发送数据前的正确性。想法是如果串口有问题则初始化串口会失败。&nbsp;<br /><br /><br />对于每一帧数据前初始化一次串口这个问题现在存在疑问。是不是初始化串口正确就一定能保证串口是畅通的。???<br /><br /><br />项目很急,跪求大侠的意见.&nbsp;<br /><br />初始化串口程序如下:(没有加入收发缓冲区初始化以及清空操作是因为已经在另外的函数中完成一次.不需要频繁操作)&nbsp;<br /><br /><br />BOOL&nbsp;&nbsp;&nbsp;CSerialPort::InitPort_Send(CWnd*&nbsp;&nbsp;&nbsp;pPortOwner,&nbsp;//&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;owner&nbsp;&nbsp;&nbsp;(CWnd)&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;port&nbsp;&nbsp;&nbsp;(receives&nbsp;&nbsp;&nbsp;message)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;portnr,&nbsp;//&nbsp;&nbsp;&nbsp;portnumber&nbsp;&nbsp;&nbsp;(1..4)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baud,&nbsp;//&nbsp;&nbsp;&nbsp;baudrate&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parity,&nbsp;//&nbsp;&nbsp;&nbsp;parity&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;databits,&nbsp;//&nbsp;&nbsp;&nbsp;databits&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopbits,&nbsp;//&nbsp;&nbsp;&nbsp;stopbits&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;dwCommEvents,&nbsp;//&nbsp;&nbsp;&nbsp;EV_RXCHAR,&nbsp;&nbsp;&nbsp;EV_CTS&nbsp;&nbsp;&nbsp;etc&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writebuffersize)&nbsp;//&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;writebuffer&nbsp;<br />{&nbsp;<br />//AfxMessageBox(&nbsp;&quot;INIT&nbsp;&quot;);&nbsp;<br /><br />m_pOwner&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;pPortOwner;&nbsp;<br />m_nPortNr&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;portnr;&nbsp;<br />m_dwCommEvents&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;dwCommEvents;&nbsp;<br /><br />BOOL&nbsp;&nbsp;&nbsp;bResult&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;FALSE;&nbsp;<br />char&nbsp;&nbsp;&nbsp;*szPort&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;new&nbsp;&nbsp;&nbsp;char[50];&nbsp;<br />char&nbsp;&nbsp;&nbsp;*szBaud&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;new&nbsp;&nbsp;&nbsp;char[50];&nbsp;<br />EnterCriticalSection(&m_csCommunicationSync);&nbsp;<br />//&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;port&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;already&nbsp;&nbsp;&nbsp;opened:&nbsp;&nbsp;&nbsp;close&nbsp;&nbsp;&nbsp;it&nbsp;<br />if&nbsp;&nbsp;&nbsp;(m_hComm&nbsp;&nbsp;&nbsp;!=&nbsp;&nbsp;&nbsp;NULL)&nbsp;<br />{&nbsp;<br />CloseHandle(m_hComm);&nbsp;<br />m_hComm&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;NULL;&nbsp;<br />}&nbsp;<br /><br />Sleep(1);&nbsp;<br /><br />//&nbsp;&nbsp;&nbsp;prepare&nbsp;&nbsp;&nbsp;port&nbsp;&nbsp;&nbsp;strings&nbsp;<br />sprintf(szPort,&nbsp;&nbsp;&nbsp;&quot;COM%d&nbsp;&quot;,&nbsp;&nbsp;&nbsp;portnr);&nbsp;<br />sprintf(szBaud,&nbsp;&nbsp;&nbsp;&quot;baud=%d&nbsp;&nbsp;&nbsp;parity=%c&nbsp;&nbsp;&nbsp;data=%d&nbsp;&nbsp;&nbsp;stop=%d&nbsp;&quot;,&nbsp;&nbsp;&nbsp;baud,&nbsp;&nbsp;&nbsp;parity,&nbsp;&nbsp;&nbsp;databits,&nbsp;&nbsp;&nbsp;stopbits);&nbsp;<br /><br />//&nbsp;&nbsp;&nbsp;get&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;handle&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;port&nbsp;<br />m_hComm&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;CreateFile(szPort,&nbsp;//&nbsp;&nbsp;&nbsp;communication&nbsp;&nbsp;&nbsp;port&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;(COMX)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GENERIC_READ&nbsp;&nbsp;&nbsp;&brvbar;&nbsp;&nbsp;&nbsp;GENERIC_WRITE,&nbsp;//&nbsp;&nbsp;&nbsp;read/write&nbsp;&nbsp;&nbsp;types&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;//&nbsp;&nbsp;&nbsp;comm&nbsp;&nbsp;&nbsp;devices&nbsp;&nbsp;&nbsp;must&nbsp;&nbsp;&nbsp;be&nbsp;&nbsp;&nbsp;opened&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;exclusive&nbsp;&nbsp;&nbsp;access&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;//&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;security&nbsp;&nbsp;&nbsp;attributes&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPEN_EXISTING,&nbsp;//&nbsp;&nbsp;&nbsp;comm&nbsp;&nbsp;&nbsp;devices&nbsp;&nbsp;&nbsp;must&nbsp;&nbsp;&nbsp;use&nbsp;&nbsp;&nbsp;OPEN_EXISTING&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE_FLAG_OVERLAPPED,&nbsp;//&nbsp;&nbsp;&nbsp;Async&nbsp;&nbsp;&nbsp;I/O&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);&nbsp;//&nbsp;&nbsp;&nbsp;template&nbsp;&nbsp;&nbsp;must&nbsp;&nbsp;&nbsp;be&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;comm&nbsp;&nbsp;&nbsp;devices&nbsp;<br /><br />if&nbsp;&nbsp;&nbsp;(m_hComm&nbsp;&nbsp;&nbsp;==&nbsp;&nbsp;&nbsp;INVALID_HANDLE_VALUE)&nbsp;<br />{&nbsp;<br />//&nbsp;&nbsp;&nbsp;port&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;&nbsp;found&nbsp;<br />delete&nbsp;&nbsp;&nbsp;[]&nbsp;&nbsp;&nbsp;szPort;&nbsp;<br />delete&nbsp;&nbsp;&nbsp;[]&nbsp;&nbsp;&nbsp;szBaud;&nbsp;<br /><br />LeaveCriticalSection(&m_csCommunicationSync);&nbsp;<br /><br />Flag_stop&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;TRUE;&nbsp;<br /><br />return&nbsp;&nbsp;&nbsp;FALSE;&nbsp;<br />}&nbsp;<br /><br />//&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;timeout&nbsp;&nbsp;&nbsp;values&nbsp;<br />m_CommTimeouts.ReadIntervalTimeout&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;MAXDWORD;&nbsp;<br />m_CommTimeouts.ReadTotalTimeoutMultiplier&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;MAXDWORD;&nbsp;<br />m_CommTimeouts.ReadTotalTimeoutConstant&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;20;&nbsp;<br />m_CommTimeouts.WriteTotalTimeoutMultiplier&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;1000;&nbsp;<br />m_CommTimeouts.WriteTotalTimeoutConstant&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;1000;&nbsp;<br /><br />//&nbsp;&nbsp;&nbsp;configure&nbsp;<br />if&nbsp;&nbsp;&nbsp;(SetCommTimeouts(m_hComm,&nbsp;&nbsp;&nbsp;&m_CommTimeouts))&nbsp;<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />if&nbsp;&nbsp;&nbsp;(SetCommMask(m_hComm,&nbsp;&nbsp;&nbsp;dwCommEvents))&nbsp;<br />{&nbsp;<br />if&nbsp;&nbsp;&nbsp;(GetCommState(m_hComm,&nbsp;&nbsp;&nbsp;&m_dcb))&nbsp;<br />{&nbsp;<br />m_dcb.EvtChar&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;'q&nbsp;';&nbsp;<br />m_dcb.fRtsControl&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;RTS_CONTROL_ENABLE;&nbsp;//&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;RTS&nbsp;&nbsp;&nbsp;bit&nbsp;&nbsp;&nbsp;high!&nbsp;<br />if&nbsp;&nbsp;&nbsp;(BuildCommDCB(szBaud,&nbsp;&nbsp;&nbsp;&m_dcb))&nbsp;<br />{&nbsp;<br />if&nbsp;&nbsp;&nbsp;(SetCommState(m_hComm,&nbsp;&nbsp;&nbsp;&m_dcb))&nbsp;<br />;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;normal&nbsp;&nbsp;&nbsp;operation...&nbsp;&nbsp;&nbsp;continue&nbsp;<br />else&nbsp;<br />ProcessErrorMessage(&nbsp;&quot;SetCommState()&nbsp;&quot;);&nbsp;<br />}&nbsp;<br />else&nbsp;<br />ProcessErrorMessage(&nbsp;&quot;BuildCommDCB()&nbsp;&quot;);&nbsp;<br />}&nbsp;<br />else&nbsp;<br />ProcessErrorMessage(&nbsp;&quot;GetCommState()&nbsp;&quot;);&nbsp;<br />}&nbsp;<br />else&nbsp;<br />ProcessErrorMessage(&nbsp;&quot;SetCommMask()&nbsp;&quot;);&nbsp;<br />}&nbsp;<br />else&nbsp;<br />ProcessErrorMessage(&nbsp;&quot;SetCommTimeouts()&nbsp;&quot;);&nbsp;<br /><br />delete&nbsp;&nbsp;&nbsp;[]&nbsp;&nbsp;&nbsp;szPort;&nbsp;<br />delete&nbsp;&nbsp;&nbsp;[]&nbsp;&nbsp;&nbsp;szBaud;&nbsp;<br /><br />//&nbsp;&nbsp;&nbsp;release&nbsp;&nbsp;&nbsp;critical&nbsp;&nbsp;&nbsp;section&nbsp;<br />LeaveCriticalSection(&m_csCommunicationSync);&nbsp;<br /><br />TRACE(&nbsp;&quot;Initialisation&nbsp;&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;communicationport&nbsp;&nbsp;&nbsp;%d&nbsp;&nbsp;&nbsp;completed.\nUse&nbsp;&nbsp;&nbsp;Startmonitor&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;communicate.\n&nbsp;&quot;,&nbsp;&nbsp;&nbsp;portnr);&nbsp;<br /><br />Flag_stop&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;FALSE;&nbsp;<br />return&nbsp;&nbsp;&nbsp;TRUE;&nbsp;<br />}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部