【代码】使用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 类封装了串口通信相关的功能。你可以通过该类轻松实现串口的打开、配置、数据发送与接收等操作。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值