C++数据采集软件和数据显示软件(TCP通信) 您所在的位置:网站首页 如何编写一套数据库程序 C++数据采集软件和数据显示软件(TCP通信)

C++数据采集软件和数据显示软件(TCP通信)

2024-07-14 20:19| 来源: 网络整理| 查看: 265

C++数据采集软件和数据显示软件(TCP通信) 数据采集(服务器端)1.1 设计介绍1.2 概述1.2.1 数据采集1.2.2 网络通信 1.3 程序实现1.3.1 消息处理程序1.3.2 定时采集1.3.3 数据发送1.3.4 CRC16循环冗余校验编码 1.4 运行结果 网络通信及数据显示软件(客户端)2.1 设计介绍2.2 程序实现2.2.1 CRC循环冗余校验解码2.2.2 消息处理程序2.2.3 调用定时器数据接收2.2.4 接受数据处理 2.3 运行结果

数据采集(服务器端) 1.1 设计介绍

1、设计应用程序界面,实现串口/网络通信参数设置、信号采集参数设置和程序运行流程控制功能,界面设计尽量美观大方; 2、在项目中引入数据源设备 DLL 库文件,设计数据源设备控制模块,包括设备打开、参数设置和设备关闭等模块; 3、使用数据源设备 DLL 接口,实现单点数据采集功能,采集正弦波、方波和三角波等信号,每次采集一个数据,引入WM_TIMER消息,实现定时采集; 4、根据CRC16通信协议,将采集到的数据按照通信协议通过串口发送出去;

1.2 概述 1.2.1 数据采集

数据采集,就是将被测对象的各种参量(物理量、化学量、生物量等)通过各种传感器做适当转换后,再经信号调理、采样、量化、编码、传输等步骤送到控制器进行数据处理或记录的过程。

1.2.2 网络通信

TCP协议是TCP/IP(Transmission Control Protocol / Internet Protocol,名为传输控制协议/互连网络协议,是20世纪70年代由美国国防部开发的标准协议)协议中的一个子协议。TCP提供了一种面向连接的、可靠的传输层服务。 在这里插入图片描述

1.3 程序实现 1.3.1 消息处理程序 LRESULT CDemoView::OnServerNotify(WPARAM wParam, LPARAM lParam) { /// WPARAM wParam 事件类型 /// LPARAM lParam 客户端对象 CMySocket *pSocket = (CMySocket*)lParam; CString szClientIP; UINT nClientPort; CString szReportInfo; switch (wParam)// 事件 { case DAQ_LINK_ACCEPT: //客户端建立连接 pSocket->GetPeerName(szClientIP, nClientPort); szReportInfo.Format(_T("客户端建立连接\r\n"), szClientIP, nClientPort); GetDlgItem(IDC_STATE)->SetWindowTextA(szReportInfo); break; case DAQ_LINK_CLOSE: pSocket->GetPeerName(szClientIP, nClientPort); m_myServer.DisConnect(pSocket); szReportInfo.Format(_T("客户端断开连接\r\n"), szClientIP, nClientPort); GetDlgItem(IDC_STATE)->SetWindowTextA(szReportInfo); break; } return 0; } 1.3.2 定时采集

引入WM_TIMER消息,实现定时采集 通过for循环实现数据展示向左移动

//启动计时器 void CDemoView::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 double dblData = 0.00; ReadData(1, &dblData); if (m_SendSatae) { SendData(dblData); } if (m_nPointNum for (int k = 0; k // TODO: 在此添加控件通知处理程序代码 m_SendSatae = ~m_SendSatae; //取反 UpdateData(TRUE); CString IPAdress; if (m_SendSatae) { IPAdress.Format("%d.%d.%d.%d" , (BYTE)(m_IPAdress >> 24), (BYTE)(m_IPAdress >> 16) , (BYTE)(m_IPAdress >> 8), (BYTE)(m_IPAdress >> 0)); GetDlgItem(IDC_STATE)->SetWindowTextA(_T("服务器发送数据")); GetDlgItem(IDC_IPADDRESS) ->EnableWindow(FALSE); //IP控件禁用 GetDlgItem(IDC_IPPORT) ->EnableWindow(FALSE); //端口号控件禁用 } else { GetDlgItem(IDC_STATE)->SetWindowTextA(_T("服务器停止发送")); GetDlgItem(IDC_IPADDRESS)->EnableWindow(FALSE); //IP控件禁用 GetDlgItem(IDC_IPPORT) ->EnableWindow(FALSE); //端口号控件禁用 } } 1.3.4 CRC16循环冗余校验编码

链接: CRC循环冗余校验(百度百科).

CRC校验可以运用于传输数据过程中的验证,发送端发送有效数据时,先根据有效数据和生成多项式(比如CCITT标准的多项式是X16+X12+X5+1)计算出CRC校验码,把CRC校验码加到有效数据后面一起发送;当接收数据时,取出前面有效数据部分,用同样生成多项式计算出CRC校验码,然后取出接收数据后面CRC校验码部分,对比两个校验码是否相同。如果相同,认为接收到的数据与发送的数据是一致的,传输正确;如果不同,认为传输数据出错。 CRC(循环冗余校验)算法主要是一个计算除法的过程。算法有两个输入值,第一个是输入的信号,这通常是一个很长的数据,作为被除数。第二个是一个与具体的CRC算法相关的多项式,称为生成多项式,用作除数。基本的计算过程是,两者作模2除法(本质上是对应位做异或运算),余数就是CRC校验码的结果。

//CRC(循环冗余校验)16校验 WORD CDemoView::CRC_16(BYTE* ptr, WORD len) { WORD crc = 0x0000; while (len-- != 0) { crc ^= *ptr++; for (WORD i = 0; i crc >>= 1; crc ^= 0xa001; } else { crc >>= 1; } } } return crc; } 1.4 运行结果

在这里插入图片描述 在这里插入图片描述

网络通信及数据显示软件(客户端) 2.1 设计介绍

1、设计软件界面,确定图形显示区域的位置坐标,图形显示区域能够显示 200 点数据, 选用适当的绘图工具(包括画笔、画刷和字体等)和绘图函数绘制图形显示网格区域和信号曲线; 2、设计软件界面,实现通信流程控制功能; 3、设计串口/网络通信协议,设计通信数据包格式。接收数据采集软件发送的数据,并按照通信协议解析数据,实现信号的数据采集和信号曲线实时显示功能。

2.2 程序实现 2.2.1 CRC循环冗余校验解码 //CRC16(循环冗余校验) WORD CDemoView::CRC_16(BYTE* ptr, WORD len) { WORD crc = 0x0000; while (len-- != 0) { crc ^= *ptr++; for (WORD i = 0; i crc >>= 1; crc ^= 0xa001; } else { crc >>= 1; } } } return crc; } 2.2.2 消息处理程序 //客户端消息处理程序 LRESULT CDemoView::OnClientNotify( WPARAM wParam, LPARAM lParam) { /// WPARAM wParam 事件代码 /// LPARAM lParam 客户端对象指针 int len = 0; int Slen = m_RxBuffer.GetLength(); BYTE RxData[1024]; CString szReportInfo; switch (wParam)/// 事件类型 { case DAQ_CLIENT_READ: // 客户机接收到数据 m_myClient.ReadData(RxData, len); for (int i = 0; i // TODO: 在此添加消息处理程序代码和/或调用默认值 // TODO: 在此添加消息处理程序代码和/或调用默认值 double dblData = 0.00; dblData = ReadDbl(); if (m_nPointNum for (int k = 0; k int Frame_s = -1; BYTE rxtemp[12]; WORD CurCRC,TCPCRC; double temp = 0.0; int len = m_RxBuffer.GetLength(); Frame_s=m_RxBuffer.Find(0x01,0x08); if (Frame_s == -1) { return temp; } if (Frame_s + 11 > len) { return temp; } for (int i = 0; i (*((BYTE*)(&temp) + i)) = rxtemp[i + 2]; } m_RxBuffer.Delete(Frame_s, Frame_s + 11); return temp; } 2.3 运行结果

在这里插入图片描述 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有