请问在Dev C++中如何动态设定串口接受缓冲区的大小.

rolinyang 2004-11-24 10:20:47
请问在Dev C++中如何动态设定串口接受缓冲区的大小.
...全文
289 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rolinyang 2004-11-24
  • 打赏
  • 举报
回复
谢谢
接受过后,如何清除缓冲区呢?
lzzqqq 2004-11-24
  • 打赏
  • 举报
回复
//打开串口
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;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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