C# HuaYun出口服务器

news2024/11/16 18:50:48

直连 

串口转网口:通过请求帧写入波特率 或者地址位 或者温度 湿度等数据

读取时候 [0x01,0x03]

写入的时候[0x01,0x03]

写入波特率的时候请求帧 [0x01,0x06,0x07,0xD1,0x01,0x14] 把波特率改成0x01,0x14

namespace _01_HuaYun出口服务器
{
    public partial class Form1 : Form
    {
        string[] botelvs;
        public Form1()
        {
            InitializeComponent();
            botelvs = new string[] { "2400", "4800", "9600", "19200" };
            comboBox1.DataSource = botelvs;
        }

        NetworkStream stream;
        TcpClient tcp;
        private void button1_Click(object sender, EventArgs e)
        {

            // 连接网口
            if (button1.Text == "连接")
            {
                try
                {
                    tcp = new TcpClient();// 创建客户端对象
                    tcp.Connect(textBox1.Text, int.Parse(textBox2.Text));
                    stream = tcp.GetStream();// 获取网络基础流
                    button1.Text = "断开";
                }
                catch 
                {
                    MessageBox.Show("连接服务器失败");
                }
            }
            else
            {
                if (tcp!=null&&tcp.Connected)
                {
                    tcp.Close();
                    tcp = null;
                    stream = null;
                }
                button1.Text = "连接";
            }
        }
        // 刷新功能
        private void button2_Click(object sender, EventArgs e)
        {
            if (tcp == null || tcp.Connected == false)
            {
                MessageBox.Show("请先连接服务器");
                return;
            }
            Task.Run(refresh);
        }
        async void refresh()
        {
            try
            {
                // 请求帧
                byte[] buffer = null;
                // 响应帧
                byte[] res = null;
                // 设置地址
                byte address = Convert.ToByte(label12.Text);
                // 相应数据的个数
                int resCount = -1;
                // 响应帧crc
                byte[] crc;

                // 读取PM2.5 PM10 湿度 温度数据 寄存器个数是4个
                // 有效数组字节数8个字节
                buffer = new byte[] { address,0x03,0x00,0x00,0x00,0x04 };
                buffer = buffer.Concat(CRCCalc(buffer)).ToArray();

                // 异步发请求 发送请求帧
                await stream.WriteAsync(buffer, 0, buffer.Length);

                // 接受数据 响应帧
                res = new byte[13];
                resCount = await stream.ReadAsync(res, 0, res.Length);

                // 数据验证

                // 数据解析 读取数据
                int pm25 = res[3] * 256 + res[4];
                int pm10 = res[5] * 256 + res[6];
                double humidity = (res[7] * 256 + res[8])*0.1; // 湿度
                double wendu = (res[9] * 256 + res[10]) * 0.1;// s

                //更新界面
                Invoke((Action)(() =>
                {
                    textBox3.Text = pm25.ToString();
                    textBox4.Text = pm10.ToString();
                    textBox5.Text = humidity.ToString();
                    textBox6.Text = wendu.ToString();
                }));


            }
            catch 
            {
                MessageBox.Show("获取数据失败");
             
            }
        }
        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;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (tcp == null || tcp.Connected ==false)
            {
                MessageBox.Show("未连接服务器");
                return;
            }
            Task.Run((() =>
            {
                this.Invoke((Action)(() =>
                {
                    // 获取选中的波特率
                    byte botelv = Convert.ToByte(comboBox1.SelectedIndex);

                    // 当前设备地址
                    byte address = Convert.ToByte(label12.Text);

                    // 询问帧
                    byte[] buffer = new byte[] { address, 0x06, 0x07, 0xD1, 0x00, botelv };
                    buffer = buffer.Concat(CRCCalc(buffer)).ToArray();

                    // 发送 
                    stream.Write(buffer, 0, buffer.Length);

                    // 读取
                    byte[] bs = new byte[8];
                    int count = stream.Read(bs, 0, bs.Length);
                    // 数据验证

                    byte newBotelv = bs[5];
                    comboBox1.SelectedIndex = newBotelv;
                    MessageBox.Show(comboBox1.SelectedIndex + "" + newBotelv.ToString());
                }));
            }));
        }
    }
}

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

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

相关文章

如何监控别人的聊天记录?三种监控聊天记录的方式,千万别让老板看见

监控别人的聊天记录&#xff0c;无论是出于父母对子女的关心、企业管理层对员工的监管&#xff0c;还是其他目的&#xff0c;都必须在法律许可的范围内进行&#xff0c;并且通常需要获得被监控者的明确同意。 非法监控他人的通信记录是严重侵犯隐私权的行为&#xff0c;违反了…

《昇思25天学习打卡营第18天|onereal》

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film…

pdf压缩文件怎么压缩到小于10M或5m 且文件质量不影响画质清晰度

在数字化办公和学习中&#xff0c;pdf格式因其良好的兼容性和稳定性而受到广泛应用。然而&#xff0c;pdf文件体积较大时&#xff0c;会给我们带来传输和存储上的困扰。本文将为您介绍几种简单有效的方法&#xff0c;帮助您轻松压缩pdf文件&#xff0c;提高传输效率&#xff0c…

掉打面试官之Java的SPI机制理解

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【HMAC(ArkTS)】

HMAC(ArkTS) HMAC是密钥相关的哈希运算消息认证码&#xff08;Hash-based Message Authentication Code&#xff09;&#xff0c;是一种基于Hash函数和密钥进行消息认证的方法。 开发步骤 生成密钥 指定密钥别名。初始化密钥属性集。调用[generateKeyItem]生成密钥&#xf…

武夷山细节决定成败抓质量求生存

在当今竞争激烈的市场环境中&#xff0c;细节决定成败&#xff0c;质量求生存的理念已成为企业发展的关键。蓝鹏测控科技有限公司&#xff0c;一家专业从事工业测量领域的高新技术企业&#xff0c;正是秉持这一理念&#xff0c;在工业测径仪领域取得了显著成就。 蓝鹏测控科技…

tensorflow卷积层操作

全连接NN&#xff1a; 每个神经元与前后相邻层的每一个神经元都有全连接关系。输入是特征&#xff0c;输出为预测结果。 参数个数(前层*后层后层&#xff09; 实际应用时&#xff0c;会先对原始图像进行特征提取&#xff0c;再把提取到的特征送给全连接网络 会先进行若干层提…

复杂度(上卷)

前言 在正式进入今天的主题之前&#xff0c;我们不妨先来回顾一下初步学习数据结构后必须知道的概念。&#x1f3b6; 数据结构 数据结构是计算机存储、组织数据的方式&#xff0c;指相互间存在一种或多种特定关系的数据元素的集合。 &#xff08;没有一种单一的数据结构能够…

在centos7中安装MySQL5.7,是否必须卸载centos7自带的mariadb?

在CentOS 7 中安装 MySQL 5.7 时&#xff0c;不一定必须卸载系统自带的 MariaDB&#xff0c;但为了避免冲突和确保 MySQL 的正常运行&#xff0c;通常建议先卸载 MariaDB。以下是具体的步骤&#xff1a; 卸载 MariaDB&#xff08;如果已经安装&#xff09;&#xff1a; sudo sy…

强化学习驱动的狼人游戏语言智能体战略玩法

Language Agents with Reinforcement Learning for Strategic Play in the Werewolf Game 论文地址: https://arxiv.org/abs/2310.18940https://arxiv.org/abs/2310.18940 1.概述 在AI领域,构建具备逻辑推理、战略决策以及人类沟通能力的智能体一直被视为长远追求。大规模语…

小阿轩yx-NoSQL 之 Redis 配置与优化

小阿轩yx-NoSQL 之 Redis 配置与优化 Redis 数据库介绍 是一个非关系型数据库 关系数据库与非关系型数据库 按照数据库结构划分的 关系型数据库 是一个结构化的数据库&#xff0c;创建在关系模型基础上&#xff0c;一般面向于记录借助集合代数等数学概念和方法处理数据库…

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下&#xff1a; 避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&…

数列分块<2>

本期是数列分块入门<2>。该系列的所有题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:http://hzwer.com/8053.html sto hzwer orz %%% [转载] 好像上面的链接↑打不开&#xff0c;放一个转载:https://www.cnblogs.…

CUDA原子操作

代码 #include <cuda_runtime.h> #include <stdio.h>__global__ void atomicAddAndGet(int *result, int *valueToAdd) {// 原子加法int addedValue atomicAdd(result, *valueToAdd);// 通过原子操作后读取值&#xff0c;确保是加法后的值addedValue *valueToAd…

LabVIEW开发CAN总线多传感器液位检测系统

设计并实现了一个基于CAN总线和LabVIEW的多传感器液位检测系统。该系统利用STM32F107单片机进行模拟信号与数字信号的转换&#xff0c;通过TJA1050实现CAN总线通信&#xff0c;并使用USB-CAN分析仪连接PC。LabVIEW用于数据采集、人机交互界面的设计、数据分析和仪器标定。系统能…

前端必修技能:高手进阶核心知识分享 - 三万字帮你搞定CSS动画(形变动画、过渡动画、关键帧动画)

在CSS的世界里,存在着多种能体现动画效果的属性:CSS transform、CSS Transition 和 CSS Animation。让开始接触CSS的同学感到困惑。要搞清楚CSS的动画,我们就必须先把这几种属性做一下区别。 CSS transform 属性、CSS Transition 属性、 CSS Animation 属性的区别 CSS tra…

FL Studio21.5.3.21中文版破解安装包!音乐制作新神器,让创意无限飞扬!

&#x1f3b6; 音乐制作&#xff0c;轻松入门&#xff01;FL Studio21中文版本体验分享 嘿&#xff01;各位音乐小能手和创作小白们&#xff0c;今天我要给大家安利一个超酷炫的音乐制作软件——FL Studio21中文版&#xff01;&#x1f389; FL Studio21汉化版下载网盘链接: …

Python函数 之 模块和包---练习

题目 1 1.定义一个模块 toolls.py , 定义函数实现对两个数据进行加法操作的函数 add_2_num &#xff0c;并返回相加之和的结 果&#xff1b; 再定义一个实现对三个数据进行加法操作的函数 add_3_num &#xff0c;并返回相加之和的结果&#xff1b; 2.最后新定义一个代码文件 …

AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景 当前小红书消息引擎团队与 AutoMQ 团队正在深度合作&#xff0c;共同推动社区建设&#xff0c;探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架&#xff0c;对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。 01 测试结论 本文主要测评云…

JavaDS —— 单链表 与 LinkedList

顺序表和链表区别 ArrayList &#xff1a; 底层使用连续的空间&#xff0c;可以随机访问某下标的元素&#xff0c;时间复杂度为O&#xff08;1&#xff09; 但是在插入和删除操作的时候&#xff0c;需要将该位置的后序元素整体往前或者向后移动&#xff0c;时间复杂度为O&…