【代码】使用c#实现串口通信的基础模板

news/2024/9/20 5:42:42 标签: c#, 开发语言

一、分享代码 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO.Ports;
using System.Threading;



//串口参数结构体
struct COMPORT_ATTRIBUTE
{
    public int bandrate;
    public int data_bit;
    public Parity parity_check_bit;
    public StopBits stop_bit;
    public string comport_number;
};


namespace uarttest2
{
    public partial class Form1 : Form
    {
        // 串口参数
        private COMPORT_ATTRIBUTE uart_port;
        //实例化串口类
        public System.IO.Ports.SerialPort _serialPort = new System.IO.Ports.SerialPort();

        //============================== 定义线程 ===========================================
        Thread listenThread;
        public bool rx_thread_stop_flag = false;//线程停止标志
        public bool rx_thread_start_flag = false;//线程停止标志

        //初始化端口
        public void InitializePorts()
        {
            string[] port_names = SerialPort.GetPortNames();
            string last_name = "";

            comport.Items.Clear();//清除数据
            if (port_names == null)
            {
                MessageBox.Show("本机没有串口!", "Error");
                return;
            }
            foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
            {
                //获取有多少个COM口就添加进COMBOX项目列表  
                comport.Items.Add(s);
                last_name = s;//保存最新的一个
            }
            comport.Text = last_name;//显示最新的一个串口
            uart_port.comport_number = last_name;//赋值变量
        }


        public void InitializeSerialSet()
        {

            // 初始化扫描串口
            InitializePorts();
            // 初始化波特率
            uart_port.bandrate = 115200;
            // 初始化数据位
            uart_port.data_bit = 8;
            // 初始化停止位
            uart_port.stop_bit = (StopBits)1;
            // 初始化校验位
            uart_port.parity_check_bit = 0;//Parity.None
            if (uart_port.parity_check_bit == (Parity)1)//  Parity.Odd
            {
            }
            else if (uart_port.parity_check_bit == (Parity)2) //Parity.Even
            {
            }
            else
            {
            }


        }

        public void Open_uart()
        { 
            if (_serialPort.IsOpen)
            {
                
                _serialPort.Close();
            }


            _serialPort.PortName = comport.Text;            //串口名称
            _serialPort.BaudRate = uart_port.bandrate;      //波特率
            _serialPort.DataBits = uart_port.data_bit;      //数据位
            _serialPort.Parity = uart_port.parity_check_bit;//校验位
            _serialPort.StopBits = uart_port.stop_bit;      //停止位





        }

        public void Close_uart()
        {
            try 
            {
            
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        
        
        }



        /// <summary>
        /// 开关接收线程
        /// </summary>
        private void RxThreadOnOff(bool on_off)
        {
            if (on_off)
            {
                listenThread = new Thread(() => ReceiveData());//开启一个线程来不断的接收数据
                listenThread.IsBackground = true;
                listenThread.Start();

            }
            else
            {
                rx_thread_stop_flag = true;
                while (listenThread.IsAlive)//等待停止
                { }
                rx_thread_stop_flag = false;
            }
        }
        /// <summary>
        /// 接收数据
        /// </summary>
        public void ReceiveData()
        {
            //接收线程
            while (_serialPort.IsOpen && !rx_thread_stop_flag)//线程循环
            {
                //......
            }
        }
    





        public Form1()
        {
            InitializeComponent();
            InitializeSerialSet();
        }

        private void scanuart_Click(object sender, EventArgs e)
        {
            InitializePorts();

        }

        private void openuart_Click(object sender, EventArgs e)
        {
            Open_uart();
        }
    }
}

串口通信基础及C#实现详解

串口通信(UART)是计算机与外部设备(如传感器、模块等)进行数据传输的常用方式。本文将介绍串口通信的基本原理,并通过一个C#示例讲解如何在Windows上实现串口通信。

什么是串口通信?

串口通信是指通过串行方式在两个设备之间进行数据传输的一种通信方式。与并行通信不同,串口通信的数据传输是按位进行的。串口通信最常见的应用是计算机与外设(如传感器、模块或单片机)之间的通信。

在串口通信中,常见的参数包括:

  • 波特率(Baud Rate):表示每秒传输的比特数。常用的波特率有9600、115200等。
  • 数据位(Data Bits):数据包中有效数据的位数,常见的有7位或8位。
  • 停止位(Stop Bits):用于标识一个数据包的结束,常见的有1位或2位停止位。
  • 校验位(Parity Bit):用于检测数据传输中的错误,分为无校验、偶校验和奇校验等。
  • 串口号(Port Number):表示计算机与外设通信时使用的物理串口,常见的有COM1、COM2等。
C#中的串口通信类

在C#中,System.IO.Ports.SerialPort 类封装了串口通信相关的功能。你可以通过该类轻松实现串口的打开、配置、数据发送与接收等操作。

本文就实现了通过配置这一段属性来实现打开串口的操作。界面元素展示如下:

 对应三个功能,扫描,开启,关闭串口的方法。


http://www.niftyadmin.cn/n/5666620.html

相关文章

Angular面试题五

一、请解释Angular中的管道是什么&#xff0c;并列举几个内置的管道。 Angular中的管道&#xff08;Pipe&#xff09;是一种强大的工具&#xff0c;用于在Angular模板中处理和转换数据&#xff0c;并将其呈现给用户。管道可以将输入数据&#xff08;如字符串、数字、日期等&…

fiddler抓包06_抓取https请求(chrome)

课程大纲 首次安装Fiddler&#xff0c;抓https请求&#xff0c;除打开抓包功能&#xff08;F12&#xff09;还需要&#xff1a; ① Fiddler开启https抓包 ② Fiddler导出证书&#xff1b; ③ 浏览器导入证书。 否则&#xff0c;无法访问https网站&#xff08;如下图&#xff0…

安卓 uniapp跨端开发

HBuilder X 4.24 本地插件方式使用原生插件 例如 MT-TTS 地址PS: 播放 speek({text: ‘test’}) 应为 播放 speak({text: ‘test’})MT-TTS下载下来之后,将 nativeplugins 文件夹拷贝到 uniapp 项目根目录中manifest.json ---- App原生插件配置 运行 语音引擎测试文字转语音播…

四十一、完成内容添加功能(使用go测试方法)

目录 一、添加model 二、完成相关dao 三、使用测试类进行测试 1、把光标防止要测试的方法上&#xff0c;右击并选择 2、自动会生成一个以dao文件加_test命名的文件 3、在其中完善方法并完成测试 四、完成content_create_handle 一、添加model 按数据库字段以及字段格式完…

安科瑞智能塑壳断路器适用于物联网配电电网中-安科瑞黄安南

智能塑壳断路器是一款多功能、体积小、智能化的塑壳断路器&#xff0c;适用于物联网配电电网中。用于三相四线中性点直接接地的供电、用电系统&#xff0c;能全面采集功率、电能量、功率因数、谐波等用电参数;具有过载、短路、缺相、过压、欠压、剩余电流动作保护等功能&#x…

vue + leaflet + 天地图实现搜索省份后高亮

实现省份高亮方法最重要的代码在于 L.geoJSON(district).addTo(map)这个方法&#xff0c;district为参数&#xff0c;可以在页面中引入当前省份的坐标json。 获取省份json文件的地址&#xff1a;https://datav.aliyun.com/portal/school/atlas/area_selector import beijing …

SpinalHDL之结构(三)

本文作为SpinalHDL学习笔记第六十三篇&#xff0c;介绍SpinalHDL的函数(Function)。 目录&#xff1a; 1.简介(Introduction) 2.RGA到灰度(RGB to grey) 3.Valid和Ready负载总线(Valid Ready Payload bus) ⼀、简介(Introduction) ⽤Scala函数产⽣硬件的⽅式与VHDL/Verilog…

【面经】static关键字总结

1.什么是static关键字 static中文意思是静态的&#xff0c;是C/C中常见的一个关键字。它一般用于修饰变量&#xff08;局部变量/全局变量&#xff09;和函数。 对于变量来说&#xff0c;static关键字用来控制变量的存储方式&#xff0c;作用范围和生命周期。 下面我们分别在…