C#学习笔记4:PC串口发送数据

今日继续我的C#学习之路,今日学习制作PC串口发送数据的窗口程序

串口是单片机上位机开发的重点,本文围绕做一个通过PC端串口发送数据的程序进行实践学习,

文章提供源码与解释、整体工程文件

 

目录

1、控件的选择与摆放:

2、程序设计遇到的问题:

3、整体代码贴出:

4、测试效果展示:

5、测试工程下载:

6、设计缺陷解释:


1、控件的选择与摆放:

 一共摆放以下几个组件:

其中串口组件需要注意的是设计名称与端口号别搞混了:

杂项中的PortName可以更换PC端口号,杂项的元素波特率等可以在程序中被程序语句更改

Name则是在项目中给其标注的名称

2、程序设计遇到的问题:

1、运行启动时找不到COM端口:

TIP:串口的打开语句必须要有COM端口有测试设备连接的情况下才能正常执行

2、数据十六进制、十进制发送转换问题:

3、对类属性的思想不太了解:

3、整体代码贴出:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;namespace Serial_port
{public partial class Form1 : Form{int time;int count = 0;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){int i;string str1;for (i = 1; i < 100; i++){comboBox3.Items.Add(i.ToString() + " 秒");// 初始化下拉框 延时 内容}for (int j = 0; j < 256; j++){str1 = j.ToString("x").ToUpper();//ToString(“x“)是将数字转转换为l6进制字符串,ToUpper 是将字符串所有字符大写if(str1.Length==1){ str1 = "0" + str1; }//如果是一位的(0xA),此时为了对齐,在数据前加一个字符“0”(0x0A)comboBox1.Items.Add("0x" + str1);//统一添加"0x"}for (int k = 1; k < 10; k++)//初始化串口号下拉框内容{comboBox2.Items.Add("COM" + k.ToString()); //添加串口}for (int H = 0; H < 5; H++)//初始化串口波特率下拉框内容{switch (H){case 0: comboBox4.Items.Add("2400"); break;case 1: comboBox4.Items.Add("4800"); break;case 2: comboBox4.Items.Add("9600"); break;case 3: comboBox4.Items.Add("115200"); break;}}comboBox1.Text = "0x00";//数据下拉框初始值comboBox2.Text = "COM1";//端口下拉框初始值comboBox3.Text = "1 秒";//延时下拉框初始值comboBox4.Text = "9600";//波特率下拉框初始值SerialPort.Close();   //关闭串行端口连接}private void button1_Click(object sender, EventArgs e){if (SerialPort.IsOpen)//如果串口已经被打开{string str = comboBox3.Text;//将下拉框内容添加到一个变里中string data = str.Substring(0, 2);time = Convert.ToInt16(data);//得到设定定时值(整形)progressBar1.Maximum = time;//进度条最大数值timer1.Start();//开始计时}else{MessageBox.Show("请打开连接设备的串口", "串口发送提示");}}private void timer1_Tick(object sender, EventArgs e){//int[] a = new int[5];// a[0] = Convert.ToInt16(comboBox1.Text.Substring(2, 2));// a[1] = Convert.ToInt16(comboBox1.Text.Substring(3, 1));// a[3] = a[0] * 10 + a[1];count++; //记录过了几秒progressBar1.Value = count;//设置进度条进度if (count == time){timer1.Stop();//时间到,停止计时System.Media.SystemSounds.Asterisk.Play();//提示音//串口写数据,这么写会让 0x 02中的 0和2都以ascll码形式发出(跳过了字符串中下标0、1的元素)SerialPort.Write(comboBox1.Text.Substring(2));//SerialPort.Write(a[0].ToString());MessageBox.Show("发送延时计时结束!本次串口数据已发送", "串口发送提示");count = 0;//使count归0,便于下次计时}}private void button2_Click(object sender, EventArgs e)//尝试打开串口{try{SerialPort.PortName = comboBox2.Text;//设置端口号SerialPort.BaudRate = Convert.ToInt32(comboBox4.Text);//设置端口波特率SerialPort.Open();                   //打开串口MessageBox.Show("当前串口有设备连接,串口已成功打开", "串口发送提示");//按键状态置位button2.Enabled = false;button3.Enabled = true;}catch{MessageBox.Show("端口无设备连接", "错误警告");}}private void button3_Click(object sender, EventArgs e)//尝试关闭串口{try{SerialPort.Close(); //关闭串口        //按键状态置位button2.Enabled = true;button3.Enabled = false;MessageBox.Show("已关闭串口", "串口发送提示");}catch{}}private void label1_Click(object sender, EventArgs e) { }private void label2_Click(object sender, EventArgs e) { }private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { }private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) { }private void progressBar1_Click(object sender, EventArgs e) { }private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { }private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) { }}
}

 

4、测试效果展示:

 有端口连接情况的检测:

 端口、延时、波特率、数据都可以选择:

坚持先打开可用串口再发送数据原则:

发送计时与发送成功提示:

 

5、测试工程下载:

https://download.csdn.net/download/qq_64257614/89037007?spm=1001.2014.3001.5503

 

6、设计缺陷解释:

 

由于没有严谨的进行进制数据的处理

导致0x02在串口发送时会将0和2拆开并以ascll码形式逐个发出,

大家可以对照我的学习版进行针对性优化,

也欢迎大佬将优化方案或者结果私信我一起讨论:

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

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

相关文章

435. 无重叠区间(力扣LeetCode)

文章目录 435. 无重叠区间题目描述贪心算法解题思路&#xff1a; 435. 无重叠区间 题目描述 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,…

2024.3.26

实现闹钟 weiget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimer> #include<QTime> #include<QTimerEvent> #include<QString> #include<QtTextToSpeech> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

计算机复试面试问答准备(未完)

目录 1、理解多态性2、怎么逆置⼀个链表3、顺序表和链表的区别4、树的存储结构5、什么是哈夫曼树&#xff1f;简述哈夫曼树的构造过程。介绍哈夫曼树的特性。6、哈夫曼编码的编码和解码过程7、图的遍历方式8、图的存储方式9、最小生成树10、迪杰斯特拉算法11、佛洛依德算法12、…

mysql刨根问底

索引&#xff1a;排好序的数据结构 二叉树&#xff1a; 红黑树 hash表&#xff1a; b-tree&#xff1a; 叶子相同深度&#xff0c;叶节点指针空&#xff0c;索引元素不重复&#xff0c;从左到右递增排序 节点带data btree&#xff1a; 非叶子节点只存储索引&#xff0c;可…

C语言经典例题(8) --- 进制A+B、网购、及格分数、最高分数、计算一元二次方程

文章目录 1.进制AB2.网购3.及格分数4.最高分数5.计算一元二次方程 1.进制AB 题目描述&#xff1a; 输入一个十六进制数a&#xff0c;和一个八进制数b&#xff0c;输出ab的十进制结果&#xff08;范围-231~231-1&#xff09;。 输入描述&#xff1a; 一行&#xff0c;一个十六…

不使用额外空间交换两个数

1) 算术x x y;y x - y;x x - y; 2) 异或x x^y;// 只能对int,char..y x^y;x x^y;x ^ y ^ x;加法和异或这两种方法都是用于交换两个数的值而不使用额外空间的方法。它们的适用类型如下&#xff1a; 加法方法&#xff1a; 适用于整数类型&#xff08;int、long、long lo…

C++对象的创建和使用

定义了类&#xff0c;就相当于定义了一个数据类型。类与int、char等数据类型的使用方法是一样的。可以定义变量&#xff0c;数组和指针等。使用类定义的变量通常称为该类的对象。 对象的定义格式如下&#xff1a; 类名 对象名; 1.对象访问其成员 对象通过"."访问它的…

[NCNN学习笔记]-4

1、前言 继续学习NCNN。本次学习binaryop和eltwise。 2、学习内容 2.1、binaryop binaryop是用来二元计算的op&#xff0c;先来看binaryop.h的中关于二元计算的定义&#xff0c;其中二元计算定义了如下操作。 enum OperationType {Operation_ADD 0,Operation_SUB 1,Oper…

垃圾回收:垃圾回收器

目录 垃圾回收器 评估GC的性能指标 7种典型的垃圾回收器 Serial回收器&#xff1a;串行回收 ParNew回收器&#xff1a;并行回收 Parallel回收器&#xff1a;吞吐量优先 CMS回收器&#xff1a;低延迟 G1回收器&#xff1a;区域化分代式 G1回收过程1-年轻代GC G1回收过程…

自信当众讲话:从紧张到自如的转变之路

自信当众讲话&#xff1a;从紧张到自如的转变之路 在人生的舞台上&#xff0c;当众讲话是每个人都可能面对的挑战。然而&#xff0c;对于许多人来说&#xff0c;站在众人面前讲话却是一件令人紧张甚至恐惧的事情。这种紧张感往往源于对自我能力的怀疑&#xff0c;对未知的恐惧…

PyTorch----torch.nn.Linear()函数

torch.nn.Linear是PyTorch中的一个模块&#xff0c;用于在神经网络中实现完全连接层。它表示输入张量的一个线性变换通过将它与一个权矩阵相乘并加上一个偏置项。 下面是torch.nn.Linear的语法: torch.nn.Linear(in_features, out_features, biasTrue)参数&#xff1a; in_f…

neo4j使用详解(二、cypher语法基础——最全参考)

1.简介 Cypher是一种声明式图数据库查询语言&#xff0c;它具有丰富的表现力&#xff0c;能高效地查询和更新图数据。具有以下特点&#xff1a; 是一种声明性模式匹配语言遵循SQL语法的语法是非常简单且人性化、可读的格式 语法详情请看博主其他博客&#xff1a; 一、cypher插…

JS——9大陷阱

一、警惕A>X>B写法 3>2>1 返回值为false&#xff08;原因&#xff1a;3>2为true&#xff0c;会默认转成数字1&#xff0c;1>1为false&#xff09; 1<4<3 返回值为true&#xff08;原因&#xff1a;1<4为true&#xff0c;会默认转成数字1&#xff…

Leetcode第35题:搜索插入位置

代码实现 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:if target in nums:return nums.index(target)index0for num in nums:if target>num:index1else:nums.insert(index,target)breakreturn index解题思路:先判断target是否在nums中…

【简单随机抽样】

文章目录 什么是简单随机抽样&#xff1f;简单随机抽样的步骤简单随机抽样的优点简单随机抽样的缺点 什么是简单随机抽样&#xff1f; 简单随机抽样是指从总体中以相同的概率随机选择一定数量的样本单元组成样本的一种方法。它要求每个样本单元被抽中的机会是均等的。每一个样…

滴滴出行高级Node.js开发工程师笔试题2024

今天参加了一个滴滴出行的Node.js岗位面试&#xff0c;一面为腾讯视频面试&#xff0c;俩个面试官。面试官比较深入问一些你过去做个的项目&#xff0c;问你解决了哪些棘手的问题。 还有就是他们比较关注性能优化&#xff0c;会问你们现在项目的峰值QPS是多少&#xff0c;如何进…

ChatGPT之道:AI与编程的完美融合

ChatGPT无限次数:点击直达 ChatGPT之道&#xff1a;AI与编程的完美融合 引言 随着人工智能技术的发展&#xff0c;AI在各个领域都展现出了惊人的应用潜力。在编程领域&#xff0c;AI的应用也是愈发广泛。其中&#xff0c;ChatGPT作为一种基于大型神经网络的自然语言生成模型&…

2024第二届经济管理、贸易与信息技术创新国际会议(ICEMITI2024)

2024第二届经济管理、贸易与信息技术创新国际会议&#xff08;ICEMITI2024&#xff09; 会议简介 2024第二届经济管理、贸易与信息技术创新国际会议&#xff08;ICEMITI2024&#xff09;将在中国郑州举行。这是一个重要的学术会议&#xff0c;旨在讨论当前经济管理、贸易和信…

[DDD] ValueObject的一种设计落地及应用

目录 前言一、ValueObject二、设计2.1 接口2.2 单一值ValueObject2.3 单一字符串ValueObject 三、实现3.1 示例3.1.1 PhoneNumber3.1.2 SocialCreditCode 四、使用4.1 异常处理4.2 Json 反/序列化4.2.1 请求体4.2.2 HTTP接口4.2.3 用例 4.3 JPA/MyBatis4.3.1 Converter或TypeHa…

vue响应式基础

声明响应式状态​ ref()​ 在组合式 API 中&#xff0c;推荐使用 ref() 函数来声明响应式状态&#xff1a; import { ref } from vueconst count ref(0) ref() 接收参数&#xff0c;并将其包裹在一个带有 .value 属性的 ref 对象中返回&#xff1a; const count ref(0)c…