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

news2024/11/10 20:45:03

今日继续我的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.coloradmin.cn/o/1546483.html

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

相关文章

Collection与数据结构 顺序表与ArrayList

1. 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在…

libVLC 设置滤镜

在图像和视频处理中&#xff0c;滤镜是一种用于修改图像或视频帧外观的软件工具。滤镜可以通过各种方式改变图像的像素数据&#xff0c;以达到不同的视觉效果。以下是一些常见的滤镜类型&#xff1a; 颜色调整&#xff1a;这些滤镜可以改变图像的亮度、对比度、饱和度、色调等颜…

中科数安 || 设计公司的图档、文件资料、各类设计图纸怎么防止外泄,自动智能透明加密管理软件系统

#文件防泄密软件# 中科数安为设计公司提供了一整套针对图档、文件资料以及各类设计图纸的保密解决方案&#xff0c;帮助企业在多个层面上防止此类重要信息的外泄。 设计行业&#xff0c;部门 || 图档防泄密软件 PC地址&#xff1a; www.weaem.com 以下是中科数安可能采取…

搭建PHP本地开发环境:看这一篇就够了

什么是PHP本地开发环境 PHP本地开发环境是指在个人计算机上模拟的服务器环境&#xff0c;这使得开发者能够在没有网络连接的情况下也能开发、测试和调试PHP应用程序。就像在你的电脑里装个小“服务器”&#xff0c;即使没网也能搞定PHP程序的开发和修修补补。这就是PHP本地开发…

值迭代和策略迭代【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 文章目录 强化学习笔记一、Value It…

springboot企业级抽奖项目业务三(活动模块)

梅开三度 开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在用户模块用户…

Cisco firepower 2140 run ASA and config failover

1 背景 here we got 2 cisco firepower 2140 hardware appliance we’re planning to run ASA on it. and config failover for Primary Unit and Secondary Unit 现场2台Cisco firepower 2140防火墙&#xff0c; 运行ASA模式&#xff0c; 双机组HA&#xff0c;心跳线使用E1/1…

爬虫实践(1)

这一篇只提登录模拟&#xff0c;主要介绍chrome开发者窗口的使用&#xff0c;实际上相关接口调用都是用到cookie&#xff0c;需要再加一篇从token到cookie&#xff0c;以保证实践的完整性 以migu登录为例&#xff0c;分析其登录过程&#xff0c;之后可以使用任意语言模拟登录&…

如何利用FLUENT计算流体力学方法解决大气与环境领域流动问题

ANSYS FLUENT是目前全球领先的商用CFD 软件&#xff0c;市场占有率达70%左右&#xff0c;是工程师和研究者不可多得的有力工具。由于采用了多种求解方法和多重网格加速收敛技术&#xff0c;因而FLUENT能达到最佳的收敛速度和求解精度。灵活的非结构化网格和基于解的自适应网格技…

设置MATLAB三维绘图的视角

MATLAB三维绘图plot3在生成绘图后&#xff0c;默认显示视角是斜着的&#xff1a; 使用view(2)命令可以使其转成XoY平面&#xff08;从上往下看的视角&#xff09;&#xff1a;

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据&#xff0c;有一元运算符和二元运算符之分。 一元算术运算符有两个&#xff1a;&#xff08;正号&#xff09;和-&#xff08;负号&#xff09;&#xff0c;例如&#xff1…

自动驾驶-如何进行多传感器的融合

自动驾驶-如何进行多传感器的融合 附赠自动驾驶学习资料和量产经验&#xff1a;链接 引言 自动驾驶中主要使用的感知传感器是摄像头和激光雷达&#xff0c;这两种模态的数据都可以进行目标检测和语义分割并用于自动驾驶中&#xff0c;但是如果只使用单一的传感器进行上述工作…

【Python】enumerate函数的使用方法,小白一看就懂

enumerate函数的使用方法&#xff1a; season[‘a’,‘b’,‘c’,‘d’] for i in enumerate(season): print(i) season[‘a’,‘b’,‘c’,‘d’] for i,eliment in enumerate(season): print(i,eliment) 输出结果为&#xff1a; 练习题&#xff1a; 2.给出10个学生姓名…

国内ip地址随意更换的潜在风险和策略

在数字化时代&#xff0c;IP地址是互联网通信的基础&#xff0c;而国内IP地址的随意更换可能带来一系列安全风险和问题。虎观代理小二将探讨国内IP地址随意更换的潜在影响以及如何有效应对这一挑战。 1.什么是国内IP地址&#xff1f; 国内IP地址是指在国内分配和使用的IP地址&…

【漏洞复现】用友U8C任意文件读取漏洞

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

ChatGPT 对 ELT的理解

本文主要内容来自 ChatGPT 4.0 到底什么是 ETL&#xff1f;在数据库内部&#xff0c;把数据从 ODS 层加工成 DWD&#xff0c;再加工成 DWS&#xff0c;这个过程和 ETL 的关系是什么&#xff1f;带着这些问题&#xff0c;我问了一下 ChatGPT&#xff0c;总结如下。 数据在两个数…

工厂能耗管控物联网解决方案

工厂能耗管控物联网解决方案 工厂能耗管控物联网解决方案是一种创新的、基于先进技术手段的能源管理系统&#xff0c;它深度融合了物联网&#xff08;IoT&#xff09;、云计算、大数据分析以及人工智能等前沿科技&#xff0c;以实现对工业生产过程中能源消耗的实时监测、精确计…

小学科学期刊投稿邮箱论文发表

《小学科学》是由国家新闻出版总署批准的教育理论类半月刊&#xff0c;由长春出版传媒集团有限责任公司主管主办&#xff0c;旨在为广大一线科学教师、教研员和其他教育工作者提供一个展示传播、交流、研讨科学教育及教研成果的平台&#xff0c;促进小学科学教育工作者的沟通与…

智能楼宇3D可视化解决方案

什么是智能楼宇? 智能楼宇是为提高楼宇的使用合理性与效率,配置合适的建筑环境系统与楼宇自动化系统、办公自动化与管理信息系统以及先进的通信系统,并通过结构化综合布线系统集成为智能化系统的大楼。 面临的问题 信息孤岛,无法统一管理 各个子系统独立工作、独立管理,…

达梦数据库自动备份(全库)+还原(全库) 控制台

一 前提 1.安装达梦数据库DB8(请参照以前文章) 我的数据库安装目录是 /app/dmDB8 2.已创建实例 (请参照上一篇文章) 二 准备测试数据 三 自动备份步骤 1.开启归档模式 开启DM管理工具管理控制台 弹不出来工具的 输入命令 xhost 第一步 将服务器转换为配置状态 右键-&g…