疫情期间由于条件限制,故不做硬件的具体实现,选择用vs模拟出一个红外测距传感器。
选择编写两个程序:workstation和sensor,前者代替信息收集与处理模块,后者模拟传感器模块负责收集反馈信息。采用的是UDP通信,sensor作为服务端,workstation做client。workstation会向sensor发送一个UDP数据包,即request,sensor则是被动工作。目前还处于中期工作,并没有完善的GUI界面。暂时成效如下:
sensor部分:

// 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;
}

workstation部分:

#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); //转换并存储
}

测试如下

还有show函数没有实现(展示函数图像)以及GUI未能做完,敬请期待。

嵌入式学习:开发模拟红外测距仪相关推荐

  1. 嵌入式开发模拟红外测距仪---UDP通信实现无线装置

    嵌入式开发疫情期间的模拟工作-UDP通信实现无线装置 嵌入式开发模拟红外测距仪 这学期学习嵌入式开发,由于没有硬件设备,因此课程主要由模拟构成 主要是通过UDP实现服务端和客户端的交互,客户端向服务端 ...

  2. 嵌入式学习 开发板触屏失灵解决

    tiny 4412 的触屏被砸坏了一角 还好是 触摸屏坏了 lcd还能照常亮 开始用鼠标usb使用 ,但是用了自己的JNI(里面不包含usb驱动)让鼠标无法运行 网上买一个 带lcd的屏幕也要140 ...

  3. [学习指南]运动是基于4412嵌入式技术开发板学习步骤

    本文转自快:http://www.topeetboard.com 地址:http://v.youku.com/v_show/id_XOTI4Njc0NDIw.html 嵌入式技术的知识体系: 适用于i ...

  4. 【工程师经验分享】 2 嵌入式大牛开发经验心得及其学习方向

    原文来自于网络 学习有捷径吗?俺认为是有的,正确的道路就是捷径. 就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线.         ...

  5. 补充嵌入式后期的开发~~分享一下自己的嵌入式学习经验~~也纪念一下即将逝去的青春

    自己的嵌入式学习经验~~也纪念一下即将逝去的青春 大一听说嵌入式很有挑战性,菜鸟也想挑战一下下,就开始了我的学习之旅,但是后来发现上了操作系统的arm完全没有自己想象的那么简单,简单的led程序都不会 ...

  6. 嵌入式系统开发学习如何起步、如何深入?(转)

    学习有捷径吗?俺认为是有的,正确的道路就是捷径. 就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线. 有时候回首前尘,会谓叹,要是当 ...

  7. 嵌入式驱动开发 视频学习推荐

    首先说下我的视频来源淘宝 购买 如果是单纯的学习计算机语言 推荐买 黑马的课程 就是有点贵,全套课程,20块RMB,对比小甲鱼的视频(适合学生),我推荐的这个更好 如果是嵌入式驱动开发建议购买 华清远 ...

  8. Linux学习之云服务器搭建嵌入式Linux开发环境

    Linux学习之云服务器搭建嵌入式Linux开发环境 第一步:购买云服务器 进入腾讯云官方网站腾讯云官方网站 选择云+校园云+校园 进入控制台 将云服务器系统设置为Ubuntu系统 使用Xshell6 ...

  9. 嵌入式系统开发学习步骤(Linux高级编程学习顺序)

    2019独角兽企业重金招聘Python工程师标准>>> 嵌入式系统开发学习步骤(Linux高级编程学习顺序) 1.Linux 基础 安装Linux操作系统 Linux文件系统 Lin ...

最新文章

  1. 隐藏与显现_手机键盘摇一摇,隐藏功能立马显现,太棒了
  2. html中正方形列表标签属性,如何在HTML中创建带有方形项目符号的无序列表?
  3. 访问windows azure虚拟机iis服务器,如何直接从Java访问Azure/IIS证书?
  4. linux临时文件创建失败,-bash: 无法为立即文档创建临时文件: 设备上没有空间
  5. java调用kafka
  6. Platform平台设备驱动框架
  7. LeetCode 724. Find Pivot Index
  8. 社区发现(三)--CMP
  9. 重磅!!Gradle 6.6 发布,大幅提升性能!
  10. mysql myisam commit_mysql autocommit对myisam,innodb的性能影响
  11. BZOJ1036[ZJOI2008] 树的统计
  12. 通过纯真IP数据库查询IP归属地信息
  13. jmeter压测学习15-setUp线程组实现用户先登录
  14. c语言和python前景_C语言程序员未来发展前景如何
  15. linux如何注销远程用户登录,Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户...
  16. 我从2021中秋节的开始
  17. 做PPT别再傻乎乎的直接插入图片了,手把手教你处理毛玻璃式图片
  18. 人工智能时代,教育革命迫在眉睫
  19. 强基计划 数学相关书籍 推荐
  20. 对openmv色块查找的思考笔记

热门文章

  1. vue中动态请求URL乱码
  2. 琐记之零散知识点(java相关的零散知识都丢这里)
  3. 史上最小sql2005下载只有57.2M(含图形管理工具)
  4. 自动控制原理5.3---频率域稳定判据
  5. Java初学者作业——学生成绩等级流程图练习
  6. 查看进程树(pstree,ps)、杀进程(kill,killall,pkill)
  7. 问题“找不到Microsoft Access Driver(*.mdb)ODBC驱动程序的安装例程”的解决方法
  8. usb阅读笔记-----USB设备被识别流程
  9. oracle 分析函数 NTILE
  10. 保障实施管理子系统业务流程操作说明