串口通信(C#实践)
最近在做一个和智能硬件设备(数字焊接电源)通信的应用软件。和各设备之间通信使用的是串口或网络(Socket)的方式。
理论
串口通信,.NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据。只需要new一个对象,简单配置一下相关属性,就可以使用串口收发数据了。(或者直接从组件—SerialPort里面拖出来也可)
SerialPort 类常用的属性有 PortName、BaudRate、DataBits、StopBits、Parity 等。
PortName 是端口名称,如COM1、COM2等,默认COM1;
BaudRate 是波特率,默认 9600;
DataBits 是数据位,默认是 8;
StopBits 是停止位,默认是System.IO.Ports.StopBits.One;
Parity 设定奇偶校验,默认是System.IO.Ports.Parity.None。
其中端口名称设置的是你通信使用的本地端口的名称,其它参数,一般默认。
- System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort();
- com1.PortName = "COM1"; //端口名称,默认COM1
- com1.BaudRate = ; //波特率,默认9600
- com1.DataBits = ; //数据位,默认8
- com1.StopBits = System.IO.Ports.StopBits.One; //停止位,默认 System.IO.Ports.StopBits.One
- com1.Parity = System.IO.Ports.Parity.None; //奇偶校验,默认 System.IO.Ports.Parity.None
如果都使用的默认参数,还可以精简成这样:
- System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
当然,对硬件设备的操作需要在使用前后打开或关闭资源。SerialPort 类提供了 Open 和 Close 方法用来打开或半闭串口。
打开以后,就可以向端口读写数据了
(方法1) SerialPort 类提供了 Write 和 WriteLine 两个方法向串口发送数据。
Write 发送一个 byte 数组,和一般的流操作类似;
WriteLine 可以直接发送一个字符串。
SerialPort 类提供了 Read、ReadByte、ReadChar、ReadExisting、ReadLine 和 ReadTo 等方法可以从串口中读取数据。
Read 可以把数据读取到一个 byte 数组;
ReadByte 可以读取一个字节;
ReadChar 可以读取一个字符;
ReadExisting 可以读取当前可读取的所有数据;
ReadLine 可以读取一行数据。
当然如果没有数据,就读取不到了。我们可以使用 BytesToRead 属性获取可读取的数据长度,如果长度为 0,就说明串口中没有接收到数据。如果需要监听端口数据,就可以单独开一个线程反复读取。
(方法2) 除了使用反复读取来监听串口数据,还可以使用 SerialPort 类提供的 DataReceived 事件来监听串口中接收到的数据,当串口中有可读取的数据,系统会自动触发 DataReceived 事件处理程序。设置代码如下:
- System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
- com1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Com1_DataReceived);
- //回调方法声明如下:
- private void Com1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
- {
- }
实践
理论讲完了,下面写一个简单的Demo
因为要验证收发数据,需要用到一个串口虚拟化的软件(Virtual Serial Port )。该软件可以在 PC 上成对的虚拟串口,可以实现对 COM1 发的数据,COM2 中接收到。
环境搭建好以后,编写代码试着在单击按钮的时候,将文本框的内容写入 COM1,然后从 COM2 中读取,并使用对话框弹出来。
新建一个窗体,拖入一个文本框 textbox1 和一个按钮 button1,然后添加操作代码,如下:
- 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 NET_串口通信_模拟 //运行此程序,必须运行 "虚拟串口" 程序来配置COM1 COM2
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- System.IO.Ports.SerialPort com2 = null; //在COM1发送数据, 通过COM2来接收数据
- private void Form1_Load(object sender, EventArgs e)
- {
- //打开接收数据的 COM2端口
- com2 = new System.IO.Ports.SerialPort("COM2");
- com2.Encoding = Encoding.GetEncoding("GB2312");
- com2.DataReceived += com2_DataReceived; //当串口中 有可读取的数据,系统会自动 触发事件
- com2.Open();
- }
- private void com2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
- {
- System.IO.Ports.SerialPort com = (System.IO.Ports.SerialPort)sender;
- MessageBox.Show(com.ReadExisting ()); //获取 缓冲区内的 字节
- }
- private void button1_Click(object sender, EventArgs e)
- {
- //点击按钮 从COM1发送数据
- //System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
- //com1.Open();
- //com1.WriteLine(textBox1 .Text );
- //com1.Close();
- //直接用serialPort组件也可
- serialPort1.Encoding = Encoding.GetEncoding("GB2312");
- serialPort1.Open();
- serialPort1.WriteLine(textBox1 .Text );
- serialPort1.Close();
- }
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- com2.Close();
- com2 = null;
- }
- }
- }
串口通信(C#实践)的更多相关文章
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...
- Java串口通信具体解释
序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软 ...
- Java串口通信详细解释
前言 说到开源.恐怕非常少有人不挑大指称赞. 学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜. 然而开 ...
- C\C++串口通信编程的一点技术记录
新工作接的第一个活,要写一个配合设备调试的上位机程序. 除了MFC界面的部分,就是要处理几条命令. 串口通信部分代码借鉴的是这一篇文章:http://blog.sina.com.cn/s/blog_a ...
- .NET 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...
- BluetoothChat用于蓝牙串口通信的修改方法
本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...
- Win10 IoT C#开发 4 - UART 串口通信
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...
- 使用Java实现简单串口通信
最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...
- Java 串口通信
在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...
随机推荐
- Tomcat Connector 参数优化说明
默认参数 注: Connector 通常在%HOME_TOMCAT%/conf/servser.xml 文件内 # 正常参数 <Connector port=" protocol=&q ...
- 使用AutoIT检测已安装软件,并将结果保存在桌面
$file = "\adobe安装列表.txt" $regedit1 = "hklm64\SOFTWARE\Wow6432Node\Microsoft\Windows\C ...
- CVE补丁安全漏洞【学习笔记】
更新安卓系统的CVE补丁网站:https://www.cvedetails.com/vulnerability-list/vendor_id-1224/product_id-19997/version ...
- python django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct[转]
1.多表连接查询:当我知道这点的时候顿时觉得django太NX了. class A(models.Model): name = models.CharField(u'名称') clas ...
- spring security使用数据库验证的逻辑处理
前面做了多个示例,包括使用jdbc和hibernate两种方式访问数据库获取用户信息和权限信息,其中一些关键步骤如下: 我们在SecurityConfig中配置覆盖configure方法时候,可以 ...
- 洛谷P4311 士兵占领
题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...
- contos LAMP环境搭建
LINUX搭建LAMP笔记 .YUM:Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于R ...
- Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
转自:https://blog.csdn.net/linxingliang/article/details/52263763 spring boot 自学笔记(三) Redis集成—RedisTemp ...
- scala学习手记34 - trait方法的延迟绑定
trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...
- Kubernetes源码之旅:从kubectl到API Server
概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...