嵌入式开发疫情期间的模拟工作—UDP通信实现无线装置

嵌入式开发模拟红外测距仪
这学期学习嵌入式开发,由于没有硬件设备,因此课程主要由模拟构成
主要是通过UDP实现服务端和客户端的交互,客户端向服务端发送一个信号,服务端接收后将产生的模拟数据发送给客户端,从而实现目标功能。
以下是代码部分
服务端:

// Sensor_UDP.cpp: 定义控制台应用程序的入口点。#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")   // 使用WinSock2.2实现网络通信所需文件
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <time.h>
#include <stdio.h>
#include <math.h>
#include<time.h>#define BUFF_SIZE 64double generate();
char response[BUFF_SIZE];int main()
{//创建接收与发送缓冲区char recvbuff[BUFF_SIZE];char sendbuff[BUFF_SIZE];WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {printf("dll初始化失败");}//创建套接字SOCKET hServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (hServer == INVALID_SOCKET) {printf("socket failed \n");return 0;}//创建服务器端地址并绑定端口号的IP地址sockaddr_in addrServer;addrServer.sin_family = AF_INET;addrServer.sin_port = htons(8889);addrServer.sin_addr.S_un.S_addr = INADDR_ANY;int nRet = bind(hServer, (sockaddr*)&addrServer, sizeof(addrServer));if (nRet == SOCKET_ERROR) {printf("socket bind failed\n");closesocket(hServer);WSACleanup();return 0;}//接收客户端请求SOCKADDR clntAddr;  //客户端地址信息int nSize = sizeof(SOCKADDR);//等待接收初始化命令while (1) {int strLen = recvfrom(hServer, recvbuff, BUFF_SIZE, 0, &clntAddr, &nSize);            //接收指令,并储存数据长度recvbuff[strLen] = '\0';                               //防止出现乱码if (recvbuff != 0){sendto(hServer, "1", strlen("1"), 0, &clntAddr, nSize);break;}}memset(recvbuff, 0, BUFF_SIZE); //重置缓冲区while (1) {int strLen = recvfrom(hServer, recvbuff, BUFF_SIZE, 0, &clntAddr, &nSize);            //接收指令,并储存数据长度recvbuff[strLen] = '\0';                               //防止出现乱码if (strcmp(recvbuff, "read_mode") == 0){//判断指令double timing = generate();                          //产生模拟数据printf("单次距离读取指令\n");sprintf_s(response, sizeof(response), "%.6f", timing);             //double 转 字符串sendto(hServer, response, strlen(response), 0, &clntAddr, nSize);}else if (strcmp(recvbuff, "close") == 0){printf("断开连接指令\n");sendto(hServer, "服务器已关闭\0", strlen("服务器已关闭\0"), 0, &clntAddr, nSize);break;}else{printf("指令输入有误\n");sendto(hServer, "指令输入有误\0", strlen("指令输入有误\0"), 0, &clntAddr, nSize);printf("错误指令:%s\n", recvbuff);}memset(recvbuff, 0, BUFF_SIZE); //重置缓冲区memset(sendbuff, 0, BUFF_SIZE); //重置缓冲区}//关闭套接字closesocket(hServer);WSACleanup();return 0;
}double generate()
{               //产生模拟数据srand((unsigned)time(NULL));double timing = (rand() % 1000) ;//生成时间单位为微秒return timing;
}

客户端部分

#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")     // 使用WinSock2.2实现网络通信所需文件
#include<stdlib.h>
#include<windows.h>
#include<iostream>
#include<stdio.h>
#include<string>
#include <Ws2tcpip.h>#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define BUFF_SIZE 64        // 缓冲区大小
#define STORAGE_SIZE 10     //历史记录上限
#define Cspeed 3.0e8
#define ACCURACY 3const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];           //show函数中所用char recvbuff[BUFF_SIZE] = { 0 };
char sendbuff[BUFF_SIZE] = { 0 };      // 创建接收与发送缓冲
double timing = 0.0;
double storage[STORAGE_SIZE] = { 0,0,0,0,0,0,0,0,0,0 };          //储存历史数据
int J = -1;                //指向最新数据
int K = 0;             //指向回查数据//函数声明
int sensorInit(SOCKET ConnectSocket, sockaddr_in servAddr, int accuracy);   //初始化
double trans(double timing);                    //把时间转换成距离并存储
double read_storage();                  //阅读历史数据
void read_mode(SOCKET ConnectSocket);           //读取距离
void show(double storage[STORAGE_SIZE]);            //把历史数据转换成曲线sockaddr serSockAddr;                   //不断获取输入并发送到服务器,接收服务器数据
int addrLen = sizeof(serSockAddr);int main()
{// WSADATA结构体主要包含了系统所支持的winsock版本WSADATA wsaData;// 初始化winsock 2.2if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("WSAStartup 无法初始化! ");return 0;}//创建连接到服务器的SOCKET对象SOCKET sClient;sClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (SOCKET_ERROR == sClient) {printf("socket failed !\n");return 0;}//创建服务器端地址sockaddr_in serverAddr;//创建服务器端地址sockaddr_in clientAddr;//设置服务器端地址,端口号,协议族serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(8889);serverAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");// 传感器初始化int init_zet = sensorInit(sClient, serverAddr, ACCURACY);//char strC1[30] = "单次距离读取",strC2[30] = "读取历史数据",strC3[30] = "清除历史数据";printf("提示: \n read_mode:单次距离读取\n read_storage:读取历史数据\n clear_storage:清空历史数据\nclose:关闭服务端\n");while (1) {if (init_zet == 1){printf("Input a command:"); //输入命令scanf_s("%s", sendbuff, BUFF_SIZE);if (strcmp(sendbuff, "read_storage") == 0){printf("历史记录: %f\n", read_storage());   //读取历史记录}else if (strcmp(sendbuff, "clear_storage") == 0){memset(storage, 0, STORAGE_SIZE);}else {sendto(sClient, sendbuff, strlen(sendbuff), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr));    //发送数据}if (strcmp(sendbuff, "read_mode") == 0){read_mode(sClient);}if (strcmp(sendbuff, "close") == 0){printf("服务端已关闭\n");}memset(recvbuff, 0, BUFF_SIZE);memset(sendbuff, 0, BUFF_SIZE); //重置缓冲区}else{printf("传感器初始化失败\n");Sleep(10000);break;}}closesocket(sClient);WSACleanup();     // 释放资源// 清除工作if (WSACleanup() == SOCKET_ERROR)printf("WSACleanup 出错! ");printf("\n\n");system("pause");return 0;
}int sensorInit(SOCKET ConnectSocket, sockaddr_in servAddr, int accuracy)
//初始化:成功返回1,不成功返回0
{int i = 0;sprintf_s(sendbuff, sizeof(sendbuff), "%d", accuracy);while (strcmp(recvbuff, "1") != 0){sendto(ConnectSocket, sendbuff, strlen(sendbuff), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));//发送初始化信息,并建立连接recvfrom(ConnectSocket, recvbuff, BUFF_SIZE, 0, &serSockAddr, &addrLen);                                                   //接收初始化结果信息Sleep(1);            //延时1msi++;}if (i > 10)           //等待10ms以上{return 0;      //初始化失败}else return 1;             //初始化成功
}double read_storage()
{char recvdata[BUFF_SIZE];printf("回看记录数(范围:0-9):");scanf_s("%s", recvdata, sizeof(recvdata));K = (J - strtol(recvdata, NULL, 10) + STORAGE_SIZE) % STORAGE_SIZE;//求回看数return storage[K];
}double trans(double timing)
{double distance = 0;distance = timing * Cspeed / 2;J = (J + 1) % STORAGE_SIZE;storage[J] = distance;printf("Message from server:%f\n", distance);return 0;
}void read_mode(SOCKET ConnectSocket)
{recvfrom(ConnectSocket, recvbuff, BUFF_SIZE, 0, &serSockAddr, &addrLen);//接收数据timing = strtod(recvbuff, NULL)/1000000;//把字符型数据转换成整形trans(timing); //转换并存储
}

最终效果如下图

后续会将其封装为dll文件进行GUI界面程序,大家批评指正。

嵌入式开发模拟红外测距仪---UDP通信实现无线装置相关推荐

  1. 嵌入式学习:开发模拟红外测距仪

    疫情期间由于条件限制,故不做硬件的具体实现,选择用vs模拟出一个红外测距传感器. 选择编写两个程序:workstation和sensor,前者代替信息收集与处理模块,后者模拟传感器模块负责收集反馈信息 ...

  2. QT学习开发笔记(UDP通信)

    UDP 通信 11.3.1 UDP 简介 UDP(User Datagram Protocol 即用户数据报协议)是一个轻量级的,不可靠的,面向数据 报的无连接协议.我们日常生活中使用的 QQ,其聊天 ...

  3. 网络通信、UDP通信、TCP通信、BS架构模拟、URL了解

    网络编程 网络通信 网络通信三要素之IP地址(了解) JAVA对IP地址的操作(InetAddress类) 网络通信三要素之端口号(了解) 网络通信三要素之协议(了解) UDP通信 UDP通信之广播和 ...

  4. 树莓派Pico W无线开发板MQTT协议通信MicroPython编程实践

    本博文介绍采用Thonny+MicroPython和umqtt.simple库MQTTClient类的对象方法编制树莓派Pico W无线开发板MQTT协议通信程序,将Pico W无线开发板.电脑或An ...

  5. Android开发使用ServerSocket ServerSocketChannel DatagramSocket进行TCP UDP通信 实现服务器与APP消息推送

    前言 在日常开发中采用Http协议进行数据传输的情况非常多,但这都是APP主动请求服务端,将数据传到服务器或者从服务器下载数据:那么如果我们想服务器主动联系我们或者我们频繁的上报消息给服务器,怎么弄呢 ...

  6. 嵌入式开发板CAN通信编程——伺服电机驱动

    嵌入式开发板CAN通信编程--伺服电机驱动 在实际的嵌入式项目开发过程中,若不涉及上位机与开发板的通信传输数据,那最关键的无非就是两个内容,读取传感器的数据并处理,驱动硬件设备工作.传感器数据的读取内 ...

  7. 【Android开发—智能家居系列】(四):UDP通信发送指令

    思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...

  8. .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)

    上一篇中说到了"泵"在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似"飞鸽传书"在局域网 ...

  9. 新大陆物联网开发-物联网竞赛-物联网开发中必须要知道的协议-单片机嵌入式开发

    目录 一.概述 二.协议类别 Modbus协议 Zigbee协议 Mqtt协议 Tcp协议 I²C协议 SPI协议 RS-485协议&RS-232协议 一.概述 本文主要针对物联网开发过程中出 ...

最新文章

  1. CNN可视化最新研究方法进展(附结构、算法)
  2. winform把所有dll打包成一个exe
  3. jQuery 遍历:思路总结,项目场景中如何处理/控制获取的 each 遍历次数?
  4. 五邑大学c语言期末考试题,五邑大学 c语言试卷.doc
  5. kibana-7.3.0安装配置
  6. 华为云FusionInsight MRS在金融行业存算分离的实践
  7. k 近邻算法解决字体反爬手段|效果非常好
  8. matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质
  9. flex自定义preloader预加载进度条
  10. 如何正确使用条码标签打印软件
  11. Power BI 数据分析可视化软件入门教程
  12. 闲聊可穿戴设备 - shawn.xie
  13. android phone 模块分析
  14. Cat Snuke and a Voyage AtCoder - 2660
  15. Convert UOM values
  16. 一键解锁,2022阿里顶会创新技术前沿进展
  17. 微信小程序时区时间转换
  18. 电压放大器的作用原理是什么
  19. 解决VS2010使用mscomm控件无法接收数据的问题【转】
  20. 阿里云学生机搭建spark、hadoop集群(踩坑之路)

热门文章

  1. Mysql中查询连续一段时间内统计数据
  2. P1598垂直柱状图
  3. Arduino与FreeRTOS-守护任务(Gatekeeper Task)
  4. 音视频的相关名词、术语、概念
  5. 统计学--从对P值的理解谈起
  6. 程序员的呐喊--读书感悟
  7. java url参数转map_url参数和map之间的转换
  8. 安卓平板倍速_推荐:安卓上本地音频播放器,可实现5秒快进快退和倍速播放...
  9. MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器
  10. ceph monitor 选举leader和peon的过程