串口通信(C#实践)
来源:互联网 发布:网络舆情分析师培训 编辑:程序博客网 时间:2024/06/11 03:32
最近在做一个和智能硬件设备(数字焊接电源)通信的应用软件。和各设备之间通信使用的是串口或网络(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"; //端口名称,默认COM1com1.BaudRate = 9600; //波特率,默认9600com1.DataBits = 8; //数据位,默认8com1.StopBits = System.IO.Ports.StopBits.One; //停止位,默认 System.IO.Ports.StopBits.Onecom1.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#实践)
- C#串口通信笔记(二)
- C#串口通信
- C#实现串口通信
- C# Mscommm串口通信
- C#串口通信
- C#未完成----串口通信
- c#串口通信Develop
- C#串口通信
- C# SerialPort 串口通信
- C# 串口通信
- C#串口通信总结
- C# 串口通信、单片机
- C# 串口通信系列
- C# SerialPort 串口通信
- C# 串口通信
- c#串口通信
- C#串口通信、单片机
- [C++]LeetCode: 11 ZigZag Conversion
- win7双击可执行jar包配置
- Java and Mongodb 保存/读取java对象到/从mongodb
- makefile -make
- each() 和 list() 结合使用原理
- 串口通信(C#实践)
- 关于Lasso回归的一个例子
- C++学习与实践(三):类
- JavaScript学习 5.2.5 重排序方法
- Ajax学习(三)——XMLHttpRequest对象的五步使用法
- 第十一周项目四:特殊三位数
- 多线程总结
- TrustRank算法
- 正则表达式基础知识01