服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#基于WinForm实现串口通讯

C#基于WinForm实现串口通讯

2023-02-08 14:01Iawfy_ C#

这篇文章主要为大家详细介绍了C#基于WinForm实现串口通讯,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

串口通讯是一种计算机常用的数据传输方式。

程序运行如下:

C#基于WinForm实现串口通讯

首先,检查计算机的串口,并获取所有串口信息。

private void CheckPort()//检查串口是否可用
        {
            myLog(2, "检测串口开始!");  //log记录函数
            comboBox1.Items.Clear();//清除控件中的当前值         
            string[] a = SerialPort.GetPortNames();
            if (a.Length != 0)
            {
                for (int i = 0; i < a.Length; i++)
                {
                    comboBox1.Items.Add(a[i]);
                }
                comboBox1.SelectedIndex = 0;//??
                myLog(2, "检测串口完成");
            }
            else
            {
                myLog(2, "无可用串口...", true);
            }
        }
        private void SetPort()//设置串口
        {
            try
            {
                serialPort1.PortName = comboBox1.Text.Trim();//串口名给了串口类
                //波特率   虚拟串口的波特率好像不能修改,但得将其赋为空,不然报错         
                // serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text.ToString().Trim());        
                // 9600;
                serialPort1.BaudRate = Convert.ToInt32("".Trim());
                //奇偶效验
                if (comboBox5.Text.Trim() == "奇校验")
                {
                    serialPort1.Parity = Parity.Odd;//将奇校验位给了sp的协议
                }
                else if (comboBox5.Text.Trim() == "偶校验")
                {
                    serialPort1.Parity = Parity.Even;
                }
                else
                {
                    serialPort1.Parity = Parity.None;
                }
                //停止位
                if (comboBox4.Text.Trim() == "1.5")
                {
                    serialPort1.StopBits = StopBits.OnePointFive;//设置停止位有几位
                }
                else if (comboBox4.Text.Trim() == "2")
                {
                    serialPort1.StopBits = StopBits.Two;
                }
                else
                {
                    serialPort1.StopBits = StopBits.One;
                }
                serialPort1.DataBits = Convert.ToInt16(comboBox3.Text.ToString().Trim());//数据位
                serialPort1.Encoding = Encoding.UTF8;//串口通信的编码格式
                serialPort1.Open();
            }
            catch { }
        }
        /// <summary>
        /// Log记录
        /// </summary>
        /// <param name="aa">aa=  0为发送  1为接受 2为日常记录</param>
        /// <param name="mystr">记录内容</param>
        /// <param name="IsHint">true 显示弹框,false 不显示弹框 默认false</param>
        private void myLog(int aa, string mystr, bool IsHint = false)
        {
            //log存放路径
            string myypath = myPath + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            StreamWriter sw = new StreamWriter(myypath, true);
            string tempSendstr;
            if (aa == 0)
            {
                tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + "  " + serialPort1.PortName + " 发送--->>>  " + mystr;
            }
            else if (aa == 1)
            {
                tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + "  " + serialPort1.PortName + " 接收<<<---  " + mystr;
            }
            else
            {
                tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + "  " + mystr;
            }
            sw.WriteLine(tempSendstr);
            sw.Close();
            //弹框提示
            if (IsHint)
            {
                MessageBox.Show(mystr, "提示");
            }
            if (listBox1.Items.Count >= 10) listBox1.Items.Clear();
            listBox1.Items.Add(tempSendstr);
        }

大部分的笔记本都不带串口的,我们可以在网上下载 Configure Virtual Serial Port Driver,给自己的笔记本添加几对虚拟串口(虚拟串口都是成对且一一匹配的),再用串口调试助手就可以进行调试了。

数据的发送:

 //发送
private void button3_Click(object sender, EventArgs e)
        {
            if(!serialPort1.IsOpen)
            {
                MessageBox.Show("串口未打开,请检查!");
                return;
            }
            string mystr1 = textBox1.Text;
            byte[] a = Encoding.UTF8.GetBytes(mystr1);
            string mystr2 = Encoding.UTF8.GetString(a);
            serialPort1.Write(mystr2);//将数据写入串行端口输出缓冲区
            myLog(0, mystr2);
        }

数据接收:

//串口接收数据
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(100);
            this.Invoke((EventHandler)(delegate //异步委托一个线程
            {
                if (serialPort1.BytesToRead > 0)
                {
                    byte[] a = new byte[serialPort1.BytesToRead];//读出缓冲区串口通信的字节                                              
                    int readbytes = 0;
                    while (serialPort1.Read(a, readbytes, serialPort1.BytesToRead - readbytes) <= 0) ;
                    string str = UTF8Encoding.UTF8.GetString(a);
                    textBox2.Text = str + "\r\n";
                    myLog(1, str);
                }
            }));
        }

这是串口之间字符串的发送与接收,如要进行十六进制的传输,只需要在数据发送和接收时将字符串转化成十六进制,再写进缓冲区或读取。

多条信息发送时,可能会出现下面的情况。

C#基于WinForm实现串口通讯

串口调试助手将三次发送的数据一起读出来了,此时我们只需要在发送时给上一定的延时即可。

C#基于WinForm实现串口通讯

这样就能实现串口多条信息的发送与接收了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/Iawfy_/article/details/116781212

延伸 · 阅读

精彩推荐
  • C#C#中Equals方法的常见误解

    C#中Equals方法的常见误解

    equals方法被用来检测两个对象是否相等,即两个对象的内容是否相等。本文主要介绍的是equals方法,初学者对它几个常见的误解,一起来看。...

    C#教程网9942021-10-29
  • C#C#简单输出日历的方法

    C#简单输出日历的方法

    这篇文章主要介绍了C#简单输出日历的方法,涉及C#针对日期与时间的简单操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    dongfengkuayue4952021-10-29
  • C#C#中Byte[]和String之间转换的方法

    C#中Byte[]和String之间转换的方法

    很多朋友不清楚如何在Byte[]和String之间进行转换?下面小编给大家带来了byte与string转换的方法,感兴趣的朋友参考下吧...

    鞠帅7932021-12-02
  • C#Unity UI组件ScrollRect实现无限滚动条

    Unity UI组件ScrollRect实现无限滚动条

    这篇文章主要为大家详细介绍了Unity UI组件ScrollRect实现无限滚动条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    东皇十三妖11302022-11-28
  • C#C# 8.0中的范围类型(Range Type)示例详解

    C# 8.0中的范围类型(Range Type)示例详解

    这篇文章主要给大家介绍了关于C# 8.0中范围类型(Range Type)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    LamondLu4262022-03-06
  • C#实例详解C#实现http不同方法的请求

    实例详解C#实现http不同方法的请求

    本篇文章给大家分享了C#实现http不同方法的请求的相关知识点以及实例代码,有需要的朋友参考下。...

    郝光明10752022-02-25
  • C#关于C#执行顺序带来的一些潜在问题

    关于C#执行顺序带来的一些潜在问题

    这篇文章主要给大家介绍了关于C#执行顺序带来的一些潜在问题,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要...

    UWP爱好者10422022-10-07
  • C#详解C#中的泛型以及编程中使用泛型的优点

    详解C#中的泛型以及编程中使用泛型的优点

    这篇文章主要介绍了详解C#中的泛型以及编程中使用泛型的优点,对泛型的支持时C#语言中的重要特性,需要的朋友可以参考下...

    C#教程网4572021-11-11