3,248
社区成员




m_mscomm.put_CommPort(10); //选择串口号
m_mscomm.put_InBufferSize(1024); //设置接收缓冲区字节数
m_mscomm.put_OutBufferSize(1024); //设置发送缓冲区字节数
m_mscomm.put_InputLen(0); //设置当前接收区数据长度为0
m_mscomm.put_InputMode(1); //以二进制方式读写数据
m_mscomm.put_RThreshold(100); //接收缓冲区有100个及100个以上字符时将引发一个接收数据的OnComm事件,之前设置为1时会发生误触发
m_mscomm.put_SThreshold(0); //每发送一个字符时,不触发OnComm事件
m_mscomm.put_Settings("4800,n,8,1"); //设置串口参数,"4800,n,8,1"
m_mscomm.put_CommPort(10); //选择串口号
m_mscomm.put_InBufferSize(1024); //设置接收缓冲区字节数
m_mscomm.put_OutBufferSize(1024); //设置发送缓冲区字节数
m_mscomm.put_InputLen(0); //设置当前接收区数据长度为0
m_mscomm.put_InputMode(1); //以二进制方式读写数据
m_mscomm.put_RThreshold(117); //接收缓冲区有117个及117个以上字符时将引发一个接收数据的OnComm事件,之前设置为1时会发生误触发
m_mscomm.put_SThreshold(0); //每发送一个字符时,不触发OnComm事件
m_mscomm.put_Settings("4800,n,8,1"); //设置串口参数,"4800,n,8,1"
下面是串口事件处理函数
void CCentraControlSystemDlg::OnCommMscomm1()
{
// TODO: Add your message handler code here
if(m_mscomm.get_CommEvent()==2)
{
ComThreadInfo *comInfo = new ComThreadInfo;
VARIANT variant_inp = m_mscomm.get_Input();//读缓冲区
comInfo->safearray_inp = variant_inp;
comInfo->_this = this;
long len = comInfo->safearray_inp.GetOneDimSize();
if(len == 8) //设置参数时下位机返回的8字节数据
{
m_mscomm.put_RThreshold(117); //调整接收缓冲区长度以恢复正常接收采集参数时返回的数据
}
else
{
pThread=AfxBeginThread(ComThreadFunc,comInfo); //如果触发串口事件时的数据长度为117即为采集时的返回数据,则启动解析串口接收区数据的线程
}
}
}
下面是我在发送设置参数前的操作
m_mscomm.put_RThreshold(8); //设置参数前将接收缓冲区的阀值设为8字节
m_mscomm.put_Output(COleVariant(array)); //发送设定参数
这里再问大神们一个问题,串口中接收数据时,接收缓冲区一次能接收多少数据啊?跟什么有关?这样接收的数据如果没有达到接收缓冲区设置的阀值,应该还会等待下一次接收直到达到接收缓冲区阀值触发串口事件处理函数。