C# 设计倒计时器、串口助手开发

文章目录

    • [1. 实现一个简单的倒计时器开始、暂停](#1. 实现一个简单的倒计时器开始、暂停)
    • [2. 串口助手开发](#2. 串口助手开发)

1. 实现一个简单的倒计时器开始、暂停

csharp 复制代码
namespace Timer
{
    public partial class Form1 : Form
    {
        int count;//用于定时器计数
        int time;//存储设定的定时值
        bool parse = false;//控制暂停计时
        public Form1()
        {
            InitializeComponent();
        }
        //窗口创建初始化函数
        private void Form1_Load(object sender, EventArgs e)
        {
            //双击窗体后在这里给下拉框添加或者在属性items里添加都可以
            for(int i = 1; i < 100; i++)
            {
                comboBox1.Items.Add(i.ToString() + "秒");
            }
            comboBox1.Text = "1秒";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            count++;//记录、当前秒
            label3.Text = (time - count).ToString() + "秒";//显示剩余时间
            progressBar1.Value = count;//设置进度条进度

            if(count == time)
            {
                timer1.Stop();//时间到,停止计时
                System.Media.SystemSounds.Asterisk.Play();//提示音
                MessageBox.Show("时间到,停止计时","提示");//弹出提示框
                count = 0;
                progressBar1.Value = 0;
                comboBox1.Text = null;
            }
        }

        //开始计时按钮事件
        private void button1_Click(object sender, EventArgs e)
        {
            if (parse == true)
            {
                parse = false;
                timer1.Stop();
                return;
            }
            string str = comboBox1.Text; //将下拉框内容添加到一个变量中
            time = Convert.ToInt16(str.Substring(0,str.Length - 1)); //得到设定的定时值
            progressBar1.Maximum = time;//进度条最大数值
            parse = true;
            timer1.Start();//开始计时
        }
    }
}

2. 串口助手开发

创建项目的时候要选带(.NET Framework)的窗体应用

csharp 复制代码
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;

namespace SerialCommunicate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for(int i = 1; i < 20; i++)
            {
                comboBox1.Items.Add("COM" + i.ToString());
            }
            comboBox1.Text = "COM1";
            comboBox2.Text = "4800";
            //必须手动添加事件处理器
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }
        
        //串口数据接收事件
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (!radioButton4.Checked)//如果为字符模式接收
            {
                string str = serialPort1.ReadExisting();//字符串方式读
                textBox1.AppendText(str);
            }
            else//数值接收
            {
                byte data;
                data = (byte)serialPort1.ReadByte();
                string str = Convert.ToString(data, 16).ToUpper();
                //空位补0
                textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);//十进制数据转换
                serialPort1.Open();
                button1.Enabled = false;//打开串口按钮不可用
                button2.Enabled = true;//关闭串口
            }
            catch
            {

                MessageBox.Show("端口错误,请检查串口", "错误");
            }
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close();
                button1.Enabled = true;
                button2.Enabled = false;
            }
            catch(Exception err)//一般情况下关闭串口不会出错,所以不需要加处理程序
            {
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] Data = new byte[1];
            //判断串口是否打开
            if (serialPort1.IsOpen)
            {
                if(textBox2.Text != "")
                {
                    if (!radioButton1.Checked)
                    {
                        try
                        {
                            serialPort1.WriteLine(textBox2.Text);
                        }
                        catch (Exception err)
                        {
                            MessageBox.Show("串口数据写入错误", "错误");
                            serialPort1.Close();
                            button1.Enabled = true;
                            button2.Enabled = false;
                        }
                    }
                    else
                    {
                        //取余运算防止用户输入的字符为奇数个
                        for(int i = 0; i < (textBox2.Text.Length - textBox2.Text.Length % 2) / 2; i++)
                        {
                            Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);
                            serialPort1.Write(Data, 0, 1);
                        }
                        if(textBox2.Text.Length % 2 != 0)
                        {
                            Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - 1, 1), 16);
                            serialPort1.Write(Data, 0, 1);
                        }
                    }
                }
            }
        }
    }
}
相关推荐
Qlittleboy2 小时前
windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
开发语言·windows·php
水w3 小时前
【Android Studio】解决报错问题Algorithm HmacPBESHA256 not available
android·开发语言·android studio
冷琅辞4 小时前
Elixir语言的云计算
开发语言·后端·golang
Mryan20055 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
Naomi5215 小时前
自定义汇编语言(Custom Assembly Language) 和 Unix & Git
服务器·开发语言·git·unix
烂蜻蜓5 小时前
C 语言命令行参数:让程序交互更灵活
c语言·开发语言·交互
zm-v-159304339865 小时前
解锁 DeepSeek 与 Matlab:攻克科研难题的技术利刃
开发语言·matlab·信息可视化
ylfhpy5 小时前
Java面试黄金宝典33
java·开发语言·数据结构·面试·职场和发展·排序算法
照书抄代码5 小时前
C++11可变参数模板单例模式
开发语言·c++·单例模式·c++11
No0d1es5 小时前
CCF GESP C++编程 四级认证真题 2025年3月
开发语言·c++·青少年编程·gesp·ccf·四级·202503