c#串口程序_c#串口通信程序 - CSDN
精华内容
参与话题
  • C# 串口通信 小白(附源码)

    万次阅读 多人点赞 2019-03-26 14:56:51
    实习刚接触C#,学长让了解一下串口通信,在网上看了很多教程后, 用vspd提供虚拟串口,使用vs2017写C# 串口调试小工具 VSPD虚拟串口工具 密码:ag5f 源码 密码:8ubn using System; using System....

    实习刚接触C#,学长让了解一下串口通信,在网上看了很多教程后,

    用vspd提供虚拟串口,使用vs2017写C# 串口调试小工具

    VSPD虚拟串口工具         密码:ag5f

    源码       密码:8ubn

     
    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;
    
    namespace ChuanKou2
    {
        public partial class Form1 : Form
        {
            SerialPort sp = null;   //声明串口类
            bool isOpen = false;    //打开串口标志
            bool isSetProperty = false; //属性设置标志
            bool isHex = false;     //十六进制显示标志位
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.MaximumSize = this.Size;
                this.MinimumSize = this.Size;
                this.MaximizeBox = false;
                for (int i=0;i<10;i++)
                {
                    cbxCOMPort.Items.Add("COM" + (i + 1).ToString());
                }
            }
    
            private void btnCheckCOM_Click(object sender, EventArgs e)  //检测有哪串口
            {
                bool comExistence = false;  //是否有可用的串口
                cbxCOMPort.Items.Clear();   //清除当前串口号中的所有串口名称
                for(int i=0;i<10;i++)
                {
                    try
                    {
                        SerialPort sp = new SerialPort("COM" + (i + 1).ToString());
                        sp.Open();
                        sp.Close();
                        cbxCOMPort.Items.Add("COM" + (i + 1).ToString());
                        comExistence = true;
                    }
                    catch (Exception)
                    {
                        continue;
                    }
                }
                if (comExistence)
                {
                    cbxCOMPort.SelectedIndex = 0;//使ListBox显示第一个添加的索引
                }
                else
                {
                    MessageBox.Show("没有找到可用串口!","错误提示");
                }
            }
    
            private bool CheckPortSetting()     //串口是否设置
            {
                if (cbxCOMPort.Text.Trim() == "") return false;
                if (cbxBaudRate.Text.Trim() == "") return false;
                if (cbxDataBits.Text.Trim() == "") return false;
                if (cbxParitv.Text.Trim() == "") return false;
                if (cbxStopBits.Text.Trim() == "") return false;
                return true;
            }
            private bool CheckSendData()
            {
                if (tbxSendData.Text.Trim() == "") return false;
                return true;
            }
    
            private void SetPortProPerty()      //设置串口属性
            {
                sp = new SerialPort();
    
                sp.PortName = cbxCOMPort.Text.Trim();       //串口名
    
                sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim());//波特率
    
                float f = Convert.ToSingle(cbxStopBits.Text.Trim());//停止位
                if (f == 0)
                {
                    sp.StopBits = StopBits.None;
                }
                else if (f == 1.5)
                {
                    sp.StopBits = StopBits.OnePointFive;
                }
                else if (f == 1)
                {
                    sp.StopBits = StopBits.One;
                }
                else if (f == 2)
                {
                    sp.StopBits = StopBits.Two;
                }
                else
                {
                    sp.StopBits = StopBits.One;
                }
    
                sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim());//数据位
    
                string s = cbxParitv.Text.Trim();       //校验位
                if (s.CompareTo("无") == 0)
                {
                    sp.Parity = Parity.None;
                }
                else if (s.CompareTo("奇校验") == 0)
                {
                    sp.Parity = Parity.Odd;
                }
                else if (s.CompareTo("偶校验") == 0)
                {
                    sp.Parity = Parity.Even;
                }
                else
                {
                    sp.Parity = Parity.None;
                }
    
                sp.ReadTimeout = -1;         //设置超时读取时间
                sp.RtsEnable = true;
    
                //定义DataReceived事件,当串口收到数据后触发事件
                sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
                if (rbnHex.Checked)
                {
                    isHex = true;
                }
                else
                {
                    isHex = false;
                }
    
                void sp_DataReceived(object sender,SerialDataReceivedEventArgs e)
                {
                    System.Threading.Thread.Sleep(100);     //延时100ms等待接收数据
    
                    //this.Invoke  跨线程访问ui的方法
                    this.Invoke((EventHandler)(delegate
                    {
                        if (isHex == false)
                        {
                            tbxRecvData.Text += sp.ReadLine();
                        }
                        else
                        {
                            Byte[] ReceivedData = new Byte[sp.BytesToRead];
                            sp.Read(ReceivedData, 0, ReceivedData.Length);
                            String RecvDataText = null;
                            for(int i = 0; i < ReceivedData.Length - 1; i++)
                            {
                                RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + "");
                            }
                            tbxRecvData.Text += RecvDataText;
                        }
                        sp.DiscardInBuffer();       //丢弃接收缓冲区数据
                    }));
                }
            }
    
            private void btnSend_Click(object sender, EventArgs e)      //发送数据
            {
                if (isOpen)
                {
                    try
                    {
                        sp.WriteLine(tbxSendData.Text);
                    }
                    catch(Exception)
                    {
                        MessageBox.Show("发送数据时发生错误!", "错误提示");
                        return;
                    }
                }
                else
                {
                    MessageBox.Show("串口未打开", "错误提示");
                    return;
                }
                if (!CheckSendData())
                {
                    MessageBox.Show("请输入要发送的数据!", "错误提示");
                    return;
                }
            }
    
            private void btnOpenCom_Click(object sender, EventArgs e)
            {
                if (isOpen == false)
                {
                    if (!CheckPortSetting())        //检测串口设置
                    {
                        MessageBox.Show("串口未设置!", "错误提示");
                        return;
                    }
                    if (!isSetProperty)             //串口未设置则设置串口
                    {
                        SetPortProPerty();
                        isSetProperty = true;
                    }
                    try
                    {
                        sp.Open();
                        isOpen = true;
                        btnOpenCom.Text = "关闭串口";
                        //串口打开后则相关串口设置按钮便不可再用
                        cbxCOMPort.Enabled = false;
                        cbxBaudRate.Enabled = false;
                        cbxDataBits.Enabled = false;
                        cbxParitv.Enabled = false;
                        cbxStopBits.Enabled = false;
                        rbnChar.Enabled = false;
                        rbnHex.Enabled = false;
                    }
                    catch (Exception)
                    {
                        //打开串口失败后,相应标志位取消
                        isSetProperty = false;
                        isOpen = false;
                        MessageBox.Show("串口无效或已被占用!", "错误提示");
                    }
                }
                else
                {
                    try       //关闭串口       
                    {
                        sp.Close();
                        isOpen = false;
                        btnOpenCom.Text = "打开串口";
                        //关闭串口后,串口设置选项可以继续使用
                        cbxCOMPort.Enabled = true;
                        cbxBaudRate.Enabled = true;
                        cbxDataBits.Enabled = true;
                        cbxParitv.Enabled = true;
                        cbxStopBits.Enabled = true;
                        rbnChar.Enabled = true;
                        rbnHex.Enabled = true;
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("关闭串口时发生错误!", "错误提示");
                    }
                }
                
            }
            private void btnCleanData_Click(object sender, EventArgs e)
            {
                tbxRecvData.Text = "";
                tbxSendData.Text = "";
            }
        }
    }
    

     

    展开全文
  • C#串口编程(简单Demo)

    千次阅读 2016-10-13 10:25:29
    步骤一:下载安装串口模拟软件 软件名称:VSPM虚拟串口软件 下载地址:http://download.csdn.net/source/1232967 使用方法:1.安装以后工作模式选择为:VSPM运行在Server模式,支持Client模式设备  2.使用设备...

    步骤一:下载安装串口模拟软件

    软件名称:VSPM虚拟串口软件   下载地址:http://download.csdn.net/source/1232967

    使用方法:1.安装以后工作模式选择为:VSPM运行在Server模式,支持Client模式设备

                  2.使用设备探测器建立虚拟串口。(如果选择 建立默认的串口,软件就会自动帮你建立四个虚拟串口的)之后就是新增虚拟串口

                  3.串口选COM2,选择监听的IP地址:192.168.1.101 ,Client模式的设备尝试连接此端口:8099

                  4.选择此串口,再选择菜单栏:检查此设备连接,输入刚才新增时候选择的IP地址:192.168.1.101,刚才选择的端口:8099

                  5.点击重新连接,这个窗口没有什么反映:但是主窗口的串口最右边一栏:最后一次操作:显示串口:COM2没有打开。

    步骤二:串口编程

        1.建立winform项目,添加引用:Microsoft.VisualBasic

        2.界面设计

        (由于刚开始学串口通信不久,此Demo只模拟向串口发送数据和从串口接收数据)

     

     

                      C#串口编程(简单Demo)

     

    代码如下(此Demo用了serialProt控件,在控件的属性中进行了设置,如串口名、波特率等,虽然这样不 是很灵活,但是对于此Demo足够了)


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.IO.Ports;

    namespace SerialPort
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

     

            private void btn_open_Click(object sender, EventArgs e)
            {
                serialPort1.Open();
            }

            private void btn_close_Click(object sender, EventArgs e)
            {
                serialPort1.Close();
            }

            private void btn_send_Click(object sender, EventArgs e)
            {

                serialPort1.WriteLine(tb_send.Text);
                MessageBox.Show("数据发送成功", "系统提示");

            }

            private void btn_recv_Click(object sender, EventArgs e)
            {

                tb_recv.Text = serialPort1.ReadLine();
                MessageBox.Show("数据接收成功", "系统提示");


            }


        }
    }
    程序演示效果图:

    发送测试:

    1.首先打开连接,回到虚拟串口的“Telnet管理”窗口,点击“重新连接”则主窗口中“最后一次操作”列变成了“客户端已经建立TCP/IP连接”,此时表明已经和串口连接成功。

    2.然后输入要传的数据,点击发送数据,具体效果如下图:

     

    C#串口编程(简单Demo)

    C#串口编程(简单Demo)

    C#串口编程(简单Demo)
    可以看到在COM2口中已经接收到了发送过去的数据,程序运行成功.

     

    接收测试:

    在VSPM的“Telnet管理”窗口中直接输入数据并且回车即可,界面上是看不到的。执行“虚拟串口设置管理”-->“跟踪串口数据”,在弹出的窗口中可以看到数据,然后在测试程序中点击“接收数据”便可显示出收到的数据。

     

     

     

    C#串口编程(简单Demo)

     

    至此一个简单串口编程就完成了,后续仍在继续.....

    展开全文
  • c#串口通信(控制台程序)

    千次阅读 2018-12-18 15:26:59
    这是基于这个原因,我利用控制台程序讲解串口通信的大概流程,有什么不对的地方,请多多指教。   由于我在同一台PC机上测试并且我手头上没有串口线,不然我可以利用COM线把PC机上的COM1口和COM2口接起来的,...

    本文介绍的是利用控制台进行串口通信,网上有很多的文章都是使用winform来介绍串口通信,有些文章并没有给出winform的UI界面,这需要我们去猜那个控件对于的代码了,这相当于费脑子。这是基于这个原因,我利用控制台程序讲解串口通信的大概流程,有什么不对的地方,请多多指教。

     

    由于我在同一台PC机上测试并且我手头上没有串口线,不然我可以利用COM线把PC机上的COM1口和COM2口接起来的,没办法,故在编程之前,需要做的工作是,把PC机的COM1口2号引脚和3号引脚短接起来,用小铁丝短接即可,放心,不会电死人的,我试过了。

     

    由于一台PC机上的一个COM口只能绑定一个SerialPort类,故发送数据和接收数据的方法都封装在一个类中,废话少说,直接上完整的代码。

    using System;
    using System.Collections.Generic;
    using System.IO.Ports;              //需要引入的命名空间
    using System.Text;
    using System.Data;
    using System.Xml;
    
    
    namespace 串口通信发送和接收端
    {
        class Program
        {
            static void Main(string[] args)
            {
                SerialPortTest port = new SerialPortTest();
                port.Send();    //发送数据
                port.Close();   //关闭COM口
            }
           
        }
    
    
        public class SerialPortTest {
            SerialPort port;
            public SerialPortTest() {
                //指定COM1口,根据情况也可以指定COM2口
                port = new SerialPort("COM1");
                //指定波特率
                port.BaudRate = 9600;      
                try
                {
                    //打开COM口
                    port.Open();
                    //接收数据
                    Receieve();
                }
                catch (Exception)
                {
    
                    Console.WriteLine("打开COM口失败");
                } 
            }
    
            //接收数据
            private void Receieve() {
                //接收到数据就会触发port_DataReceived方法
                port.DataReceived += port_DataReceived;
            }
    
            void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //存储接收的字符串
                string strReceive = string.Empty;
                if (port != null)
                {
                    //读取接收到的字节长度
                    int n = port.BytesToRead;
                    //定义字节存储器数组
                    byte[] byteReceive = new byte[n];
                    //接收的字节存入字节存储器数组
                    port.Read(byteReceive, 0, n);
                    //把接收的的字节数组转成字符串
                    strReceive = Encoding.UTF8.GetString(byteReceive);
                    Console.WriteLine("接收到的数据是: " + strReceive);
                }
            }
    
            //发送数据
            public void Send() {
                //从控制台获取输入的字符串
                Console.WriteLine("请输入字符串:");
                string strRead = Console.ReadLine();
                //当输入不是q时,就一直等到输入并发送
                while (strRead != "q")
                {
                    //去掉输入字符串的前后空格
                    strRead = strRead.Trim();
                    if (!strRead.Equals(""))
                    {
                        //串口发送数据
                        port.WriteLine(strRead);
                    }
                    Console.WriteLine("请输入字符串:");
                    strRead = Console.ReadLine();
                }
    
            }
            //关闭COM口
            public void Close() { 
                if(port!=null&&port.IsOpen){
                    port.Close();
                    port.Dispose();
                }
            }
    
        }
    }

     其实最重要的是SerialPort类,先取得实例对象,然后指定要使用哪个COM口和通信的波特率,接着打开COM口,这时紧接着调用接收数据的方法,等待数据发来;再接着调用发送数据的方法,最后关闭COM口和释放资源。

     

     

    运行效果图如下:

    但是,如果发送的字符串过于长,方法void port_DataReceived(object sender, SerialDataReceivedEventArgs e)会自动调用多次,如下图:

    看到了吗?第三次发的是zhangxiangyu,但接收到的方法void port_DataReceived(object sender, SerialDataReceivedEventArgs e)自动调用两次,那么接收端如何获取完整的字符串呢?可以使用字符串拼接。

     

    好了,这就完成了,会的大牛勿喷!!!

     

    待补充:

    不单可以发送和接收字符串类型的数据,也可以发送和接收16进制的数据,有空再补充

     

    展开全文
  • C#编写串口程序(详细教程)

    千次阅读 2017-11-20 17:00:22
    https://wenku.baidu.com/view/8c6822f9a0116c175e0e4823.html
    https://wenku.baidu.com/view/8c6822f9a0116c175e0e4823.html
    
    展开全文
  • (至于再详细,自己百度)串口应用: 工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)...
  • C# 解决串口关闭时程序卡死问题

    千次阅读 2016-06-01 11:49:26
    关于串口关闭原理的资料:http://blog.csdn.net/wuyazhe/article/details/5606276 个人使用解决方案,将Invoke变为BeginInvoke。
  • C#串口通信程序SerialPort类

    万次阅读 2012-08-23 11:57:44
    VB没有学过,C++编写窗口应用程序接触也不多,暑假自己看了一些C#的书,也有了一些了解,所以就用C#写窗口应用程序,用来作上位PC机的串口通信程序。在写的过程中,主要参见了这篇博客http://blog.csdn.net/wuyaz
  • C#串口通信工具

    千次下载 热门讨论 2020-07-31 02:15:55
    博客对应的源文件代码,网址:http://blog.csdn.net/rehongchen/article/details/7851673 希望能对大家有所帮助。
  • 最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用...
  • 获取串口数据 (C#)

    千次阅读 2019-08-27 13:49:32
    1. 程序分享下载 点击 源码地址 http://blog.csdn.net/li0531/article/details/7975505#reply 2. 效果图 如下 3. 关键代码 private void buttonOpenClose_Click(object sender, EventArgs e) { tr....
  • 以前就对串口通信感点兴趣,serialport控件也看了几天,想做一个类似串口助手的东西,由于是刚看的C#,很多东西都不知道,网上的SerialPort控件要不讲得不清楚,要不代码错误;所以把自己看到的学到的供大家分享! ...
  • C#串口关闭SerialPort.Close()导致的卡死

    千次阅读 2019-02-19 17:14:46
    上面的链接给出了解决方案: 将Invoke变为BeginInvoke。 亲测可行。 下面还有一篇关于串口相关的介绍: C# 串口操作系列(2) – 入门篇,为什么我的串口程序在关闭串口时候会死锁 ? ...
  • 基于C# Winform的串口数据接收

    万次阅读 多人点赞 2016-12-29 13:35:42
    很多初学者在接触到串口编程时,不知道如何入手,找了网上一些文章,也是...今天,我分享一篇文章,讲述 基于C# Winform的串口数据接收编程(适合大概明白WinForm编程的同学,没有接触过WinForm的同学下载源码学习)
  • 刘凯 周云耀 武汉理工大学信息工程学院 武汉市...但在实际串口通信的应用中,在串口高波特率大信息量的数据通信时,会出现丢失数据的问题。此时如果只是增加串口类的缓存容量是不能根本解决问题的。本文就
  • c#处理基于Modbus协议的串口通讯程序

    万次阅读 2016-04-05 10:32:17
    下位机是Modbus协议,上位机是用c#写的串口通讯程序。 VS工具箱有自带的串口通讯控件;或者直接用代码SerialPort serialPort = new SerialPort();生成串口通讯的对象,但是记得要绑定收到数据的响应事件。(本文用...
  • c#串口自动扫描程序

    千次阅读 2017-08-31 20:54:17
    加入一个定时器控件,双击定时器控件,加入以下代码,就可以实现串口自动扫描功能  private void timer1_Tick(object sender, EventArgs e)  {   string[] t = SerialPort.GetPortNames();  if (cc != ...
  • C#控制台操作串口实例例程

    千次阅读 2014-07-21 12:36:48
    本文介绍一个C#控制台下操作串口的范例程序,基于多线程的一个接收
  • C# WPF 串口发送程序

    千次阅读 2018-06-05 21:39:48
    关于串口通信,之前用MFC架构的时候做过一次,也写了文章如下: MFC RS232串口通信 最近的项目因为对于界面的美化要求高了很多,用MFC架构去美化界面是件要命的事,因此转而用了WPF架构。其中用到的串口通信部分...
  • C#与Arduino通过串口通信来控制LED灯的状态
  • 目前在把串口通信的代码整合到团队的类库中(把串口通信与网口Soket通讯整合起来,后面只需要配置参数,就可实现网络与串口通讯的转换),故C#串口编程计划的最后一篇图文“C#通讯类库框架”还在完善中。做通信的...
1 2 3 4 5 ... 20
收藏数 7,900
精华内容 3,160
关键字:

c#串口程序