请问在Dev C++中如何动态设定串口接受缓冲区的大小.
解决方案 »
- 问一个文件加密与解密的问题
- 结构的构造函数是个什么概念?应该怎么用?
- 哎, 在C#区提问没人答我, 还是到这里来看看把
- 因公司业务转型,现有早年与电信签订的2M固定IP专线转让月租费只要400元
- [请教]向其他应用程序的按钮发送的BN_CLICKED消息应该怎么写?
- 发生个很奇怪的问题,写入某些代码后程序会突然变大很多~~~
- 一个大数据的吞吐转发程序,利用线程池到底能提高多大效率
- 简单问题,mfc中各种函数位置问题(函数放在哪?)
- 请问各位大虾bitset<N>这东西怎么用?
- 在对话框打开时给对话框设置一个rgn,代码放到那里?谢谢
- 简单函数问题
- 使用函数InterlockedIncrement(&m_index)出现的问题
BOOL CSerialWatch::OpenComm()
{
if (m_bOpened)
CloseComm();
::memset(&m_olWait,0,sizeof(m_olWait));
::memset(&m_olRead,0,sizeof(m_olRead));
::memset(&m_olWrite,0,sizeof(m_olWrite));
::memset(&m_RxBuffer,0,sizeof(m_RxBuffer));
ResetEvent(m_hExitEvent); //打开指定的串口,并初始化参数。
DWORD dwErr;
DCB dcb;
COMMTIMEOUTS CommTimeOuts;
CString strName; strName.Format("\\\\.\\COM%d",m_iCommNo); //创建端口
m_hComm = CreateFile(strName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if (INVALID_HANDLE_VALUE == m_hComm)
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
}
//通信端口的现存状态和I/O缓冲区
if(!::PurgeComm(m_hComm,
PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR))
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} //设置收发缓冲
if(!::SetupComm(m_hComm,BUFFER_IN_SIZE,BUFFER_OUT_SIZE))
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} //设置端口
if(!::GetCommState(m_hComm,&dcb))
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} dcb.BaudRate =m_iBaudRate;
dcb.ByteSize=m_iDataBits; int iStopBits=m_fStopBits*2;
switch(iStopBits)
{
case 2:
dcb.StopBits=ONESTOPBIT;
break;
case 3:
dcb.StopBits=ONE5STOPBITS;
break;
case 4:
dcb.StopBits=TWOSTOPBITS;
break;
default:
break;
} switch(m_cParity)
{
case 'J':
dcb.fParity=true;
dcb.Parity=ODDPARITY;
break;
case 'O':
dcb.fParity=true;
dcb.Parity=EVENPARITY;
break;
case 'N':
dcb.fParity=false;
dcb.Parity=NOPARITY;
break;
default:
break;
}
if(!::SetCommState(m_hComm,&dcb))
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} //设置通信超时属性
CommTimeOuts.ReadIntervalTimeout = 100;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0; if(!::SetCommTimeouts(m_hComm,&CommTimeOuts))
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
}; //初始化Overlapped参数
m_olWait.hEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
if (NULL == m_olWait.hEvent)
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} m_olRead.hEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
if (NULL == m_olRead.hEvent)
{
::CloseHandle(m_olWait.hEvent);
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
}
m_olWrite.hEvent = ::CreateEvent(NULL,TRUE,TRUE,NULL);
if (NULL == m_olWrite.hEvent)
{
::CloseHandle(m_olWait.hEvent);
::CloseHandle(m_olRead.hEvent);
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} if (!::SetCommMask(m_hComm,EV_ERR|EV_RXCHAR))
{
dwErr = ::GetLastError();
::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
return FALSE;
} //创建监视线程
DWORD dwThreadId;
char szMsg[80]; m_hThread = ::CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
this, // argument to thread function
0, // use default creation flags
&dwThreadId);
if (m_hThread == NULL)
{
wsprintf( szMsg, "CreateThread failed." );
MessageBox( NULL, szMsg, "main", MB_OK );
};
m_bOpened=true;
return TRUE;
}