首页 > 编程语言 >C#串口通讯 源码Demo

C#串口通讯 源码Demo

时间:2024-05-25 11:25:37浏览次数:17  
标签:IsOpen C# System public 源码 串口 using port

在C#中进行串口通讯主要涉及到以下几个步骤:

  1. 引入命名空间

  2. using System.IO.Ports;
  3. 创建SerialPort对象

  4. SerialPort port = new SerialPort();
  5. 设置串口属性

  6. //设置串口名 :port.PortName = "COM1";
  7. //设置波特率:port.BaudRate = 9600;
  8. //设置校验位:port.Parity = Parity.None;
  9. //设置数据位:port.DataBits = 8;
  10. //设置停止位:port.StopBits = StopBits.One;
  11. 打开串口

  12. port.Open();
  13. 发送数据

  14. port.Write("Hello World");
  15. 接收数据

  16.    // 读取numBytesToRead个字节的数据
       byte[] buffer = new byte[10];
       int bytesRead = port.Read(buffer, 0, 10);

       // 将字节数组转换为字符串
       string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

  17. 关闭串口

  18. port.Close();

 

下列为Demo源码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//先引用
using System.IO.Ports;
using System.Windows.Forms;
using System.Threading;
namespace 串口通信
{
    public class Class1
    {

        // 创建SerialPort对象
        SerialPort port = new SerialPort();

        // 定义事件委托
        public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

        // 定义事件
        public event DataReceivedEventHandler DataReceived;


        /// <summary>
        /// 是否初始化
        /// </summary>
        public bool IsOpen { get; set; }

        //设置串口属性(可以通过初始化类进行传递参数)
        public Class1()
        {
            port.PortName = "COM3"; //设置串口名
            port.BaudRate = 115200; //设置波特率
            port.Parity = Parity.None; //设置校验位
            port.DataBits = 8; //设置数据位
            port.StopBits = StopBits.One; //设置停止位

            Thread Mythr = new Thread(ReadMessage);
            Mythr.Start();
           
        }

        /// <summary>
        ///打开串口
        /// </summary>
        public void Openport()
        {
            try
            {
                port.Open();
                IsOpen = true;
            }
            catch
            {
                IsOpen = false;
            }
        }

        /// <summary>
        /// 发送信息
        /// </summary>
        /// <param name="Message"></param>
        public void SendMessage(string Message)
        {
            try
            {
                if (IsOpen)
                {
                    if (port.IsOpen)
                    {
                        port.Write(Message);
                    }

                }
            }
            catch
            {

            }
        }

        /// <summary>
        /// 关闭串口对象
        /// </summary>
        public void ClosePort()
        {
            try
            {
                IsOpen = false;
                if (port.IsOpen)
                {
                    port.Close();

                }

            }

            catch
            {
                IsOpen = false;
            }
        }


        /// <summary>
        /// 读取串口值
        /// </summary>
        public void ReadMessage()
        {
            //根据现场情况定义接收数据长度
            int numBytesToRead = 1;
            while (true)
            {
                //如果连接打开
                if (IsOpen&&port.IsOpen)
                {
                    // 检查是否有足够的数据可读
                    if (port.BytesToRead >= numBytesToRead)
                    {
                        // 读取numBytesToRead个字节的数据
                        byte[] buffer = new byte[10];
                        int bytesRead = port.Read(buffer, 0, 10);

                        // 将字节数组转换为字符串
                        string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

                        if (DataReceived != null)
                        {
                            DataReceived(this, new DataReceivedEventArgs(data));
                        }
                    }
                   
                }
            }
        }

    }


    // 定义事件参数类
    public class DataReceivedEventArgs : EventArgs
    {
        public string ReceivedData { get; set; }

        public DataReceivedEventArgs(string Receiveddata)
        {
            this.ReceivedData = Receiveddata;
        }
    }
}

WinForm调用示例 (虚拟串口调试软件)
http://链接:https://pan.baidu.com/s/1Uz9THjTKbryrD1HteXfQhQ 提取码:d01v

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.Net.Mime.MediaTypeNames;


namespace 串口通信
{
    public partial class Form1 : Form
    {


        Class1 serialPort = new Class1();
        

         public void SerialPort_DataReceived(object sender, DataReceivedEventArgs e)
        {
            textBox2.Invoke(new Action(() => { textBox2.Text = e.ReceivedData.ToString(); }));
        }

        public Form1()
        {
            InitializeComponent();
            serialPort.DataReceived += SerialPort_DataReceived;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort.Openport();
         
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort.SendMessage(textBox1.Text);
        }

      
    }
}

标签:IsOpen,C#,System,public,源码,串口,using,port
From: https://blog.csdn.net/m0_58660481/article/details/139176814

相关文章

  • LeetCode 283. Move Zeroes All In One
    LeetCode283.MoveZeroesAllInOnearrayin-placeswap/数组就地交换算法errorsfunctionmoveZeroes(nums:number[]):void{//in-place就地交换letindex=0;//letflag=false;for(leti=0;i<nums.length;i++){if(nums[i]===0){......
  • C++ const关键字
    C++const关键字记得有次面试carmeraturning岗,面试官让我谈谈const关键字的作用我提到被const修饰变量会存入.rodata的只读数据段不可更改,面试官好像不是很满意,现在想想carmeraturning岗位好像主要用C++,面试官当时是想让我说说C++中const关键字的作用。C++中const关键字的作用......
  • 全网讲的最详细的Docker镜像分层存储原理
    先说结论,容器镜像分层存储图示欢迎关注实验环境准备当前实验docker版本24.0.7如下,当前docker版本使用overlay2机制存储镜像Client:DockerEngine-CommunityVersion:24.0.7APIversion:1.43Goversion:go1.20.10Gitcommit:......
  • Python中的异常处理:try, except, else, finally详解
    Python中的异常处理:try,except,else,finally详解在Python编程中,异常处理是确保程序健壮性和错误处理能力的重要机制。通过使用try,except,else,finally等关键字,Python提供了灵活的异常处理框架,使得开发者能够优雅地处理运行时错误和其他异常情况。本文将详细解析这些......
  • 系统卡顿?Mac怎么清理缓存?轻松解决!
    我们日常使用Mac电脑的过程中,时常会遇到系统运行缓慢或卡顿的情况,这不仅影响工作效率,也大大降低了使用体验。那么,Mac运行缓慢的原因究竟是什么呢?事实上,原因有很多,包括硬盘空间不足、系统资源占用过高、启动项目过多等。其中,缓存文件积累过多是一个常被忽视,但实际上对系统性能影......
  • Rename – A Command Line Tool For Renaming Multiple Files in Linux
    from: https://www.tecmint.com/rename-multiple-files-in-linux/Weoftenusethe mvcommand torenameasinglefilein Linux.However,renamingmultipleorgroupsoffilesquicklymakesitaverydifficulttaskinaterminal.Linux comeswithaverypowerf......
  • Ubuntu-lcd设备文件控制
    1、通过系统函数来控制lcd设备文件的流程打开文件将颜色写入到lcd屏幕上关闭文件2、Lcd特性设备名字/dev/unbuntu_lcd设备宽度和高度(像素点、大小、分辨率)800*480位深度:一个像素点所占用的大小---32位整个屏幕的大小:宽度高度位深度/8intlcd_argb[800*480];屏幕属......
  • GCC编译遇到“a label can only be part of a statement and a declaration is not a
    问题原因:switch中case里面的局部变量出错解决方法:将case里面定义的局部变量在switch外面定义。//报错情况switch(fork()){case-1:error(1,errno,"fork");case0://子进程执行命令if(execvp(args[0]......
  • Practice
    1.以读写方式打开一个普通文件,且当其不存在时要创建它,应指定的mode参数是(D)A.r+B.rw+C.rwD.w+E.r2.以下那一个是fseek(FILE*stream,longoffset,intwhence)中whence的合法值?DA.SEEK_OOPB.SEEK_BIGC.SEEK_TELD.SEEK_SETE.SEEK_GET3.已知字符‘A’的ASCII代码值是65......
  • 01、Cubemx新建工程与LED点亮和蜂鸣器实现(基于正点原子ZET6)
    一、使用Cubemx新建工程    1、正确选择芯片2、正确选择SYS与RCC3、正确配置时钟树输入数字直接回车,然后一直OKK,让它自己配4、正确建立工程结构与工程打开5、Keil5的配置注意看下方Keil5的配置很重要,不配置不能在keil5中开发(本历程主要是完成最简单的几......