C# 串口数据转网口实现空气风速风向检测

news2024/9/27 14:52:36

1.窗体搭建

添加time(定时器)

因为需要风速和风向自动刷新

2.进行网口空气检测

①服务器连接按钮

 // 连接按钮
 private void button1_Click(object sender, EventArgs e)
 {
     if (button1.Text =="连接")
     {
         ConnectSocke();// 连接服务器
     }
     else
     {
         CloseSocket(); // 关闭服务器
     }
 }
 Socket soc;
 // 连接方法
 void ConnectSocke()
 {
     try
     {
         // 创建socket对象
         soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 套接字对象
         // 连接服务器ip地址,端口号
         soc.Connect(this.textBox1.Text, int.Parse(this.textBox2.Text));
         button1.Text = "关闭";
         textBox1.Enabled = false;
         textBox2.Enabled = false;
     }
     catch (Exception ex)
     {
         MessageBox.Show("串口服务器连接失败");
     }
 }
 // 关闭方法
 void CloseSocket()
 {
     if (soc!=null && soc.Connected)
     {
         soc.Close();
     }
     button1.Text = "连接";
     this.textBox1.Enabled = true;
     this.textBox2.Enabled = true;
 }
 // 连接方法
 void ConnectSocke()
 {
     try
     {
         // 创建socket对象
         soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 套接字对象

         // 连接服务器ip地址,端口号
         soc.Connect(this.textBox1.Text, int.Parse(this.textBox2.Text));
         button1.Text = "关闭";
         textBox1.Enabled = false;
         textBox2.Enabled = false;
     }
     catch (Exception ex)
     {

         MessageBox.Show("串口服务器连接失败");
     }
 }

判断button1.text是否为“连接”若是连接则进行ConnectSocke();运行服务器的方法,否则CloseSocket();关闭服务器方法。

连接方法:使用try catch异常处理,创建全局变量Socket soc;创建对象连接ip端口号,讲textbox1.text改成关闭,textBox1.Enabled=false;让输入框无法输,catch异常处理判断try里的代码是否报错,若报错运行catch里代码

断开方法:判断soc是否为空或者soc是否连接如果连接关闭soc.Close();,将button1.text=“连接”,让textbox1和2能Enabled=true;解除

3.连接方法

 // 发送按钮
 private void button2_Click(object sender, EventArgs e)
 {
     string sendS = this.textBox3.Text.Trim();// 发送字符串
     if (soc == null || !soc.Connected)
     {
         MessageBox.Show("服务器没连接");
         return;
     }
     if (string.IsNullOrEmpty(sendS))
     {
         MessageBox.Show("指令不能为空");
         return;
     }

     //1 把字符串转成字符数组
     byte[] data = StringToHexByte(sendS);
     //2 计算校检码
     byte[] b1 = CRCCalc(data);
     //3 合并字节数组和校检码数组
     data = data.Concat(b1).ToArray();

     button2.Enabled = false;
     Task.Run(() =>
     {
         //4 发起请求帧
         soc.Send(data);// 发消息 请求 温度请求帧data = []

         Thread.Sleep(1000);// 休眠1秒

         //5 接受数据 // 接收温度
         byte[] rec = new byte[1024]; // rec = 
         int length = soc.Receive(rec);

         // 6 解析数据并且展示数据 把字节数组转成字符串
         string s = ByteToString(rec, length);
         s += "\r\n";
         int temp = (rec[3] * 256 + rec[4]) / 10;// 温度
         this.richTextBox1.Invoke((Action)(() =>
         {
             richTextBox1.AppendText(s);// 响应帧
             richTextBox1.AppendText($"当前温度温度为:{temp}摄氏度,时间为:{DateTime.Now.ToString()}r\n");
             button2.Enabled = true;
         }));

     });
 }
 string ByteToString(byte[] b1,int l)
 {
     StringBuilder sb = new StringBuilder();// 可变字符串
     for (int i = 0; i < l; i++)
     {
         sb.Append(b1[i].ToString("X2")+" ");
     }

     return sb.ToString();
 }


 // 字符串转成字符数组
 byte[] StringToHexByte(string s)
 {
     string[] ss = s.Split(' ');
     byte[] result = new byte[ss.Length];// 字节数组
     for (int i = 0; i < ss.Length; i++)
     {
         result[i] = Convert.ToByte(ss[i], 16);//转成16进制字节
     }
     return result;
 }
 // 校检方法
 public static byte[] CRCCalc(byte[] data)
 {
     //crc计算赋初始值
     int crc = 0xffff;
     for (int i = 0; i < data.Length; i++)
     {
         //XOR
         //(1) 0^0=0,0^1=1  0异或任何数=任何数
         //(2) 1 ^ 0 = 1,1 ^ 1 = 0  1异或任何数-任何数取反
         //(3) 1 ^ 1 = 0,0 ^ 0 = 0  任何数异或自己=把自己置0
         //异或操作符是^。异或的特点是相同为false,不同为true。
         crc = crc ^ data[i]; //和^表示按位异或运算。
                              //0x0fff ^ 0x01 Console.WriteLine(result.ToString("X")); 
                              // 输出结果为4094,即十六进制数1001
         for (int j = 0; j < 8; j++)
         {
             int temp;
             temp = crc & 1; // & 运算符(与) 1 & 0 为 0  ;0 & 0 为0;1 & 1 为1

             //右移 (>>) 将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。
             //int i = 7;
             //int j = 2;
             //Console.WriteLine(i >> j);   //输出结果为1
             crc = crc >> 1;
             crc = crc & 0x7fff;
             if (temp == 1)
             {
                 crc = crc ^ 0xa001;
             }
             crc = crc & 0xffff;
         }
     }
     //CRC寄存器的高低位进行互换
     byte[] crc16 = new byte[2];
     //CRC寄存器的高8位变成低8位,
     crc16[1] = (byte)((crc >> 8) & 0xff);
     //CRC寄存器的低8位变成高8位
     crc16[0] = (byte)(crc & 0xff);
     return crc16;
 }

3.刷新按钮

        // 刷新按钮
        private void button3_Click(object sender, EventArgs e)
        {
            Refresh1();
        }
        void Refresh1()
        {
            if (soc == null || !soc.Connected)
            {
                MessageBox.Show("没连接");
                return;
            }
            Task.Run(() =>
            {
                // 请求帧的组织
                byte[] bs = new byte[] {0x01,0x03,0x00,0x00,0x00,0x02};// 风速和风向请求放在一起

                // 数据和校检
                bs = bs.Concat(CRCCalc(bs)).ToArray();

                soc.Send(bs);// 发送

                Thread.Sleep(1000);

                // 接受数据表
                byte[] rec = new byte[1024];
                int length = soc.Receive(rec);

                double wind = (rec[3] * 256 + rec[4]) * 0.01;
                double dir = (rec[5] * 256 + rec[6]);
                this.Invoke((Action)(() =>
                {
                    this.textBox4.Text = wind + "m/s";
                    this.textBox5.Text = dir + "";
                }));


            });
        }

        // 定时器
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (checkBox1.Checked)// 复选框被选中
            {
                Refresh1();
            }

        }
    }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于html开发的在线网址导航在线工具箱源码

基于html开发的在线网址导航在线工具箱源码&#xff0c;将全部文件复制到服务器&#xff0c;入口文件是index.html 如需修改网址&#xff0c;可修改index.html 如需修改关于页面&#xff0c;可修改about里面的index页面 源码下载&#xff1a;https://download.csdn.net/down…

基于YOLOV8的数粒机视觉计数解决方案

一:行业背景调查 随着全球市场商品大规模工业化生产技术的大规模发展,其中对各类产品生产包装以及原材料供给有了更多精准计数的要求,这些要求主要分布在一些产量较大,产品颗粒较小,单个成本较高的商品中,近几年主要从医药包装领域和接插件包装领域开始对产品包装中的计…

【git】:初识Git 和 Git 的安装

目录 学习 Git 的目标 Git 安装 Linux-centos Linux-ubuntu Windows 学习 Git 的目标 技术目标 掌握 Git 企业级应用&#xff0c;深刻理解Git操作过程与操作原理&#xff0c;理解工作区&#xff0c;暂存区&#xff0c;版本库的含义 掌握 Git 版本管理&#xff0c;自由进⾏…

阿里云Linux中安装MySQL,并使用navicat连接以及报错解决

首先查询是否安装MySQL // linux 使用yum安装或者rpm安装。(就是一个安装工具类似于applStore&#xff0c;brew不必在意) // 区别&#xff1a;yum会自动安装你要安装的东西的其他依赖&#xff0c;rpm不会但会提示你需要安装的东西&#xff0c;比较麻烦&#xff0c;所以采用yum安…

权力之望账号怎么注册 权力之望注册游戏账号教程

不会吧不会吧&#xff0c;这款新的MMORPG游戏&#xff0c;权力之望&#xff0c;马上就要上线啦。支援PC 及行动装置跨平台游玩的MMORPG《权力之望》以Unity 引擎研发&#xff0c;利用动态捕捉、3D 扫描技术呈现细腻的游戏画面。本作主打高自由度的武器选择成长与后续的战斗类型…

GeoTrust ——适合企业使用的SSL证书!

GeoTrust是一家全球知名的数字证书颁发机构&#xff08;CA&#xff09;&#xff0c;其提供的SSL证书非常适合企业使用。GeoTrust的SSL证书为企业带来了多重优势&#xff0c;不仅在验证级别、加密强度、兼容性、客户服务等方面表现出色&#xff0c;而且其高性价比和灵活的证书选…

斐讯N1盒子刷入Armbian并安装Docker拉取网络下行流量教程

一直在跑PCDN&#xff0c;目前主推八米云跟点心云&#xff0c;八米单价比点心更高&#xff0c;业务都一样&#xff0c;直播业务。 两种刷机教程我也发下。 八米云&#xff1a;点此跳转 点心云&#xff1a;点此跳转 最近各运营商对PCDN打击力度加大&#xff0c;需求拉取下行流量…

开始Linux之路(暑假提升)

人生得一知己足矣&#xff0c;斯世当以同怀视之。——鲁迅 Linux操作系统简单操作指令 1、ls指令2、pwd命令3、cd指令4、mkdir指令(重要)5、whoami命令6、创建一个普通用户7、重新认识指令8、which指令9、alias命令10、touch指令11、rmdir指令 及 rm指令(重要)12、man指令(重要…

python-27-零基础自学python

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 统计文本单词数、 解决问题&#xff1a; gbk codec cant decode byte 0x9d in position 995: illegal multibyte sequence” 练习内容&#xff1a; 练习10-10&#xff1a;常见单词 …

搭建图片缓存服务器,解决图片访问403 Forbidden问题

在现代Web开发中&#xff0c;图片是网站和应用的重要组成部分。然而&#xff0c;有时我们在访问某些图片时会遇到403 Forbidden错误&#xff0c;尤其是自己的应用访问互联网上的三方的图片时&#xff0c;这通常是由于别人的服务器设置了访问限制。本文将介绍如何通过搭建一个图…

【大数据】什么是数据清洗?(附应用场景及解决方案)

一、数据清洗的概念及应用场景 数据清洗是在数据处理和分析之前&#xff0c;对数据集进行清理和整理的过程。这个过程包括识别并纠正错误的、不完整的、不准确的、不相关的或者是重复的数据&#xff0c;以确保数据的质量和准确性。数据清洗的目的是提高数据的质量&#xff0c;使…

Vim的撤销(undo)(回退)(后退)重做(redo)(前进) , u回退 , Ctrl+r重做

Vim的撤销(undo)(回退)(后退)重做(redo)(前进) u撤销(undu)(回退)(后退) , 小写u(undo) ctrlr 重做 CTRLr , (redo), 撤销撤销, 撤销回退, 撤销后退,前进 在 Vim 中&#xff0c;撤销&#xff08;undo&#xff09;和重做&#xff08;redo&#xff09;操作是通过以下命令实现的…

Vmware_Mysql8.0.31_安装部署

创建mysql目录&#xff0c;将资料上传到该目录 卸载MySQL依赖&#xff0c;虽然机器上没有装MySQL&#xff0c;但是这一步不可少 sudo yum remove mysql-libs 下载依赖并安装 sudo yum install libaio udo yum -y install autoconf 切换到hadoop102的root用户 su root 执…

简单分享下利用python做测试的学习方向

做为一名转行过来的工程师&#xff0c;我想分享一下这些年来&#xff0c;我对于技术是怎样晋升的&#xff0c;我是在职&#xff0c;边上班边利用时间学习起来的&#xff0c;也听过很多业内人的分享&#xff08;简单可以总结以下几点&#xff0c;分享给大家碎片的式学习方式&…

Java | Leetcode Java题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> majorityElement(int[] nums) {HashMap<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (cnt.containsKey(nums[i])) {cnt.…

键盘快捷键设置录入

效果图&#xff1a; 代码&#xff1a; import React, {useContext, useEffect, useRef} from react import {message} from "antd"; import lodash from "lodash"; import {StateContext} from ../../index.tsx import {useUpdateEffect} from "ahoo…

mysql快速精通(三)表关系

主打一个实用 一. 一对多&#xff08;多对一&#xff09;关系 例如班级和学生&#xff0c;这种类型我们一般建两个表,一方为主表&#xff0c;多方为从表 二. 多对多 例如课程与学生&#xff0c;这种类型我们一般需要建三张表&#xff0c;两张一方主表&#xff0c;与一张多方从表…

PyTorch人脸检测

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 人脸检测解决的问题是确定一幅图上有没有人脸&#xff0c;而人脸识别解决的问题是这张脸是谁的。可以说人脸检测是人脸识别的前期工作。这里介绍Dlib库&#xff0c;它提供了Python接口&#xff0c;里面有人脸检测器&#x…

<数据集>穿越火线cf人物识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3440张 标注数量(xml文件个数)&#xff1a;3440 标注数量(txt文件个数)&#xff1a;3440 标注类别数&#xff1a;1 标注类别名称&#xff1a;[person] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对…

基于整体学习的大幅面超高分遥感影像桥梁目标检测(含数据集下载地址)

文章摘要 在遥感图像&#xff08;RSIs&#xff09;中进行桥梁检测在各种应用中起着至关重要的作用&#xff0c;但与其他对象检测相比&#xff0c;桥梁检测面临独特的挑战。在RSIs中&#xff0c;桥梁在空间尺度和纵横比方面表现出相当大的变化。因此&#xff0c;为了确保桥梁的…