.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。

  其中端口名称设置的是你通信使用的本地端口的名称,其它参数,一般默认。具体意思?关我毛事!和设备约定相同就行了。

  所以,一般来说,使用串口的准备操作,就这么简单:

1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort();
2             com1.PortName = "COM1";  //端口名称,默认COM1
3             com1.BaudRate = 9600;  //波特率,默认9600
4             com1.DataBits = 8;  //数据位,默认8
5             com1.StopBits = System.IO.Ports.StopBits.One;  //停止位,默认 System.IO.Ports.StopBits.One
6             com1.Parity = System.IO.Ports.Parity.None;  //奇偶校验,默认 System.IO.Ports.Parity.None

  如果都使用的默认参数,还可以精简成这样:

1             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 事件处理程序。设置代码如下:

1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
2             com1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Com1_DataReceived);

  回调方法声明如下:

1         private void Com1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
2         {
3
4         }

  理论讲完了,下面写一个简单的 Demo 实验一下。

  因为要验证收发数据,需要用到一个串口虚拟化的软件。该软件可以在 PC 上成对的虚拟串口,可以实现对 COM1 发的数据,COM2 中接收到。

  环境搭建好以后,编写代码试着在单击按钮的时候,将文本框的内容写入 COM1,然后从 COM2 中读取,并使用对话框弹出来。

  新建一个窗体,拖入一个文本框 textbox1 和一个按钮 button1,然后添加操作代码,如下:

 1     public partial class Form1 : Form
 2     {
 3         System.IO.Ports.SerialPort COM2 = null;
 4
 5         public Form1()
 6         {
 7             InitializeComponent();
 8         }
 9
10         private void Form1_Load(object sender, EventArgs e)
11         {
12             COM2 = new System.IO.Ports.SerialPort("COM2");
13             COM2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Com2_DataReceived);
14             COM2.Open();
15         }
16
17         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
18         {
19             COM2.Close();
20             COM2 = null;
21         }
22
23         private void button1_Click(object sender, EventArgs e)
24         {
25             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");
26             com1.Open();
27             com1.WriteLine(this.textBox1.Text);
28             com1.Close();
29         }
30
31         private void Com2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
32         {
33             System.IO.Ports.SerialPort com = (System.IO.Ports.SerialPort)sender;
34             MessageBox.Show(com.ReadExisting());
35         }
36     }

  运行,测试,如图:

具体位置:http://www.cnblogs.com/zhhh/p/3326083.html

调试工具,请下载:串口调试助手.exe。

时间: 2024-10-27 00:26:23

.NET 串口通信的相关文章

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目comm 注意:点击ok,然后next,这时候要将application type改成dialog base.接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish 4, 将新生成的项目的对话框默认dialog edit删去,如图 5,在对话框中加入两个st

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

51单片机之串口通信(一)

一.基础知识 1.串行通信和并行通信:目前用的比较多的是串行通信.串行通信优点是连接简单,传输距离远:缺点是传输速度慢. 2.串行通信:分为同步通信和异步通信:异步通信是指发送和接收设备利用各自的时钟控制数据的发送和接收. 3.串行通信的传输方向:单工,半双工,全双工. 4.波特率:每秒钟传输2进制代码的位数,如1个字节为10位,每秒传输240个字节,则波特率为10*240=2400bps,单位是bps: 5.RS-232C:25个管脚,我们用到的是PGND(保护接地).TXD(发送数据),RX

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

LabVIEW上位机与串口通信

渊源 大一的时候,学校开了门公共选修课,叫LabVIEW编程,当时的我当然还不知道LabVIEW是啥东东,但还是选了.上课的老师是机械学院的一个副教授,他给我们展示了好几个用LabVIEW做的项目,譬如油箱监控上位机等,已经不太记得了.后来随着学习单片机.ARM等的串口操作,有时候一个漂亮的上位机(尤其是能显示波形的上位机)在项目中给用户展示非常的有用.过了这么多年,虽然曾经也用LabVIEW写过简单的温度监控上位机,但这次再拿起LabVIEW又好像从头开始一样,语法几已忘记殆尽! 定义通信格式

Qt 串口通信

在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台   QextSerialPort QT C++ Win/Linux http://sourceforge.net/projects/qextserialport/files/ QSerialPort QT C++ QT5已经集成 libserial C++ Linux http://files.cnblogs.com/kyyblabla/libserial-0.5.2.gz.7z 以上串口通信类库通信过

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用 2010-07-08 22:20:31|  分类: 个人日记 |举报 |字号 订阅 2009-03-01 05:35 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一.本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在De

boost 串口通信

boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式,类似于完成端口,不过,可以针对不同IO对象) 2.构造一个boost::asio::serial_port,有两种方法: (一)boost::asio::serial_port m_serialPort(m_IoService, "COM1"); (二)boost::asio::serial_port m_serialPort(m_IoService); m_ser