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);
                }
            }));
        }

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

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

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

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

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

(0)

相关推荐

  • C#基于SerialPort类实现串口通讯详解

    本文实例为大家分享了C#基于SerialPort类实现串口通讯的具体代码,供大家参考,具体内容如下 最终效果 窗体设置: 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; usi

  • C#串口通讯概念及简单的实现方法

    前言 最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可以同时向两端或者更多进行数据发送,它们之间的传输数据类型是byte,串口通信最重要的参数是波特率.数据位.停止位和奇偶校验.对于两个进行通信的端口,这些参数必须匹配. 听大佬说的几个关于串口通讯的术语,啥?啥,这是啥? 就让我这个"小白"给你说说:第一个波特率,这个东西在不同领域都有

  • C#实现简单串口通讯实例

    本文实例为大家分享了C#实现简单串口通讯的具体代码,供大家参考,具体内容如下 参数设置界面代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.P

  • c# 实现简单的串口通讯

    本文提供一个用C#实现串口通讯实例,亲自编写,亲测可用! 开发环境: VS2008+.net FrameWork3.5(实际上2.0应该也可以) 第一步 创建一个WinForm窗体,拉入一些界面元素 重点就是,图中用红框标出的,工具箱--组件--SerialPort,做.net串口通讯,这是必备控件 第二步 设置SerialPort控件属性 用C#向串口发送数据没什么特别的,就是调用SerialPort的Write方法往串口写数据就行 但是从串口那里接收数据的方式就比较特别了 首先,需要在代码里

  • C#基于WinForm实现串口通讯

    串口通讯是一种计算机常用的数据传输方式. 程序运行如下: 首先,检查计算机的串口,并获取所有串口信息. private void CheckPort()//检查串口是否可用         {             myLog(2, "检测串口开始!");  //log记录函数             comboBox1.Items.Clear();//清除控件中的当前值                      string[] a = SerialPort.GetPortName

  • .NET Core使用flyfire.CustomSerialPort实现Windows/Linux跨平台串口通讯

    1,前言 开发环境:在 Visual Studio 2017,.NET Core 2.x 串口通讯用于设备之间,传递数据,物联网设备中广泛使用串口方式连接通讯,物联网通讯协议 :Modbus 协议 ASCII.RTU.TCP模式是应用层的协议,与通讯方式无关. 笔者现在实现的是 串口通信,实现后,可以在上层加上 Modbus 协议,笔者的另一篇文章即是在串口上实现 Modbus 协议,计算中心向物联网设备发送消息,要求设备响应,传送设备信息.检测状态等. 本文是 串口通讯 的实现. 2,安装虚拟

  • 浅谈linux下的串口通讯开发

    串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

  • 在windows下使用python进行串口通讯的方法

    Windows版本下的python并没有内置串口通讯的pyserial的库,所以需要自己下载.参照了网上的教程,有许多用的pip的安装方式,但是试了几个都没有用,所以想到用GitHub下载库文件,步骤分为: 1.在Github下载python-serial的库 https://github.com/pyserial/pyserial 2.下载完成后解压压缩包,找到serial文件夹,并找到python的安装位置(右击IDLE,然后查看python安装位置).我的地址为:C:\Users\NI Y

  • Java使用开源Rxtx实现串口通讯

    本文实例为大家分享了Java使用开源Rxtx实现串口通讯的具体代码,供大家参考,具体内容如下 使用方法: windows平台: 1.把rxtxParallel.dll.rxtxSerial.dll拷贝到:C:\WINDOWS\system32下. 2.如果是在开发的时候(JDK),需要把RXTXcomm.jar.rxtxParallel.dll.rxtxSerial.dll拷贝到..\jre...\lib\ext下:如:D:\Program Files\Java\jre1.6.0_02\lib\

  • Python 实现Serial 与STM32J进行串口通讯

    Python果然是一款非常简明的语言,做东西非常流畅,今天又尝试了一下用Serial做了一个控制台的串口通讯,我用的下位机是STM32F103,搞了一个多小时就成功了,可见Python的能力之强. 说明几点注意,一是Python在windows下的串口号可以用COM来标注,此时序号从1开始,如果自己单独指定序号,则是从0开始. 另外,如果下位机串口通讯设定的非常简单的话,在Python中只需要设定好串口号和波特率即可,其余的均设为默认值.一般来说在单片机或者是嵌入式系统中的串口通讯基本都不需要设

  • c#基于winform制作音乐播放器

    前言:项目是c#的winform 写的,使用的播放器是基于AxWindowsMediaPlayer. AxWindowsMediaPlayer的方法 1 首先新建一个页面 如图所示: 图片左侧是列表 使用listview 右侧是背景图片.图片框框的地方是后面可以实现的,+和-按钮分别代表添加文件和删除文件 还有就是控制播放的顺序.下面的分别是修改歌词的字体 和展示/隐藏 2 新建一个透明的歌词页面[窗体] 3 新建一个半透明的页面[窗体] 4 业务代码 using System; using S

随机推荐