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

news2024/9/21 0:44:23

一、分享代码 

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.coloradmin.cn/o/2147045.html

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

相关文章

云平台在大规模设备管理和数据分析中的作用

在当代数字化转型的浪潮中&#xff0c;云平台作为信息技术基础设施的核心组件&#xff0c;扮演着无可替代的角色&#xff0c;尤其在大规模设备管理和数据分析领域&#xff0c;其重要性和影响力日益凸显。本文旨在深入探讨云平台如何通过其独特的优势&#xff0c;促进数据的高效…

ROS第五梯:ROS+VSCode+C++单步调试

解决问题&#xff1a;在ROS项目中进行断点调试。 第一步&#xff1a;创建一个ROS项目或者打开一个现有的ROS项目。 第二步&#xff1a;修改c_cpp_properties.json 增加一段命令: "compileCommands": "${workspaceFolder}/build/compile_commands.json"第三…

11.第二阶段x86游戏实战2-找人物状态

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

gma 2.0.13 (2024.09.16) 更新日志

安装 gma 2.0.13 pip install gma2.0.13网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

WinRAR 创建自解压文件 添加桌面快捷方式 自定义图标

一、需求描述 将我们开发的软件&#xff0c;打包成exe安装包形式&#xff0c;让用户双击后可以选择安装位置&#xff0c;并在安装完成后&#xff0c;自动生成桌面快捷方式&#xff08;以任意我们自定义的图标和描述&#xff09; 二、准备 1.根据需求准备如下几种图标 软件安…

解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用-文献精读49

Unraveling the serial glycosylation in the biosynthesis of steroidal saponins in the medicinal plant Paris polyphylla and their antifungal action 解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用 摘要 糖–糖糖基转移酶在构建复杂的具有生物活性的…

走进低代码表单开发(五):高效开发的利器

前面我们已经介绍了勤研低代码开发平台的权限管理相关的内容&#xff0c;当表单设计完成后&#xff0c;我们将继续探索表单的其他功能&#xff0c;接下来&#xff0c;我们一起来看看勤研低代码平台还能如何为用户带来更便捷的开发体验。 一、表单导入 表单导入功能是勤研低代码…

电气自动化入门03:安全用电

视频链接&#xff1a;2.1 电工知识&#xff1a;触电原因与防触电措施_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW/?p4&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电流对人体的危害 电击&#xff1a;电流通过人体。 电伤&#xff1a;电流热效应…

深入理解Unreal中的AI感知系统

StimuliSource和PerceptionListener 感知作为一种信号&#xff0c;整个场景中存在这个信号的生产者和消费者。这种信号在Unreal中被叫做刺激Stimuli 生产者就是StimuliSource&#xff0c;通过挂载StimuliSourceComponent并RegisterForSense来注册成为哪些类型刺激的刺激源 消费…

聚焦API安全未来,F5打造无缝集成的解决方案

研究发现&#xff0c;目前超过90%的基于Web的网络攻击都以API端点为目标。随着对API使用需求的增加&#xff0c;这些攻击还会持续增长。现代企业需要一种动态防御策略&#xff0c;在风险升级成代价高昂、令人警惕且往往无法预防的API安全漏洞之前&#xff0c;发现并降低风险。 …

Android 开发高频面试题之——Flutter

Android开发高频面试题之——Java基础篇 flutter高频面试题记录 Flutter1. dart中的作用域与了解吗2. dart中. .. ...分别是什么意思?3. Dart 是不是单线程模型?如何运行的?4. Dart既然是单线程模型支持多线程吗?5. Future是什么6. Stream是什么7. Flutter 如何和原生交互…

微信getUserProfile不弹出授权框

当我们在微信小程序开发工具中想要使用getUserProfile来获取个人信息的时候&#xff0c;会发现不弹出授权框&#xff0c;这是什么原因呢&#xff1f; 早在2022年的小程序官方公告中就已经明确给出了小程序用户头像昵称获取规则调整公告 因此如果还想继续使用getUserProfile的弹…

uni-app-通过vue-cli命令行快速上手

环境安装 全局安装 vue-cli npm install -g vue/cli创建uni-app 使用正式版&#xff08;对应HBuilderX最新正式版&#xff09; vue create -p dcloudio/uni-preset-vue my-project使用alpha版&#xff08;对应HBuilderX最新alpha版&#xff09; vue create -p dcloudio/uni-p…

ARMxy车辆数据采集Linux智能控制器

在当今科技日新月异的时代&#xff0c;高效智能的边缘计算设备在众多领域发挥着关键作用。我们的 ARM 边缘计算机&#xff0c;凭借其卓越的性能和广泛的适用性&#xff0c;成为车队管理智能化的核心力量。 一、强大硬件配置&#xff0c;完美适配车队管理需求 ARM 边缘计算机支…

2024 全新利器:API 微查接口登场

在信息时代的浪潮中&#xff0c;数据查询和核验成为了人们生活中必不可少的一部分。然而&#xff0c;为了满足各种不同的查询需求&#xff0c;开发和维护一个高效、全面的查询系统对于个人或者小团队来说往往是一项不小的挑战。好在现在有了全新的利器&#xff1a;API 微查接口…

CTF 技能树 LOG -GIT泄露 笔记

log 使用虚拟机kali操作 python2 安装 apt-get install python2 进入root用户&#xff0c;下载克隆git hack库 git clone https://github.com/BugScanTeam/GitHack sudo passwd root 修改root 命名密码为root 切换登录 su root 终端进入home/kali/GitHack/ python GitH…

【模板进阶】类型参数的推断

一、使用 B o o s t Boost Boost库来借助推断 通常&#xff0c;我们可以使用 t y p e i d ( ) typeid() typeid()来推断一个类型&#xff0c;但是有时候 t y p e i d typeid typeid不够准确&#xff0c;因此&#xff0c;我们借助 B o o s t Boost Boost库里面的 t y p e _ i d…

yolo车位数据集

停车场车位检测数据集是一个非常有价值的数据资源&#xff0c;它对于开发和训练能够自动识别停车位是否被占用的计算机视觉系统至关重要。以下是对这样一个数据集的详细介绍&#xff0c;以及如何使用这个数据集来训练YOLO&#xff08;You Only Look Once&#xff09;这样的目标…

springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结

源码地址:下载地址 使用该架构的项目地址:下载地址 下面教大家整合nacos、sentinal、springcloud-gateway,springboot security、oauth2做一个分布式架构 1、第一步整合nacos 1、下载alibaba的nacos 下载地址&#xff0c;然后使用单机模式启动nacos sh startup.sh -m standalon…

游戏如何检测加速外挂

在游戏面临的众多外挂风险中&#xff0c;除了常见的内存修改挂、注入挂等作弊手段&#xff0c;黑灰产还常用「加速」手段实现作弊。 游戏安全风险分布占比图 「加速」顾名思义是指改变游戏内的速度。游戏在运行中需要以帧为单位播放画面&#xff0c;而计算每帧动画播放所需时间…