首页 > 编程语言 >C#串口开发

C#串口开发

时间:2023-09-22 16:24:30浏览次数:37  
标签:Convert C# SerialPort 开发 串口 new SelectedValue spCOM2 spCOM1

C#串口开发主要使用的是System.IO.Ports.SerialPort类,其中详细成员介绍可参考MSDN文档。

由于本机没有串口,需要使用VSPD虚拟串口工具创建2个虚拟串口,如下图中的COM1、COM2

 

使用winform创建如下界面,发送端COM1发送数据,接收端COM2接收数据,发送端和接收端的波特率、数据位、校验位、停止位必须一致

 

    public partial class Form1 : Form
    {
        private SerialPort spCOM1;
        private SerialPort spCOM2;

        public Form1()
        {
            InitializeComponent();


            var portNames = SerialPort.GetPortNames();      //获取本机可使用的COM端口
            cmbCOM1.DataSource = portNames;
            cmbCOM2.DataSource = portNames;
            cmbBaudRate.DataSource = new int[] { 9600, 115200 };//波特率,默认9600
            cmbDataBits.DataSource = new int[] { 6, 7, 8 };     //数据位
            cmbParity.DataSource = new string[] { "None" };     //校验位
            cmbStopBits.DataSource = new int[] { 1, 2, 3 };     //停止位

            cmbCOM1.SelectedIndex = 0;
            cmbCOM2.SelectedIndex = 1;
            cmbBaudRate.SelectedIndex = 0;
            cmbDataBits.SelectedIndex = 2;
            cmbParity.SelectedIndex = 0;
            cmbStopBits.SelectedIndex = 0;

            spCOM1 = new SerialPort();
            spCOM2 = new SerialPort();

            spCOM2.ReadTimeout = 1000;
            spCOM2.DataReceived += SerialPort_DataReceived;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (spCOM1.IsOpen || spCOM2.IsOpen)
            {
                spCOM1.Close();
                spCOM2.Close();
            }
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            if (spCOM1.IsOpen || spCOM2.IsOpen)
            {
                spCOM1.Close();
                spCOM2.Close();
                btnConnect.Text = "连接";
            }
            else
            {
                spCOM1.PortName = Convert.ToString(cmbCOM1.SelectedValue);
                spCOM1.BaudRate = Convert.ToInt32(cmbBaudRate.SelectedValue);
                spCOM1.DataBits = Convert.ToInt32(cmbDataBits.SelectedValue);
                spCOM1.StopBits = (StopBits)Convert.ToInt32(cmbStopBits.SelectedValue);
                spCOM1.Parity = (Parity)Enum.Parse(typeof(Parity), Convert.ToString(cmbParity.SelectedValue));
                spCOM1.Open();

                spCOM2.PortName = Convert.ToString(cmbCOM2.SelectedValue);
                spCOM2.BaudRate = Convert.ToInt32(cmbBaudRate.SelectedValue);
                spCOM2.DataBits = Convert.ToInt32(cmbDataBits.SelectedValue);
                spCOM2.StopBits = (StopBits)Convert.ToInt32(cmbStopBits.SelectedValue);
                spCOM2.Parity = (Parity)Enum.Parse(typeof(Parity), Convert.ToString(cmbParity.SelectedValue));
                spCOM2.Open();

                btnConnect.Text = "断开";
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(txtSend.Text);
            spCOM1.Write(buffer, 0, buffer.Length);
            txtSend.Text = "";
        }

        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (spCOM2.BytesToRead > 0)
            {
                byte[] buffer = new byte[spCOM2.BytesToRead];
                spCOM2.Read(buffer, 0, buffer.Length);
                string value = Encoding.UTF8.GetString(buffer);

                this.Invoke(() =>
                {
                    txtReceive.Text += value + "\r\n";
                });
            }
        }

    }

 

标签:Convert,C#,SerialPort,开发,串口,new,SelectedValue,spCOM2,spCOM1
From: https://www.cnblogs.com/xesx/p/17722220.html

相关文章

  • Top 6 BMW Diagnostic Tools to Master in 2023
    Intheever-evolvingautomotiveindustry,theimportanceofdiagnosticsoftwarecannotbeoverstated.Specifically,forBMWvehicles,diagnostictoolshavebecomeanessentialcomponentofmaintenanceandtroubleshooting.Gonearethedaysofrelyingsole......
  • [leetcode] 10. 正则表达式匹配
    10.正则表达式匹配给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。示例1:输入:s="aa",p="a"输出:false解释:"a"无......
  • Rider 2023:跨平台.NET开发的一站式解决方案
    Rider2023是一款功能强大的跨平台.NETIDE集成开发环境(IDE),旨在帮助开发人员快速构建、调试和测试.NET应用程序。→→↓↓载Rider2023mac/win版Rider2023不仅支持多种.NET开发平台,如.NETFramework、.NETCore和.NET5/6等,还支持在Windows、macOS和Linux等不同操作系统上使......
  • linux基本命令(ls,man,pwd,cd,mkdir,echo,touch,cp,mv,rm,rmdir)
    本章命令一共11个123456lsmanpwdcpmkdirechotouchcpvmrmmkdir    命令的使用1.ls命令作用:列出指定目录下的工作目录,默认当前目录语法:ls[参数][文件目录]参数-a列出所有文件,包括以.开头的隐藏文件参数-d列出目录本身并不包括目录中的文......
  • 2023 ICPC网络赛第一场(A,D,J,L)
    2023ICPC网络赛第一场(A,D,J,L)AQualifiersRankingRules先把两场比赛的学校排名处理出来,然后两场比赛的同位次进行合并即可#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); in......
  • dockerfile编写总结
    编写Dockerfile文件1.dockerfile结构介绍  from基础镜像  maintainer维护者信息  run命令前加run  CMD容器启动时执行的操作,可以自定义脚本,也可执行系统命令  ENTRYPOINT容器启动时执行的操作,设置指令指定容器启动时执行的命令,可以追加命......
  • 智慧乡村:视频存储管理平台 EasyCVR 怎么样去助力乡村数字化?
    EasyCVR是一个高度灵活、功能丰富的视频监控系统,其强大的拓展性和便捷的部署方式使其在众多场景中都能发挥出色的性能。EasyCVR平台支持多种主流标准协议,包括但不限于国标GB28181、RTSP/Onvif、RTMP等,这些协议为设备之间的互联互通提供了基础。一、需求分析:某镇22个村庄,合......
  • 使用Object.defineProperty() 定义对象属性时,如已设置 set 或 get, 就不能设置 writab
    使用Object.defineProperty()定义对象属性时,如已设置set或get,就不能设置writable和value中的任何一个了,不然会报如下错误。TypeError:Invalidpropertydescriptor.Cannotbothspecifyaccessorsandavalueorwritableattribute,#<Object>  letobj_tes......
  • 2023.9.22 AT practise
    ARC083F显然每个小球必须被\((0,y)\)或\((x,0)\)中的一个收掉,那么把\(i\)的球看成一条边,链接两个机器人。因为\(2n\)个小球对应\(2n\)条边,故建图出来是一个基环树森林。考虑把每条边定向,对应的就是那个球被那个机器人收了。那么每个基环树只有两种情况(环的方向)。现......
  • How to use a shell script to check whether a command had been installed in the L
    HowtouseashellscripttocheckwhetheracommandhadbeeninstalledintheLinuxserverAllInOneerrors❌shellscripterror[::需要整数表达式shellscripterror[:-eq:需要一元表达式shellscripterror[:==:需要一元表达式#!/usr/bin/envbashif[[$(c......