首页 > 其他分享 >《串口篇》实现串口通信

《串口篇》实现串口通信

时间:2023-08-21 10:22:36浏览次数:37  
标签:实现 sp1 串口 Enabled 通信 SerialPort Error Text

实现串口通信

参考链接:jb51.net/article/237854.htm

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

基本概念

image

前端效果

使用winform
image

代码实现如下

点击查看代码
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");
}
 
}
 
}
}

测试运行结果如下

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

image

串口运行结果如下:

image

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

关于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 值写入输出缓冲区。

标签:实现,sp1,串口,Enabled,通信,SerialPort,Error,Text
From: https://www.cnblogs.com/fusio/p/17645298.html

相关文章

  • CSS 实现一个带弧边的区域
    一、需求描述在移动端的开发中,经常遇到下图这样的弧边设计弧边其实有很多方案,但像上图这样的情况更适合用border实现,因为这样更方便封装为组件 二、初步实现可以将页面顶部的区域看做一个大圆与页面的交集,基于这个思路就能开发出一个基本的html结构<body><divcl......
  • 【算法】用c#实现自定义字符串编码及围栏解码方法
    编写一个函数/方法,它接受2个参数、一个字符串和轨道数,并返回ENCODED字符串。编写第二个函数/方法,它接受2个参数、一个编码字符串和轨道数,并返回DECODED字符串。然后使用围栏密码对其进行解码。这种密码用于通过将每个字符沿着一组“竖状轨道”依次放在对角线上来对字符串进行编......
  • 数字实战:汉威国际广场停车场全新升级!智能化水平提升实现无人值守!
    汉威国际广场被誉为北京城的“城中之城”,是北京“新一代”地标性建筑。自2015年一区建成投入使用至今,汉威国际广场已拥有由汉威国际商城、汉威国际写字楼、汉威国际公寓及汉威国际大酒店四个业务部分组成的4个区28栋5A级写字楼,并凭借高品质的办公环境、优越的地理位置、丰富的商业......
  • Java 基于Hutool实现DES加解密
    POM.XML配置<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ma......
  • Python实现Windows下的视频壁纸
    importsysimportwin32guiimportsubprocessimporttimedefpretreatmentHandle():hwnd=win32gui.FindWindow("Progman","ProgramManager")workerW1=Nonewhile1:workerW1=win32gui.FindWindowEx(None,workerW1......
  • 分布式共识算法之Raft设计与实现
    如何理解分布式共识?多个参与者针对某一件事达成完全一致:一件事,一个结论已达成一致的结论,不可推翻有哪些分布式共识算法?Paxos:被认为是分布式共识算法的根本,其他都是其变种,但是Paxos论文中只给出了单个提案的过程,并没有给出复制状态机中需要的multi-paxos的相关细节......
  • 日志异步工作器的实现
    日志异步工作器的实现/*实现异步工作器*/#ifndef__M_LOOPER_H__#define__M_LOOPER_H__#include<mutex>#include<thread>#include<condition_variable>//条件变量#include"buffer.hpp"#include<functional>#include<memory>namespacen......
  • 产品经理如何利用KPI指标实现最佳产品性能
     令人惊叹的产品KPI指标不仅意味着更多收入,而且还表明你了解你的产品。但作为产品经理,有时候会发现自己挣扎,要确定如何有效地利用KPI指标识别产品的表现。获得真正的洞察力,并将它们转换为可操作的见解,并不容易。本文将深入探讨产品经理如何有效地利用KPI指标,以便更真实度量产品......
  • 自动柯里化函数的实现
    JavaScript柯里化柯里化也是属于函数式编程里面一个非常重要的概念。我们先来看一下维基百科的解释:口在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化;口是把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新......
  • 模拟实现简单的list
    这篇博客主要是关于使用模板实现list的模拟。什么是list:list是一种序列式容器,可以在常数时间内在任意位置进行插入和删除操作,并且支持前后双向迭代。list的底层是双向链表结构,每个元素存储在独立的节点中,节点通过指针指向前一个元素和后一个元素。list与forward_list非常相似,最主......