C++ MFC开发串口通信之多个编辑框输出

Posted 吴威龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ MFC开发串口通信之多个编辑框输出相关的知识,希望对你有一定的参考价值。

##背景描述##

   基于zigbee的温室大棚

   一个协调器连接电脑,并接收多个zigbee终端发过来的数据    

   ##目的:

   1.编写上位机(MFC)

   2.想把串口接收到的多个传感器的数据分别在不同的编辑框输出

  


   解决方案:

    1.发送过来的数据打包(必须)

         *详情可以百度&谷歌

    2.MFC串口控件缓冲区必须设定一个数值(触发OnComm函数)

         *关键代码如下:

         m_ctrlComm.SetSettings("115200,n,8,1");//打开软件时端口设置默认为波特率9115200,无校验位,8位数据,1位停止位   
m_ctrlComm.SetInputMode(1); 
//1:表示以二进制方式检取数据 
m_ctrlComm.SetRThreshold(12); 
//参数12表示每当串口接收缓冲区中有12个字符时将引发一个接收数据的OnComm事件 
m_ctrlComm.SetInputLen(12);//设置当前接收区数据长度为12 
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据  

      注:我这里设置的是 12 ,是和我发过来的数据包的字节大小是一直的。

      3.直接上我的OnComm() 函数:

  

int o;
void CSmart_ZIGBEE_FLYDlg::OnComm() 
     
      VARIANT variant_inp;//定义一个VARIANT类对象
   COleSafeArray safearray_inp;//定义一个COleSafeArray对象
   LONG len,k; 
 o++;
 BYTE rxdata[1024]; //设置BYTE数组 AN 8—intterthat is not signed.
 CString strtemp;

                //每次清屏



if(o>30)     //定量清除 编辑框数据
  
        m_strRXData = _T("");
m_strRXData2= _T("");
        m_strRXData3 = _T("");
   m_strRXData4= _T("");
m_strRXData5 = _T("");  
o=0;

     
 if (m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有数据 
 
 //OnSave();
 ///以下你可以根据自己的通信协议加入处理代码  
 variant_inp=m_ctrlComm.GetInput();//读缓冲区   
 safearray_inp=variant_inp;    //VARIANT型变量转换为ColeSafeArray型变量 
 len=safearray_inp.GetOneDimSize(); //读取到的缓存区数据的长度  //得到有效数据长度
          
 for(k=0;k<len;k++)
    
 safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组  
  
       
  int h;
 
 for(k=0;k<1;k++)//将数组转换为Cstring型变量    
    
    BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
                 
                 
            strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放  
       
               

//备注:我一共有四个终端同时向协调器发送数据,

//每个终端的数据都进行了打包,然后设置一个标志位

//通过判别标志位,来进行调用不同的 编辑框进行输出
   if(strtemp =='#')//温度

  h=0;
 
//continue;

else
    if (strtemp =='@')//光强

h=1;
//continue;

else
if (strtemp =='*')//湿度

h=2;
//continue;
 
else
    if (strtemp =='$')// co2二氧化碳

h=3;
//continue;

else
if(strtemp =='&')// 烟雾

h=4;
//continue;


switch(h)



case 0:
 

                  for(k=1;k<len;k++)//将数组转换为Cstring型变量    
       
 
 BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
                 
            strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放  
            m_strRXData+=strtemp;
               
 OnSave();//这是我数据保存函数(也是保存到不同的文本的)
 break;

             case 1:
  
                   for(k=1;k<len;k++)//将数组转换为Cstring型变量    
      
 BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容


            strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放  
            m_strRXData2+=strtemp;
  OnSave_1();
  break;

              case 2: 
   
 
                   for(k=1;k<len;k++)//将数组转换为Cstring型变量    
      
      BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容


               strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放  
               m_strRXData3+=strtemp;
  OnSave2();
  break;
 
case 3: 
    
                   for(k=1;k<len;k++)//将数组转换为Cstring型变量    
      
     BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容


             strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放  
             m_strRXData4+=strtemp;
  OnSave3();
  break;
 
 case 4: 
    
                   for(k=1;k<len;k++)//将数组转换为Cstring型变量    
      
       BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容


               strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放  
               m_strRXData5+=strtemp;
  OnSave4();
  break;
 


 
          UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的  
 
      



这样就可以实现多个编辑框输出了


图示:



以上是关于C++ MFC开发串口通信之多个编辑框输出的主要内容,如果未能解决你的问题,请参考以下文章

MFC - 如何在运行时更新编辑框? (C++)

急!MFC中给一个对话框的不同编辑框关联变量后如何获得多个不同变量的值进行计算处理?????

(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

mfc 动态更新编辑框内容

我自己的 C++ 框架(类似 MFC),我可以创建子窗口,但在 WM_CREATE 时无法创建编辑框

MFC 编辑框的数据显示时,用update后,返回了第一行。怎么才能显示最新的数据呢?编辑框属性如下。