C#上位机—事件传参

C#上位机—事件传参

在这里插入图片描述
在这里插入图片描述
主窗口的操作
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
子窗口的操作
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;namespace 串口助手
{public partial class Form1 : Form{private bool isOpen = false;private bool isRxShow = true;private List<byte> reciveBuffer = new List<byte>();private List<byte> sendBuffer = new List<byte>();private int reciveCount = 0;private int sendCount = 0;private Queue<byte> bufferQueue = null;private bool isHeadRecive = false;private int frameLenth = 0;public TransmitData transmitData;public event TransmitEventHandler transmitData2;//SerialPortpublic Form1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;}private void Form1_Load(object sender, EventArgs e){//在设计页面已经预先添加了COM1 COM2 COM3 //this.port_cbb.Items.Add("COM4");//this.port_cbb.Items.Add("COM5");//this.port_cbb.SelectedIndex = 2;//this.baud_cbb.SelectedIndex = 1;//this.check_cbb.SelectedIndex = 0;//this.databit_cbb.SelectedIndex = 3;//this.stopbit_cbb.SelectedIndex = 0;// 给发送框添加预设文本//  this.send_rtb.Text = "我是发送框";// 给接收框添加预设文本//  this.recive_rtb.Text = "我是接收框";serialLoad();// 实例化bufferQueue = new Queue<byte>();Form2 fr2 = new Form2();// 接收数据委托窗体2 ReciveData 执行显示//transmitData += fr2.ReciveData;// 接收数据事件窗体2 ReciveData2 执行显示transmitData2 += new TransmitEventHandler(fr2.ReciveData2);// 窗体2发送委托窗体1 sendBytes 执行发送// fr2.useForm1Send += sendBytes;// 窗体2发送事件窗体1 sendbytes2 执行发送fr2.useForm1Send2 += new TransmitEventHandler(sendbytes2);fr2.Show();}private void sendbytes2(object sender, TransmitEventArgs e){serialPort1.Write(e.data, 0, e.data.Length);sendCount += e.data.Length;sencount_tssl.Text = sendCount.ToString();}private void sendBytes(byte[] data){serialPort1.Write(data, 0, data.Length);sendCount += data.Length;sencount_tssl.Text = sendCount.ToString();}private void serialLoad(){EncodingInfo[] encodingInfos = Encoding.GetEncodings();RegistryKey keyCom = Registry.LocalMachine.OpenSubKey(@"Hardware\DeviceMap\SerialComm");string[] sSubKeys = keyCom.GetValueNames();port_cbb.Items.Clear();foreach (var sValue in   sSubKeys){string portName = (string)keyCom.GetValue(sValue);port_cbb.Items.Add(portName);}this.port_cbb.SelectedIndex = 0;this.baud_cbb.SelectedIndex = 1;this.check_cbb.SelectedIndex = 0;this.databit_cbb.SelectedIndex = 3;this.stopbit_cbb.SelectedIndex = 0;}private void sendData(){serialPort1.Write(sendBuffer.ToArray(),0,sendBuffer.Count);sendCount += sendBuffer.Count;sencount_tssl.Text = sendCount.ToString();}private void send_btn_Click(object sender, EventArgs e){// 如果发送的数据不为空,则接收if (this.send_rtb.Text != "" && serialPort1.IsOpen){Console.WriteLine(Transform.ToHexString(sendBuffer.ToArray()));sendData();}else{MessageBox.Show("请先输入发送数据!");}}private void open_btn_Click(object sender, EventArgs e){try{if (serialPort1.IsOpen == false){serialPort1.PortName = port_cbb.Text;serialPort1.BaudRate = Convert.ToInt32(baud_cbb.Text);serialPort1.DataBits = Convert.ToInt32(databit_cbb.Text);switch (check_cbb.SelectedIndex){//  none  odd  even case 0:serialPort1.Parity = Parity.None;break;case 1:serialPort1.Parity = Parity.Odd;break;case 2:serialPort1.Parity = Parity.Even;break;default:serialPort1.Parity = Parity.None;break;}switch (stopbit_cbb.SelectedIndex){// 1 1.5 2case 0:serialPort1.StopBits = StopBits.One;break;case 1:serialPort1.StopBits = StopBits.OnePointFive;break;case 2:serialPort1.StopBits = StopBits.Two;break;default:serialPort1.StopBits = StopBits.One;break;}serialPort1.Open();isOpen = true;open_btn.Text = "关闭串口";}else{serialPort1.Close();isOpen = false;open_btn.Text = "打开串口";}}catch (Exception ex){MessageBox.Show(ex.ToString()+serialPort1.PortName.ToString());}}private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){if (isRxShow == false) return;// 1,需要读取有效的数据 BytesToReadbyte[] dataTemp = new byte[serialPort1.BytesToRead];serialPort1.Read(dataTemp,0,dataTemp.Length);reciveBuffer.AddRange(dataTemp);reciveCount += dataTemp.Length;//?. = 如果transmitData !=null// transmitData?.Invoke(dataTemp);transmitData2?.Invoke(this, new TransmitEventArgs { data = dataTemp });this.Invoke(new EventHandler(delegate{// 显示接收数据的长度recivecount_tssl.Text = reciveCount.ToString();if (startData_chb.Checked == false){if (!recivehex_chb.Checked){// 2, 编码格式的选择string str = Encoding.GetEncoding("gb2312").GetString(dataTemp);// 3,0x00 -> \0 结束 不会显示str = str.Replace("\0", "\\0");recive_rtb.AppendText(str);// recive_rtb.AppendText(Encoding.GetEncoding("gb2312").GetString(dataTemp).Replace("\0", "\\0"));}else{//  十六进制是选中的状态下recive_rtb.AppendText(Transform.ToHexString(dataTemp, " "));}}else{// 解析数据 queueforeach (byte item in dataTemp){// 入列bufferQueue.Enqueue(item);}// 解析获取帧头if (isHeadRecive == false){foreach (byte item in bufferQueue.ToArray()){if (item != 0x7f){// 出列bufferQueue.Dequeue();Console.WriteLine("not 0x7f, Dequeue !!");}else{// get 0x7f from bufferQueueisHeadRecive = true;Console.WriteLine("0x7f is recived !!");break;}}}if (isHeadRecive == true){// 判断有数据帧长度if (bufferQueue.Count >= 2){Console.WriteLine(DateTime.Now.ToLongTimeString());Console.WriteLine($"show the data in bufferQueue{Transform.ToHexString(bufferQueue.ToArray())}");Console.WriteLine($"frame lenth ={String.Format("{0:X2}", bufferQueue.ToArray()[1])}");frameLenth = bufferQueue.ToArray()[1];// 一帧完整的数据长度判断,不代表数据是正确的if(bufferQueue.Count>=1+1+frameLenth+2){byte[] frameBuffer = new byte[1 + 1 + frameLenth + 2];Array.Copy(bufferQueue.ToArray(), 0, frameBuffer, 0, frameBuffer.Length);if(crc_chech(frameBuffer)){Console.WriteLine("frame is check ok,pick it");data_txb.Text = Transform.ToHexString(frameBuffer);data1_txb.Text = String.Format("{0:X2}", frameBuffer[2]);data2_txb.Text = String.Format("{0:X2}", frameBuffer[3]);data3_txb.Text = String.Format("{0:X2}", frameBuffer[4]);data4_txb.Text = String.Format("{0:X2}", frameBuffer[5]);}else{// 无效数据Console.WriteLine("bad frame, drop it");}for(int i=0; i<1 + 1+frameLenth+2;i++){bufferQueue.Dequeue();}isHeadRecive = false;}}//接续接收数据}}}));}private bool crc_chech(byte[] frameBuffer){/*大端模式: 是指数据的高字节保存在内存的低地址中,* 而数据的低字节保存在内存的高地址中,这样的存储* 模式有点儿类似于把数据当作字符串顺序处理:地址* 由小向大增加,而数据从高位往低位放;这和我们的* 阅读习惯一致。* * 小端模式: 是指数据的高字节保存在内存的高地址中,* 而数据的低字节保存在内存的低地址中,这种存储模* 式将地址的高低和数据位权有效地结合起来,高地址* 部分权值高,低地址部分权值低。*/bool ret = false;byte[] temp = new byte[frameBuffer.Length-2];Array.Copy(frameBuffer, 0, temp, 0, temp.Length);byte[] crcdata = DataCheck.DataCrc16_Ccitt(temp, DataCheck.BigOrLittle.BigEndian);if (crcdata[0] == frameBuffer[frameBuffer.Length - 2] &&crcdata[1]== frameBuffer[frameBuffer.Length-1]){// check okret = true;}return ret;}private void stop_btn_Click(object sender, EventArgs e){if (isRxShow == true){isRxShow = false;stop_btn.Text = "取消暂停";}else{isRxShow = true;stop_btn.Text = "暂停";}}private void recivehex_chb_CheckedChanged(object sender, EventArgs e){if (recive_rtb.Text == "") return;if (recivehex_chb.Checked){recive_rtb.Text = Transform.ToHexString(reciveBuffer.ToArray()," ");}else{recive_rtb.Text = Encoding.GetEncoding("gb2312").GetString(reciveBuffer.ToArray()).Replace("\0","\\0");}}private void clear_btn_Click(object sender, EventArgs e){reciveBuffer.Clear();reciveCount = 0;recivecount_tssl.Text = "0";recivecount_tssl.Text = "";recive_rtb.Text = "";}private void autoclear_chb_CheckedChanged(object sender, EventArgs e){if (autoclear_chb.Checked){timer1.Start();}else{timer1.Stop();}}private void timer1_Tick(object sender, EventArgs e){if (recive_rtb.Text.Length > 4096){reciveBuffer.Clear();recive_rtb.Text = "";recivecount_tssl.Text = "";}}private void send_rtb_Leave(object sender, EventArgs e){if (sendhex_chb.CheckState == CheckState.Checked){if (DataEncoding.IsHexString(send_rtb.Text.Replace(" ", ""))){sendBuffer.Clear();sendBuffer.AddRange(Transform.ToBytes(send_rtb.Text.Replace(" ", "")));}else{MessageBox.Show("请输入正确的十六进制数据!!");send_rtb.Select();}}else{sendBuffer.Clear();sendBuffer.AddRange(Encoding.GetEncoding("gb2312").GetBytes(send_rtb.Text));}}private void send_rtb_TextChanged(object sender, EventArgs e){// 十六进制切换 会出现问题  这问题就是0x00 转换}private void sendhex_chb_CheckedChanged(object sender, EventArgs e){if (send_rtb.Text == "") return;if (sendhex_chb.Checked == true){send_rtb.Text = Transform.ToHexString(sendBuffer.ToArray(), " ");}else { send_rtb.Text = Encoding.GetEncoding("gb2312").GetString(sendBuffer.ToArray()).Replace("\0","\\0");}}private void sendclear_btn_Click(object sender, EventArgs e){sendBuffer.Clear();send_rtb.Text = "";sendCount = 0;sencount_tssl.Text = "0";}}
}

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

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

相关文章

PV PVC - 每天5分钟玩转 Docker 容器技术(150)

Volume 提供了非常好的数据持久化方案&#xff0c;不过在可管理性上还有不足。 拿前面 AWS EBS 的例子来说&#xff0c;要使用 Volume&#xff0c;Pod 必须事先知道如下信息&#xff1a; 当前 Volume 来自 AWS EBS。 EBS Volume 已经提前创建&#xff0c;并且知道确切的 volu…

扩展协议解析

扩展协议解析 解析数据帧的类

NFS PersistentVolume - 每天5分钟玩转 Docker 容器技术(151)

上一节我们介绍了 PV 和 PVC&#xff0c;本节通过 NFS 实践。 作为准备工作&#xff0c;我们已经在 k8s-master 节点上搭建了一个 NFS 服务器&#xff0c;目录为 /nfsdata&#xff1a; 下面创建一个 PV mypv1&#xff0c;配置文件 nfs-pv1.yml 如下&#xff1a; ① capacity 指…

最优化算法——常见优化算法分类及总结

之前做特征选择&#xff0c;实现过基于群智能算法进行最优化的搜索&#xff0c;看过一些群智能优化算法的论文&#xff0c;在此做一下总结。 最优化问题在生活或者工作中存在各种各样的最优化问题&#xff0c;比如每个企业和个人都要考虑的一个问题“在一定成本下&#xff0c;如…

DSP之CMD文件

DSP之CMD文件 用户希望将某一段&#xff0c;尤其是自定义段&#xff0c;放在什么存储器的什么位置&#xff0c;这也是链接器不知道的。为了告诉链接器&#xff0c;即将使用的芯片其内部存储空间的分配和程序各段的具体存放位置&#xff0c;这就需要编写一个配置文件&#xff0…

突发!央行确认支付宝3种违法违规行为,处罚18万元!

支付宝近段可谓是多事之秋&#xff0c;可把马云愁苦了&#xff0c;继余额宝限额、限时、银行直连被停之后&#xff0c;最近支付宝又被罚了。2018年3月22日中国人民银行杭州中心支行对支付宝做出行政处罚决定&#xff0c;支付宝(中国)网络技术有限公司因七项违规行为被合计罚款共…

杭州刚公布完摇号卖房新政,隔天就来个百亿地王,大家怎么看?

为了响应房子是用来住的而不是用来炒的的知指导&#xff0c;目前各地对如何限制房价使了浑身解数&#xff0c;各种手段不断推出&#xff0c;其中近段最热门的调控手段就是摇号卖房。目前已经有6个城市实施摇号卖房的政策&#xff0c;分别是上海、南京、长沙、成都、杭州、西安。…

DSP之寄存器映射和CDM文件

DSP之寄存器映射和CDM文件 RAM&#xff1a;程序运行速度快&#xff0c;关掉电源&#xff0c;程序会丢失。 Flash&#xff1a;程序运行速度慢&#xff0c;关掉电源&#xff0c;程序不会丢失。 所以&#xff0c;程序一般存到Flash中&#xff0c;在运行的时候&#xff0c;由CPU将…

为何穷人玩股票绝大多数会赔钱?

大家身边有炒股的朋友吗&#xff1f;他们是赚了还是赔了呢&#xff1f;反正小编我身边有几个炒股的穷朋友&#xff0c;都是几万块钱的玩&#xff0c;结果玩了几年也没有见到发大财的&#xff0c;而且大部分人都亏钱了。其实玩股票赢钱、亏钱都很正常&#xff0c;富人也有亏钱的…

回收 PV - 每天5分钟玩转 Docker 容器技术(152)

当 PV 不再需要时&#xff0c;可通过删除 PVC 回收。 当 PVC mypvc1 被删除后&#xff0c;我们发现 Kubernetes 启动了一个新 Pod recycler-for-mypv1&#xff0c;这个 Pod 的作用就是清除 PV mypv1 的数据。此时 mypv1 的状态为 Released&#xff0c;表示已经解除了与 mypvc1 …

PHP会话管理——Session和Cookie

会话管理包括&#xff1a;Session和Cookie&#xff0c;主要功能都是把客户端和服务器关联起来&#xff0c;用于管理和查看用户在网站中的状态。 背景Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕&#xff0c;客户端与服务器端的连接就会关闭…

ADC的本质与特性

ADC的本质与特性 模拟数字转换器即A/D转换器&#xff0c;或简称ADC&#xff0c;通常是指一个将模拟信号转变为数字信号的电子元件。 模拟信号 数字信号 芯片 采样、 保持、量化和编码 所谓采样就是将一个时间上连续变化的模拟量转化为时间上离散变化的模拟量。 将采样结果储存…

无人银行真来了,未来80%的银行人估计得失业!

应该说中国第一家无人银行成立&#xff0c;看到这个消息我还是挺兴奋的&#xff0c;银行终于做出改变了&#xff01;以前马云曾经说过“如果银行不改变&#xff0c;那我们就要改变银行”&#xff0c;而且也做到了&#xff0c;以前躺着赚钱的银行现在也开始奋发图强&#xff0c;…

这些信用卡取现可以免除手续费!

信用卡取现相信很多人在急用钱的时候都干过&#xff0c;但是信用卡1%-2%的手续费看着真肉疼。那有没有取现不要手续费的信用卡呢&#xff1f;还真有&#xff01;今天我就给大家介绍几款取现不要手续费的信用卡&#xff0c;希望对大家有帮助。招行young卡招行的young每个月可以享…

RS232和RS485的区别

RS232和RS485的区别 串口通信 双方需要约定好帧格式和波特率。 串口通信的高低的电压范围是多少呢&#xff1f;

6月30日后支付宝还能正常提现吗?因为银行直连要停止了

3月末网联公布了网联涵(2018)42号文件&#xff0c;其名称为“关于非银行支付机构网络支付清算平台渠道接入工作相关事宜的函”。 在这份文件中声明中&#xff0c;自2018年6月30日起&#xff0c;银行将关闭与第三方支付平台的直连&#xff0c;所有第三方支付都将无权代扣。对于这…

历史上唯独倒闭的两家银行,看看他们是如何破产的

我国历史上总共也就有2家银行倒闭&#xff0c;分别是海南发展银行和河北省肃宁县尚村农信社。这两家银行之所以破产&#xff0c;完全是人为造成的&#xff0c;特别是海南发展银行从成立之日起就奔着破产而去。首先我们来看下海南发展银行海南发展银行成立于1995年&#xff0c;成…

施密特触发器

施密特触发器 应用 波形变换 可将三角波、正弦波、周期性波等变成矩形波。脉冲波的整形 数字系统中&#xff0c;矩形脉冲在传输中经常发生波形畸变&#xff0c;出现上升沿和下降沿不理想的情况&#xff0c;可用施密特触发器整形后&#xff0c;获得较理想的矩形脉冲。脉冲鉴幅…

如果征信有这些行为,申请房贷直接被拒绝

大家都知道现在房贷不好申请&#xff0c;很多人都申请好几个月了还没有放款&#xff0c;而有的人更是直接被拒绝。如果你的征信有些信息达不到银行的要求&#xff0c;那房贷被拒是分分钟的事情。我们来看下信用卡逾期不同情况下对买房的影响。银行看征信一般主要看最近2年的情况…

你会因为贫富差距远离曾经的好友吗?

因为贫富差距&#xff0c;朋友之间渐行渐远&#xff0c;这个绝对不是个别现象&#xff0c;而是普遍现象。先说一个真实的例子我们高中的时候有几个同学玩得很好&#xff0c;即使上了大学也保持良好的联系&#xff0c;放假也会经常聚会。那时候只要春节回老家&#xff0c;不管有…