博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vc6.0缓冲区
阅读量:6308 次
发布时间:2019-06-22

本文共 5338 字,大约阅读时间需要 17 分钟。

头文件中:

1,定义缓冲区数组。。

//char *Device_pCirBuf;//环形缓冲区    BYTE Device_pCirBuf[81];//环形缓冲区

 

cpp文件中

2,定义缓冲区接收长度,接收正确数据包定义,读指针(缓冲区头),写指针(缓冲区尾)

char Device_rightdata[38];//保存数据包int Device_size=81;//缓冲区长度int Device_startPos,Device_endPos;

3,打开串口的时候,缓冲区指针清零。

if(!m_ctrlComm.GetPortOpen())    {        m_ctrlComm.SetPortOpen(TRUE); //打开串口。        GetDlgItem(IDC_OPEN_SERIS)->SetWindowText("请关闭串口");        m_ctrlIconOpenoff.SetIcon(m_hIconOpen);        //Device_pCirBuf = new char [Device_size];         //memset(Device_pCirBuf, 0, Device_size);        Device_startPos=0,Device_endPos=0;    }

4,串口接收1个字节就触发接收事件。

         m_ctrlComm.SetRThreshold(1); //每当缓冲区有多余或等于1个字符(字节)时引发一个接收的OnComm事件

5,接收触发事件

void CDevicedlg::OnOnCommMscomm1() {    // TODO: Add your control notification handler code here    //UpdateData(TRUE);      VARIANT variant_inp;    COleSafeArray safearray_inp;    LONG Device_len,Device_k;    // 接收区    int slen=0,r_d_len=38;    BYTE recvdata[512];//定义存放二进制数据的数组    CString str;    if(m_ctrlComm.GetCommEvent() == 2) // 表示接收缓冲区内有字符    {            //    m_ctrlIconOpenoff.SetIcon(m_hIconOpen);                 variant_inp=m_ctrlComm.GetInput(); // /读串口输入缓冲区                //将VARAIANT变量赋值给COleSafeArray类的实例                 safearray_inp=variant_inp;                //使用COleSafeArray类的成员函数获取数据长度                 Device_len=safearray_inp.GetOneDimSize();                 //使用COleSafeArray类的成员函数将数据写入数组                 for(Device_k=0;Device_k
Device_startPos ? Device_endPos-Device_startPos : 80-Device_startPos+1+Device_endPos)>r_d_len-1) { //找到帧头。one: if (Device_pCirBuf[Device_startPos]==(BYTE)0xA5 && Device_pCirBuf[Device_startPos+1>80 ? 0 : Device_startPos+1]==(BYTE)0xA9) { //帧头对,则从帧头位置取38个字节的完整帧。 for (int i=0; i

6,正确数据包处理

DataProcessingvoid CDevicedlg::DataProcessing(){        BYTE rebuff;        int k, R_D_LEN=38;        CString str;        bool judge;        BYTE judge_sum;        switch((BYTE)Device_rightdata[5])        {                    case 2://            {                rebuff=0;                //rebuff=*(char *)(recvdata+2);                for(k=2;k

7,关闭串口的时候,指针清零。

if(m_ctrlComm.GetPortOpen())    {        m_ctrlComm.SetPortOpen(FALSE);        GetDlgItem(IDC_OPEN_SERIS)->SetWindowText("请打开串口");        m_ctrlIconOpenoff.SetIcon(m_hIconOff);        //delete []Device_pCirBuf;//删除数组pCirBuf指针对象,        //Device_pCirBuf = NULL;//初始化为 空指针,        Device_startPos=0;        Device_endPos=0;        return;    }

8,退出按钮,设置缓冲区指针清零。

void CDevicedlg::OnClose() {    // TODO: Add your control notification handler code here    //MessageBox(TEXT("是否确认删除?"),TEXT("Warning!!"),4);    //AfxMessageBox("确定退出吗?","设备管理",MB_OKCANCEL)    int ret=AfxMessageBox("确定退出吗?",MB_OKCANCEL);        if(IDOK==ret)    {        //清除数据,避免bug。        m_k6=0;        m_k5=0;        m_k4=0;        m_k3=0;        m_k2=0;        m_k1=0;        UpdateData(false);        if(m_ctrlComm.GetPortOpen())        {            //             CByteArray m_Array;            //             m_Array.RemoveAll();            //             m_Array.SetSize(8);            //             m_Array.SetAt(0,0xA5);            //             m_Array.SetAt(1,0xA6);            //             m_Array.SetAt(2,0x08);            //             m_Array.SetAt(3,0xF5);  //钳子               //             m_Array.SetAt(4,0xF6);  //线型            //             m_Array.SetAt(5,0x0A);            //             m_Array.SetAt(6,0x01);            //             m_Array.SetAt(7,0xAD);            //             m_ctrlComm.SetOutput(COleVariant(m_Array));                        m_ctrlComm.SetPortOpen(FALSE);            if (Device_pCirBuf)            {                //delete []Device_pCirBuf;//删除数组pCirBuf指针对象                //Device_pCirBuf = NULL;//初始化为空指针                Device_startPos=0;                Device_endPos=0;            }                    }                CDialog::OnOK();    }    else if(IDCANCEL==ret)    {        return;    }}

退出该对话框:

//退出软件void CMyDlg::OnOK() {    // TODO: Add extra validation here    //停止定时    KillTimer(1);    //关闭串口    if(m_ctrlComm.GetPortOpen())    {        m_ctrlComm.SetPortOpen(FALSE);        //缓冲区指针清零        if (Device_pCirBuf)//可以吗,内存还有吗        {            Device_startPos=0;            Device_endPos=0;        }    }    CDialog::OnOK();}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void CDevicedlg::OnClose()

{

         // TODO: Add your control notification handler code here

         //MessageBox(TEXT("是否确认删除?"),TEXT("Warning!!"),4);

         //AfxMessageBox("确定退出吗?","设备管理",MB_OKCANCEL)

         int ret=AfxMessageBox("确定退出吗?",MB_OKCANCEL);

        

         if(IDOK==ret)

         {

                  //清除数据,避免bug

                  m_k6=0;

                  m_k5=0;

                  m_k4=0;

                  m_k3=0;

                  m_k2=0;

                  m_k1=0;

                  UpdateData(false);

                  if(m_ctrlComm.GetPortOpen())

                  {

                           //                       CByteArray m_Array;

                           //                       m_Array.RemoveAll();

                           //                       m_Array.SetSize(8);

                           //                       m_Array.SetAt(0,0xA5);

                           //                       m_Array.SetAt(1,0xA6);

                           //                       m_Array.SetAt(2,0x08);

                           //                       m_Array.SetAt(3,0xF5);  //钳子  

                           //                       m_Array.SetAt(4,0xF6);  //线型

                           //                       m_Array.SetAt(5,0x0A);

                           //                       m_Array.SetAt(6,0x01);

                           //                       m_Array.SetAt(7,0xAD);

                           //                       m_ctrlComm.SetOutput(COleVariant(m_Array));

                          

                           m_ctrlComm.SetPortOpen(FALSE);

                           if (Device_pCirBuf)

                           {

                                    //delete []Device_pCirBuf;//删除数组pCirBuf指针对象

                                    //Device_pCirBuf = NULL;//初始化为空指针

                                    Device_startPos=0;

                                    Device_endPos=0;

                           }

                          

                  }

                 

                  CDialog::OnOK();

         }

         else if(IDCANCEL==ret)

         {

                  return;

         }

}

 

转载于:https://www.cnblogs.com/rechen/p/5100569.html

你可能感兴趣的文章
淘宝应对"双11"的技术架构分析
查看>>
ssh
查看>>
订单的子单表格设置颜色
查看>>
Office365 Exchange Hybrid 番外篇 ADFS后端SQL群集(一)
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
lvs fullnat部署手册(三)rs内核加载toa篇
查看>>
C++策略模式
查看>>
我的友情链接
查看>>
oracle表分区详解
查看>>
网络编程中常见结构体
查看>>
SSL/TLS原理详解
查看>>
Docker 自定义SSH服务镜像
查看>>
JavaScript强化教程 —— Cocos2d-JS自动JSB绑定规则修改
查看>>
configure: error: in `/root/httpd-2.2.11/srclib/apr': c
查看>>
CentOS7搭建Kubernetes-dashboard管理服务
查看>>
buildroot下查找外部编译器通过ext-toolchain-wrapper调用的参数
查看>>
MySQL Replication 主主配置详细说明
查看>>
Linux的任务调度
查看>>
在Android studio中添加jar包方法如下
查看>>
iframe 在ie下面总是弹出新窗口解决方法
查看>>