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

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

服务器之家 - 编程语言 - C# - c# 实现简单的串口通讯

c# 实现简单的串口通讯

2022-11-07 13:17月井石 C#

这篇文章主要介绍了c# 如何实现简单的串口通讯,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

本文提供一个用C#实现串口通讯实例,亲自编写,亲测可用!

开发环境:

VS2008+.net FrameWork3.5(实际上2.0应该也可以)

第一步

创建一个WinForm窗体,拉入一些界面元素

c# 实现简单的串口通讯

重点就是,图中用红框标出的,工具箱——组件——SerialPort,做.net串口通讯,这是必备控件

第二步

设置SerialPort控件属性

用C#向串口发送数据没什么特别的,就是调用SerialPort的Write方法往串口写数据就行

但是从串口那里接收数据的方式就比较特别了

首先,需要在代码里声明一个特别的事件函数

?
1
2
3
4
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  {
   this.Invoke(new EventHandler(UpdateUIText));
  }

此函数是用来绑定到SerialPort控件的DataReceived事件

c# 实现简单的串口通讯

顾名思义,这个事件就是在接收到串口返回的数据时触发,里面就一句代码

对这句代码有兴趣的可以私下再去研究,这里就不赘述了

总之,这句代码的用途就是用来调动另一个函数,对界面UI元素的值进行更新(当然你也可以在里面执行其他操作)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void UpdateUIText(object s, EventArgs e)
  {
   try
   {
    //必须要阻塞线程一段时间,以免在交易超时的情况下,由于read太快导致读取不完整
    System.Threading.Thread.Sleep(500);
    string txt = serialPort.ReadExisting();
    txt_Received.Text = txt;
   }
   catch (Exception ex)
   {
    MessageBox.Show(ex.Message.ToString());
   }  
  }

第三步

开始写逻辑代码,废话不多说,直接贴上来

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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;
 
namespace WinForm串口通讯
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
             
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            if (ports.Length == 0)
            {
                MessageBox.Show("本机没有串口!");
            }
            Array.Sort(ports);
            serialPort.PortName = ports[0];//串口号COM3
            serialPort.BaudRate = 115200;//波特率
            serialPort.DataBits = 8;//数据位
            serialPort.StopBits = System.IO.Ports.StopBits.One;//停止位
            serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解决接收中文乱码的问题
 
            // 打开串口
            try
            {
                serialPort.Open();
            }
            catch (Exception ex)
            {
                //捕获到异常信息,创建一个新的comm对象,之前的不能用了。  
                serialPort = new System.IO.Ports.SerialPort();
                //将异常信息传递给用户。  
                MessageBox.Show(ex.Message);
                return;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {          
            string msgOrder = txt_Msg.Text;
            //MessageBox.Show(msgOrder);
            serialPort.Write(msgOrder);           
        }
 
 
        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            this.Invoke(new EventHandler(UpdateUIText));
        }
 
        private void UpdateUIText(object s, EventArgs e)
        {
            try
            {
                //必须要阻塞线程一段时间,以免在交易超时的情况下,由于read太快导致读取不完整
                System.Threading.Thread.Sleep(500);
                string txt = serialPort.ReadExisting();
                txt_Received.Text = txt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
             
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (serialPort != null && serialPort.IsOpen)
                {
                    serialPort.Close();
                    serialPort.Dispose();
                }
            }
            catch (Exception ex)
            {
                //将异常信息传递给用户。  
                MessageBox.Show(ex.Message);
                return;
            }
        }
 
         
    }
}

至此,一个简单完整的串口通讯就完成了,希望对你们有所帮助

以上就是c# 实现简单的串口通讯的详细内容,更多关于c# 串口通讯的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/mooncher/p/6848316.html

延伸 · 阅读

精彩推荐
  • C#基于Json序列化和反序列化通用的封装完整代码

    基于Json序列化和反序列化通用的封装完整代码

    JSON 是存储和交换文本信息的语法。类似 XML。JSON 比 XML 更小、更快,更易解析。下面通过实例代码给大家分享Json序列化和反序列化通用的封装,需要的的...

    LowKeyC4632022-01-17
  • C#C#中如何使用 XmlReader 读取XML文件

    C#中如何使用 XmlReader 读取XML文件

    本文介绍了C#中使用XmlReader,只读、向前、循环读取XML节点的方法,并为我们列出、XmlReader类的方法、属性、枚举等成员,希望对大家学习有所帮助。...

    秦风10222021-11-22
  • C#C#调用AForge实现摄像头录像的示例代码

    C#调用AForge实现摄像头录像的示例代码

    这篇文章主要介绍了C#调用AForge实现摄像头录像的示例代码,非常具有实用价值,需要的朋友可以参考下...

    asml11492022-01-22
  • C#详解C# 代码占用的空间

    详解C# 代码占用的空间

    这篇文章主要介绍了C# 代码占用的空间的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    lindexi9012022-02-20
  • C#C#中new的用法及与override的区别分析

    C#中new的用法及与override的区别分析

    这篇文章主要介绍了C#中new的用法,及与override的区别,需要的朋友可以参考下...

    C#教程网10772022-01-06
  • C#C# double类型变量比较分析

    C# double类型变量比较分析

    这篇文章主要介绍了C# double类型变量比较分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    川master9712022-10-21
  • C#C# 当前系统时间获取及时间格式详解

    C# 当前系统时间获取及时间格式详解

    这篇文章主要介绍了C# 当前系统时间获取及时间格式详解的相关资料,这里提供代码实例,帮助大家学习参考,需要的朋友可以参考下...

    C#教程网4912021-12-14
  • C#c# 类型的字段和方法设计建议

    c# 类型的字段和方法设计建议

    这篇文章主要介绍了c# 字段和方法设计建议,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...

    一只独行的猿8932022-10-17