您的位置:首页 > 其它

上位机通过UDP方式获取MCU发送的数据

2015-04-30 15:53 483 查看
我的硬件设备是使用的WIFI串口模块,MCU将要发送的数据通过WIFI串口模块发送出来。由于我需要的数据发送频率较高,且不需要可靠传输,所以采用了UDP方式。为了在上位机上显示收到的数据,需要用到WIN32的socket编程。结合网络上的资料,我的代码整理如下:

// 头文件

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
#include <stdio.h>
#include <string>
#include <winsock2.h>
#include <windows.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib, "Winmm.lib")

using namespace std;

SOCKET m_socket;  //定义成全局,这样可以在各个函数之间使用
struct sockaddr_in  server; //用于存储网络地址等信息,含义可以参考:http://blog.csdn.net/joeblackzqq/article/details/8258693

BOOL InitWinsock()  // 套接字初始化  http://www.oschina.net/code/snippet_222150_18666 {
int Error;
WORD Version;
Version=MAKEWORD(2,2);
Error=WSAStartup(Version,&Wsa);
if(Error!=0) {
return FALSE;}
else{
if(LOBYTE(Wsa.wVersion)!=2 || HIBYTE(Wsa.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}
}
return TRUE;
}

// 数据更新线程

DWORD WINAPI DataUpdateThreadProc(LPVOID lpParam)
{
int len =sizeof(server);
while(1)
{
char buffer[1024]="\0";
if (recvfrom(m_socket,buffer,sizeof buffer,0,(struct sockaddr*)&server,&len) != SOCKET_ERROR)  //接收数据
{
// 数据处理,接收到的数据存储在buffer中
}
}
return 0;
}

// 主函数

int _tmain(int argc, _TCHAR* argv[])
{
InitWinsock();
int len =sizeof(server);
server.sin_family=AF_INET;
server.sin_port=htons(8899); ///要访问的sever端口
server.sin_addr.s_addr=inet_addr("192.168.1.1"); ///server的地址
m_socket=socket(AF_INET,SOCK_DGRAM,0);
char UdpSndBuf[2] = {0x01,0x20};  //要发送的数据

if (sendto(m_socket,UdpSndBuf,sizeof UdpSndBuf,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)  //发送数据
{
cout<<"------Data Send Success---------"<<endl;
}

DWORD threadID;
HANDLE hThread;
hThread = CreateThread(NULL,0,DataUpdateThreadProc,NULL,0,&threadID); // 创建数据更新线程

while(1);
closesocket(socket1);
return 0;
}


需要说明的是,在数据接收过程中,使用了recvfrom函数,这个函数默认为阻塞通信方式,即没有数据时则线程停止在这里,直到有数据为止,有多少数据读多少数据,超过缓冲区大小时则仅保留前N个数据。

在数据处理程序中进一步添加数据显示代码,就可以在上位机中实时显示MCU发送的数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: