您的位置:首页 > 其它

关于VC串口控件MSComm响应中断函数次数不定的问题

2015-04-10 19:00 639 查看
设置函数:

m_ComPort.SetRThreshold(1);//接收缓冲区有大于等于1个字符时,将引发接收数据的OnCommMscomm事件

此函数并不是说串口来一个数据就会进中断处理函数,而是说当接收缓存中的数据等于多于1个字符时就会触发中断。,当传输数据过快时,接收缓存中一定多于1个字符。然而,MSComm串口接收数据是需要时间的。也许,你想以5个字符为一组数据进行接收,但是VC可能进中断的次数是1,2,3,4等等。无法通过设置SetRThreshold的参数来确定进入中断的次数。如果以5个字符为一组数据进行接收,依然设置SetRThreshold参数为1,我们需要在中断函数中实现这个功能--以5个字符为一组数据进行接收,程序如下:

<span style="color:#333333;">    VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;

if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
</span><span style="color:#ff0000;">Sleep(1);  //延时1ms</span><span style="color:#333333;">
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
TRACE("len is %d\n",len);
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

if(len==6)
{
.........(具体处理代码)
}

}</span>


注意,为了保证连续接收数据时VC有足够的时间接收数据,需要在接收前添加延时命令:Sleep(1);
//1ms(延时时间根据具体的数据传输时间来定).如果没有这句延时的命令,接收的数据个数必然不对。

参考自:CSDN /article/8995785.html

也可以使用类COMMTIMEOUTS 进行串口的接收(readfile)和发送,具体内容请查看帖子:http://bbs.csdn.net/topics/390116830
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: