vc中mscomm控件怎样判断串口接收数据结束?

来源:百度知道 编辑:UC知道 时间:2024/05/10 00:10:58
比如在下面程序中怎么样才能在message()中一次显示出全部接收到的数据?现在程序本来要接收68个字符,但都分五次显示完的,前面几次都显示16个字符,最后一次显示4个字符。这4个字符而且在最上面的。请高手帮帮忙一次全显示出来。。。]

void CRS232Dlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,i,j=2;
int k=0;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp,m_RcvData,x;
if(m_comport.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_comport.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(i=0;i<len;i++)
safearray_inp.GetElement(&i,rxdata+i);//转换为BYTE型数组
for(i=0;i<len;i++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+i); //字符型

strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
m_RcvData+=strtemp; //加入接收编辑框对应字符串
}

MessageBox(m_RcvData);

全部或非全部,这和你的COM口通信协议有关.比如规定每次发送64个字符为一次全部数据.或者发送间隔>10ms则判断为全部数据.又或者在发送开始时规定发送数据的长度,收其后为全部数据.这要看你的"全部数据"是怎么定义的.修改你的程序可根据你的"全部数据"的定义修改,如发送间隔>10ms为全部数据那你的在接收的时候做下判断,当间隔>=10ms时才MessageBox(m_RcvData);

COM接收数据一到就会触发OnComm事件,因为它不知道你所说的什么叫"完全".当触发事件后你读取数据的同时还有数据进来,但系统只管接收到的,不管还没到的数据,直接把现有的返回给你,你做了显示操作后,缓冲里还有数据,那么系统还要触发消息,直到缓冲没有.这样就出现了多次,建议明确结束的判断后,在收到结束标志时才执行MessageBox(m_RcvData);

我的是接收17个字符,先显示前14个字符,再显示剩下的3个字符。我也不知道是为什么,想问一下你的问题解决了没?