#include "stdafx.h"
#include "六維力采集demo.h"
#include "六維力采集demoDlg.h"
#include "afxdialogex.h"
#include "MySocketC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// C六維力采集demoDlg 對話框
SOCKET sockConn;
DWORD WINAPI Socket_ListenProc(LPVOID lpParam);
DWORD WINAPI Socket_RecvProc(LPVOID lpParam);
BOOL m_bListen; //偵聽標志
CString ip; //記錄客戶端ip地址
DWORD WINAPI Socket_ListenProc(LPVOID lpParam)
{
SOCKET sock = ((LISTENPARAM*)lpParam)->sock; //本機socket
HWND hwnd = ((LISTENPARAM*)lpParam)->hwnd; //對話框句柄
SOCKADDR_IN addrClient;
int nLen = sizeof(SOCKADDR);
while (m_bListen) //監聽識別符號
{
sockConn = accept(sock,(SOCKADDR*)&addrClient,&nLen);
if (INVALID_SOCKET != sockConn)
{
CString str;
str.Format(_T("%s"),(CString)inet_ntoa(addrClient.sin_addr));
RECVPARAM RecvParam;
RecvParam.hwnd = hwnd;
RecvParam.sock = sockConn;
RecvParam.ip= str;
ip=str;
//開一個接收資料處理的執行緒用來接收資料
HANDLE hThread = CreateThread(NULL, 0, Socket_RecvProc, (LPVOID)&RecvParam, 0, NULL);
}
}
return 0;
}
DWORD WINAPI Socket_RecvProc(LPVOID lpParam)
{
SOCKET sock = ((RECVPARAM*)lpParam)->sock;
HWND hwnd = ((RECVPARAM*)lpParam)->hwnd;
char recvBuf[100]={0};
int nRetVal;
while (TRUE)
{
nRetVal = recv(sock,recvBuf,8,0);//第三個引數為接收資料的長度,本傳感器固定接收大小為8
if ((INVALID_SOCKET == nRetVal) || (0==nRetVal) || (nRetVal==WSAECONNRESET))
break;
//如果成功接收8位元組則發送接收訊息,呼叫相應的接收處理函式進行資料處理
if (nRetVal==8)
::SendMessage(hwnd,WM_RECVDATA,(WPARAM)0,(LPARAM)recvBuf);
}
return 0;
}
C六維力采集demoDlg::C六維力采集demoDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(C六維力采集demoDlg::IDD, pParent)
, m_Port(6001)
, m_DataReceive()
, m_DataSend(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_FX = 0.0f;
m_FY = 0.0f;
m_FZ = 0.0f;
m_MX = 0.0f;
m_MY = 0.0f;
m_MZ = 0.0f;
m_FrameNo = 0;
m_IP = _T("");
FreNum=0;
}
void C六維力采集demoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_FX, m_FX);
DDX_Text(pDX, IDC_FY, m_FY);
DDX_Text(pDX, IDC_FZ, m_FZ);
DDX_Text(pDX, IDC_MX, m_MX);
DDX_Text(pDX, IDC_MY, m_MY);
DDX_Text(pDX, IDC_MZ, m_MZ);
DDX_Text(pDX, IDC_Frame, m_FrameNo);
DDX_Text(pDX, IDC_IP, m_IP);
DDX_Text(pDX, IDC_Port, m_Port);
DDX_Control(pDX, IDC_Connect, m_ConPC);
DDX_Control(pDX, IDC_IPADDRESS1, m_ipaddress);
DDX_Text(pDX, IDC_DataSend, m_DataSend);
}
BEGIN_MESSAGE_MAP(C六維力采集demoDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_RECVDATA,OnRecvData)
ON_BN_CLICKED(IDC_BTNCONNECT, &C六維力采集demoDlg::OnBnClickedBtnconnect)
ON_BN_CLICKED(IDCANCEL, &C六維力采集demoDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_Begin, &C六維力采集demoDlg::OnBnClickedBegin)
ON_BN_CLICKED(IDC_Stop, &C六維力采集demoDlg::OnBnClickedStop)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_Connect, &C六維力采集demoDlg::OnBnClickedConnect)
ON_BN_CLICKED(IDC_SendData, &C六維力采集demoDlg::OnBnClickedSenddata)
ON_BN_CLICKED(IDC_Change, &C六維力采集demoDlg::OnBnClickedChange)
END_MESSAGE_MAP()
// C六維力采集demoDlg 訊息處理程式
BOOL C六維力采集demoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_connect = false;
m_ipaddress.SetWindowTextW(_T("192.168.1.197"));
// 設定此對話框的圖示。當應用程式主視窗不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示
// TODO: 在此添加額外的初始化代碼
//以下是觸發SOCKET。
//為以后創建套接字做準備
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
// 由于對話框已關閉,所以將回傳 FALSE 以便退出應用程式,
// 而不是啟動應用程式的訊息泵。
if(err==0)
{
AfxMessageBox(_T("觸發SOCKET成功"));
}
else
{
AfxMessageBox(_T("觸發SOCKET失敗"));
}
//設定定時器實時重繪對話框中的資料
SetTimer(1,100,NULL);
return TRUE; // 除非將焦點設定到控制元件,否則回傳 TRUE
}
LRESULT C六維力采集demoDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
//CString ip= _T("0");
char* pRecvData;
pRecvData = (char *)lParam;
RecvData(ip,pRecvData);
return 0;
}
//接收處理函式
//本函式處理接收過來的資料,即由接收的原始資料得到6個通道的具體值(電壓模擬值,可供后續開發使用)
//資料處理程序演算法固定(根據下位機發送資料的機制)
//其中每一幀資料分上一半和下一半進行處理,在程式中用FIRST進行標識
//ONE標識第一次按采集按鈕,即第一次采集
void C六維力采集demoDlg::RecvData(CString ip,char *pData)
{
m_IP=ip;//保存客戶端的ip地址
if (ONE && !FIRST)
{
ONE = FALSE;
FIRST= TRUE;
return ;
}
short num, data1, data2, data;
int g_Frequency=500;//采樣頻率默認為1000,可以根據需要進行改動
data = 0x00FF;
if (FIRST) //前一半
{
FIRST= FALSE;
if (FreNum != 5000/g_Frequency)
return ;
//FrameID為下位機發送的幀號,依據下位機發送機制進行處理,可能會出現幀號非規律化(因為下位機原因)
//建議通過讓幀號從1開始遞增的方法記錄幀號,以便后續使用
buff.FrameID =(BYTE)pData[2]*256*256*256+(BYTE)pData[3]*256*256+(BYTE)pData[0]*256+(BYTE)pData[1];
m_FrameNo++;//幀號自增
data1 = data2 = 0;
data1 = pData[4]*256;
data2 = pData[5] & data;
num = data1 + data2;
buff.AD[0] = num/3.2768;
data1 = data2 = 0;
data1 = pData[6]*256;
data2 = pData[7] & data;
num = data1 + data2;
buff.AD[2] = num/3.2768;
}
else //后一半
{
FIRST = TRUE;
if (FreNum == 5000/g_Frequency)
{
data1 = data2 = 0;
data1 = pData[0]*256;
data2 = pData[1] & data;
num = data1 + data2;
buff.AD[4] = num/3.2768;
data1 = data2 = 0;
data1 = pData[2]*256;
data2 = pData[3] & data;
num = data1 + data2;
buff.AD[1] = num/3.2768;
data1 = data2 = 0;
data1 = pData[4]*256;
data2 = pData[5] & data;
num = data1 + data2;
buff.AD[3] = num/3.2768;
data1 = data2 = 0;
data1 = pData[6]*256;
data2 = pData[7] & data;
num = data1 + data2;
buff.AD[5] = num/3.2768;
FreNum=1;
return;
}
FreNum ++;
}
m_IP=ip; //設定客戶端的ip
//以下是6個通道的原始電壓值
//分別對應6個對話框中的值,電壓值可供后續開發處理使用
m_FX=buff.AD[0];
m_FY=buff.AD[1];
m_FZ=buff.AD[2];
m_MX=buff.AD[3];
m_MY=buff.AD[4];
m_MZ=buff.AD[5];
請問大手子們這六個電壓值后續如何呼叫,想實作將其資料持續發送到服務器端。
uj5u.com熱心網友回復:
// 假設6個資料都是4個位元組的:BYTE sendbuff[1024] = {0};
CopyMemory(sendbuff[0],&m_FX,4);
CopyMemory(sendbuff[4],&m_FY,4);
CopyMemory(sendbuff[8],&m_FZ,4);
CopyMemory(sendbuff[12],&m_MX,4);
CopyMemory(sendbuff[16],&m_MY,4);
CopyMemory(sendbuff[20],&m_MZ,4);
send((char*)sendbuff,4*6);
uj5u.com熱心網友回復:
就是具體控制元件發送該怎么撰寫,求詳解,感激不盡
uj5u.com熱心網友回復:
還有沒有大佬啊。。。上面的回答不可用。。BYTE和VOID不兼容。send不接受兩個引數uj5u.com熱心網友回復:
把下位機采集的資料重新打包:站號(設備序號) + 長度 + CRC校驗 + 采集資料,發給服務端再重新解包即可uj5u.com熱心網友回復:
這個中文命名也是醉了。。。uj5u.com熱心網友回復:
這個是廠家給的DEMO。不能直接利用已經采集好的這六個資料么uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
不知道有多少前人掉在TCP Socketsend(人多)send(病少)send(財富)
recv(人多病)recv(少財富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
uj5u.com熱心網友回復:
頂一下帖。。。有沒有大佬能解決的。。uj5u.com熱心網友回復:
直接發收到的資料你敢信嗎?最起碼用個簡單的協議包!
命令碼 + 設備編號 + 資料長度 + 資料 + 校驗
uj5u.com熱心網友回復:
好的,大佬有沒有相關好的資料給推薦一下,新入門轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/76842.html
標籤:網絡編程
上一篇:mfc呼叫C#水晶報表界面
