基于C#实现串口通信

本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下

1.基本概念

2.前端winForm布局如下(仅仅为了实现功能,布局略丑)

3.代码实现如下

namespace SerialPortTest
  {
      public partial class Form1 : Form
      {
          SerialPort sp1 = new SerialPort();
          public Form1()
          {
              InitializeComponent();
          }
  
          private void Form1_Load(object sender, EventArgs e)
          {
        //分别对应前端的波特率、数字位、校验位、停止位
              cbBaudRate.SelectedIndex = 0;
              cbDataBits.SelectedIndex = 0;
              cbCheck.SelectedIndex = 0;
              cbStop.SelectedIndex = 0;
  
              string[] strCom = SerialPort.GetPortNames();
              if (strCom == null)
              {
                  MessageBox.Show("本机没有串口!", "Error");
                  return;
              }
              //GetPortNames()方法:获取当前计算机的串行端口名的数组
              foreach (string com in System.IO.Ports.SerialPort.GetPortNames())
              {
                  cbCom.Items.Add(com);
              }
  
              cbCom.SelectedIndex = 0;
              sp1.BaudRate = 9600;
              Control.CheckForIllegalCrossThreadCalls = false;
              sp1.DataReceived += Sp1_DataReceived;
                           
              sp1.DtrEnable = true;//获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号。
              sp1.RtsEnable = true;//获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号
              //设置数据读取超时为1秒
              sp1.ReadTimeout = 1000;
  
              sp1.Close();
          }
  
          private void Sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
          {
              if (sp1.IsOpen)     //判断是否打开串口
              {
                  //输出当前时间
                  DateTime dt = DateTime.Now;
                  txtReceived.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
                  try
                  {
                      Byte[] receivedData = new Byte[sp1.BytesToRead];        //创建接收字节数组
                      sp1.Read(receivedData, 0, receivedData.Length);         //读取数据
                      AddContent(new UTF8Encoding().GetString(receivedData));//用万能的UTF8可以传输中文不会乱码
                  }
                 catch (System.Exception ex)
                  {
                      MessageBox.Show(ex.Message, "出错提示!!!!!");
                      txtSendStr.Text = "";
                  }
              }
              else
              {
                  MessageBox.Show("请打开某个串口", "错误提示");
              }
          }
  
          //将接受到的内容显示出来
          private void AddContent(string content)
          {
              this.BeginInvoke(new MethodInvoker(delegate
              {
                  txtReceived.AppendText(content);
                  txtReceived.AppendText("\r\n");
                  //记录收到的字符个数
                  lblRevCount.Text = (int.Parse(lblRevCount.Text) + content.Length).ToString();
              }));
          }
  
          private void btnOpen_Click(object sender, EventArgs e)
          {
              //serialPort1.IsOpen
              if (!sp1.IsOpen)
              {
                  try
                  {
                      //设置串口号
                      string serialName = cbCom.SelectedItem.ToString();
                      sp1.PortName = serialName;
  
                      //设置各“串口设置”
                      string strBaudRate = cbBaudRate.Text;
                      string strDateBits = cbDataBits.Text;
                      string strStopBits = cbStop.Text;
                      Int32 iBaudRate = Convert.ToInt32(strBaudRate);
                      Int32 iDateBits = Convert.ToInt32(strDateBits);
 
                     sp1.BaudRate = iBaudRate;       //波特率
                     sp1.DataBits = iDateBits;       //数据位
                     switch (cbStop.Text)            //停止位
                     {
                         case "1":
                             sp1.StopBits = StopBits.One;
                             break;
                         case "1.5":
                             sp1.StopBits = StopBits.OnePointFive;
                             break;
                         case "2":
                             sp1.StopBits = StopBits.Two;
                             break;
                         default:
                             MessageBox.Show("Error:参数不正确!", "Error");
                             break;
                     }
                     switch (cbCheck.Text)             //校验位
                     {
                         case "无":
                             sp1.Parity = Parity.None;
                             break;
                         case "奇校验":
                             sp1.Parity = Parity.Odd;
                             break;
                         case "偶校验":
                             sp1.Parity = Parity.Even;
                             break;
                         default:
                             MessageBox.Show("Error:参数不正确!", "Error");
                             break;
                     }
 
                     if (sp1.IsOpen == true)//如果打开状态,则先关闭一下
                     {
                         sp1.Close();
                     }
 
                     //设置必要控件不可用
                     cbCom.Enabled = false;
                     cbBaudRate.Enabled = false;
                     cbDataBits.Enabled = false;
                     cbStop.Enabled = false;
                     cbCheck.Enabled = false;
                     sp1.Open();     //打开串口
                     btnOpen.Text = "关闭串口";
                 }
                 catch (System.Exception ex)
                 {
                     MessageBox.Show("Error:" + ex.Message, "Error");
                     return;
                 }
             }
             else
             {
                 //恢复控件功能
                 //设置必要控件不可用
                 cbCom.Enabled = true;
                 cbBaudRate.Enabled = true;
                 cbDataBits.Enabled = true;
                 cbStop.Enabled = true;
                 cbCheck.Enabled = true;
                 sp1.Close();                    //关闭串口
                 btnOpen.Text = "打开串口";
             }
         }
 
         private void btnSend_Click(object sender, EventArgs e)
         {
             byte[] sendData = null;
             if (!sp1.IsOpen) //如果没打开
             {
                 MessageBox.Show("请先打开串口!", "Error");
                 return;
             }
             String strSend = txtSendStr.Text;
             try
             {
                 sendData = Encoding.UTF8.GetBytes(txtSendStr.Text.Trim());
                //sp1.WriteLine(txtSendStr.Text);    //写入数据
                 sp1.Write(sendData, 0, sendData.Length);
              }
              catch (Exception ex)
              {
                  MessageBox.Show("Error:" + ex.Message, "Error");
}
 
}
 
}
}

4.测试运行结果如下

在自己同一台电脑上测试,需要先用Configure Virtual Serial Port Driver建立两个虚拟串口,如下

串口运行结果如下:

上述两窗体通信时要选择同一波特率,不然收发数据会失败

关于C# serialport的一些说明:

SerialPort() :如果未指定,则此构造函数使用默认属性值。 例如, DataBits 属性默认值为 8, Parity 属性默认为 None 枚举值,
StopBits 属性默认值为 1,默认端口名为 COM1。

public static string[] GetPortNames() :获取当前计算机的串行端口名的数组

SerialPort.Read 方法 (Byte[], Int32, Int32) :从 SerialPort 输入缓冲区读取一些字节并将那些字节写入字节数组中指定的偏移量处

SerialPort.ReadLine 方法 () :一直读取到输入缓冲区中的 NewLine 值

SerialPort.Write 方法 (Byte[], Int32, Int32) : 使用缓冲区中的数据将指定数量的字节写入串行端口

SerialPort.WriteLine 方法 (String) : 将指定的字符串和 NewLine 值写入输出缓冲区。

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

(0)

相关推荐

  • C#中的串口通信SerialPort详解

    今天这篇文章带大家学习下C#中的串口通讯.在日常的开发工作中,如果工作内容是CS方向的同学应该很容易接触到串口通讯方面的业务需求.那么也就很容易想到C#中SerialPort类,它就是专门来处理串口通讯相关的. 了解什么是串口通讯 串口通讯是指外设和计算机间通过数据信号线,地线,控制线等,按位进行传输数据的一种通讯方式. 这种通讯方式使用的数据线少,在远距离通信中可以节约成本,但其传输速度比并行通讯慢. 串口是计算机上一种非常通用的设备通讯协议.大多数计算机包含两个基于RS-232的串口. 串口

  • C#串口通信模块使用方法示例

    C#串口模块的使用.使用VS .net框架下WinForm程序应用开发. C#开发的串口通信小工具. 相比于QT添加的串口类,WinForm是通过组件的形式将串口加入到程序中.. 在创建完windows窗体之后,添加组件类,就可以将串口加入到其中. 然后就需要写数据成员,初始化和方法,实现串口的读写功能. 串口类数据成员 SerialPort SComm; // 使用构造函数取串口控件 TextBox MsgRc; // 接收数据成员 //构造函数初始化 public SerialComm(Se

  • C#串口通信程序实例详解

    创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类. 创建C#串口通信程序之创建SerialPort 对象 通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程. 我们将要用到的SerialPort 类的方法: ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULLWriteLine(string):写入输出缓冲Open():打开一个新的串口连接Close():关闭 复制代码 代码如下: SerialP

  • C#串口通信工具类的封装

    本文实例为大家分享了C#串口通信工具类的封装代码,供大家参考,具体内容如下  1.SerialPortHelper串口工具类封装 using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers;   namespace public.Util {

  • C#串口通信实现方法

    本文实例讲述了C#串口通信实现方法.分享给大家供大家参考.具体方法如下: 通过COM1发送数据,COM2接收数据.当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据.这样可以确保每次发送的数据都可以被正确接收. 代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

  • 基于Java编写串口通信工具

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://xiazai.jb51

  • 基于C#实现串口通信

    本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下 1.基本概念 2.前端winForm布局如下(仅仅为了实现功能,布局略丑) 3.代码实现如下 namespace SerialPortTest   {       public partial class Form1 : Form       {           SerialPort sp1 = new SerialPort();           public Form1()           {        

  • Android串口通信之串口读写实例

    在Android串口通信:基本知识梳理的基础上,我结合我项目中使用串口的实例,进行总结: Android使用jni直接进行串口设备的读写网上已经有开源项目了,本文是基于网上的开源项目在实际项目中的使用做的调整和优化: Google串口开源项目 下面是我项目中的相关代码及介绍: 1.SerialPort.cpp /* * Copyright 2009 Cedric Priscal * * Licensed under the Apache License, Version 2.0 (the "Li

  • Android串口通信封装之OkUSB的示例代码

    本文介绍了Android串口通信封装之OkUSB的示例代码,分享给大家.具体如下: Github传送门:OkUSB OkUSB 一个简洁的Android串口通信框架. 功能简介 支持设置波特率 支持设置数据位 支持设置停止位 支持设置校验位 支持DTS和RTS 支持串口连接状态监听 用法简介 Gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile '

  • Android 串口通信编程及串口协议分析

    Android 串口通信编程:嵌入式编程和可穿戴设备及智能设备都会用到串口,这里就带大家分析下, 一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发. 1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni: 2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式: 3.  n,8,1,没得选: 4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进

  • 使用Java实现串口通信

    1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611343 效果图如下: 2.RXTXcomm Java串口通信依赖的jar包RXTXcomm.jar 下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611334 内含32位与64位版本 使用方法: 拷贝 RXTXcomm.jar 到 JAVA_HO

  • java 串口通信详细及简单实例

    java 实现串口通信 最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳.java也可以操作硬件? 后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便. 特拿出来和大家一起分享一下. 准备工作: 首先到SUN官网下载一个zip包:javacomm20-win32.zip 其中重要的有这几个文件: win32com.dll comm.jar javax.comm.properties 按照说明配置好环境,如下: 将win32com.dll复制到<J

随机推荐