【.Net码农】.NET 串口通信
2015-08-26 17:23
555 查看
/article/5184595.html
串口通信,以前一直觉得神秘,没想到用起来却这么简单。当然,这样简单要归功于 .NET 对其操作的封装。
.NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据。只需要 new 一个对象,简单配置一下相关属性,就可以使用串口收发数据了。
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。
其中端口名称设置的是你通信使用的本地端口的名称,其它参数,一般默认。具体意思?关我毛事!和设备约定相同就行了。
所以,一般来说,使用串口的准备操作,就这么简单:
如果都使用的默认参数,还可以精简成这样:
当然,对硬件设备的操作需要在使用前后打开或关闭资源。SerialPort 类提供了 Open 和 Close 方法用来打开或半闭串口。
打开以后,就可以向端口读写数据了。
SerialPort 类提供了 Write 和 WriteLine 两个方法向串口发送数据。Write 发送一个 byte 数组,和一般的流操作类似;WriteLine 可以直接发送一个字符串。
SerialPort 类提供了 Read、ReadByte、ReadChar、ReadExisting、ReadLine 和 ReadTo 等方法可以从串口中读取数据。Read 可以把数据读取到一个 byte 数组;ReadByte 可以读取一个字节;ReadChar 可以读取一个字符;ReadExisting 可以读取当前可读取的所有数据;ReadLine 可以读取一行数据;ReadTo 这个我没用过。
当然如果没有数据,就读取不到了。我们可以使用 BytesToRead 属性获取可读取的数据长度,如果长度为 0,就说明串口中没有接收到数据。如果需要监听端口数据,就可以单独开一个线程反复读取。
除了使用反复读取来监听串口数据,还可以使用 SerialPort 类提供的 DataReceived 事件来监听串口中接收到的数据,当串口中有可读取的数据,系统会自动触发 DataReceived 事件处理程序。设置代码如下:
回调方法声明如下:
理论讲完了,下面写一个简单的 Demo 实验一下。
因为要验证收发数据,需要用到一个串口虚拟化的软件。该软件可以在 PC 上成对的虚拟串口,可以实现对 COM1 发的数据,COM2 中接收到。
环境搭建好以后,编写代码试着在单击按钮的时候,将文本框的内容写入 COM1,然后从 COM2 中读取,并使用对话框弹出来。
新建一个窗体,拖入一个文本框 textbox1 和一个按钮 button1,然后添加操作代码,如下:
运行,测试,如图:
![](http://images.cnitblog.com/blog/194626/201309/17133944-018515ce00794bb486b28aa30ab6ca8b.jpg)
分类:
.NET,
学习笔记
绿色通道:
好文要顶关注我
收藏该文与我联系
![](http://static.cnblogs.com/images/icon_weibo_24.png)
![](http://pic.cnblogs.com/face/u194626.jpg)
张浩华
关注 - 23
粉丝 - 115
+加关注
.NET 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头、输送线、称重机、贴标机等硬件。和各设备之间通信使用的是串口或网络(Socket)的方式。扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通信。串口通信,以前一直觉得神秘,没想到用起来却这么简单。当然,这样简单要归功于 .NET 对其操作的封装。
.NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据。只需要 new 一个对象,简单配置一下相关属性,就可以使用串口收发数据了。
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; //波特率,默认9600 com1.DataBits = 8; //数据位,默认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 方法用来打开或半闭串口。
打开以后,就可以向端口读写数据了。
SerialPort 类提供了 Write 和 WriteLine 两个方法向串口发送数据。Write 发送一个 byte 数组,和一般的流操作类似;WriteLine 可以直接发送一个字符串。
SerialPort 类提供了 Read、ReadByte、ReadChar、ReadExisting、ReadLine 和 ReadTo 等方法可以从串口中读取数据。Read 可以把数据读取到一个 byte 数组;ReadByte 可以读取一个字节;ReadChar 可以读取一个字符;ReadExisting 可以读取当前可读取的所有数据;ReadLine 可以读取一行数据;ReadTo 这个我没用过。
当然如果没有数据,就读取不到了。我们可以使用 BytesToRead 属性获取可读取的数据长度,如果长度为 0,就说明串口中没有接收到数据。如果需要监听端口数据,就可以单独开一个线程反复读取。
除了使用反复读取来监听串口数据,还可以使用 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 实验一下。
因为要验证收发数据,需要用到一个串口虚拟化的软件。该软件可以在 PC 上成对的虚拟串口,可以实现对 COM1 发的数据,COM2 中接收到。
环境搭建好以后,编写代码试着在单击按钮的时候,将文本框的内容写入 COM1,然后从 COM2 中读取,并使用对话框弹出来。
新建一个窗体,拖入一个文本框 textbox1 和一个按钮 button1,然后添加操作代码,如下:
public partial class Form1 : Form { System.IO.Ports.SerialPort COM2 = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { COM2 = new System.IO.Ports.SerialPort("COM2"); COM2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Com2_DataReceived); COM2.Open(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { COM2.Close(); COM2 = null; } private void button1_Click(object sender, EventArgs e) { System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1"); com1.Open(); com1.WriteLine(this.textBox1.Text); com1.Close(); } 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()); } }
运行,测试,如图:
![](http://images.cnitblog.com/blog/194626/201309/17133944-018515ce00794bb486b28aa30ab6ca8b.jpg)
分类:
.NET,
学习笔记
绿色通道:
好文要顶关注我
收藏该文与我联系
![](http://static.cnblogs.com/images/icon_weibo_24.png)
![](http://pic.cnblogs.com/face/u194626.jpg)
张浩华
关注 - 23
粉丝 - 115
+加关注
相关文章推荐
- 面试题9
- Block
- 初级程序员学习网址搜集(持续更新)
- 鞭策自己-大龄女程序员的第一篇博文
- 数据库知识总结---面试笔试
- 黑马程序员——java基础——抽象类和接口
- 【黑马程序员】Foundation框架(NSString)
- 中兴2015校园招聘笔试题 +部分 答案(自己做的)
- 腾讯面试--->绘制印章实现
- 机器学习算法面试—口述(6):数据的简化(PCA、SVD)
- 《招聘一个靠谱的iOS》面试题参考答案(下)
- 你应该认识的 12 位最有影响力的程序员
- 黑马程序员 多线程
- 面试题27二叉搜索树与双向链表
- Android程序员 ios开发之旅之遇见雨燕
- 自己来试着笔记(zhongjie)一下面试大题之一(String s = new String("xyz");创建了几个对象? )
- 四十条测试你是不是合格的PHP程序员
- 黑马程序员——Set接口
- 黑马程序员——List接口
- 黑马程序员——Java基础---泛型、集合框架工具类