.NET 串口通信

原文:.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     }

  运行,测试,如图:


  
  

时间: 2024-09-20 18:47:20

.NET 串口通信的相关文章

我在写串口通信程序遇到的坑

我在做基于HC6800的51单片机上,写串口通信程序遇到了许多坑. 一个大坑:为什么HC6800上U转串口不能发送数据. 因为我们向HC6800烧程序都是使用图1所示的软件,所以我想当然地认为可以直接通过HC6800上的U转串进行串口通信,而我的同学信誓旦旦地告诉我可以.坑爹.并且这个软件好像也在提示可以用直接用U转串,进行串口通信(见图2).但是当我打开串口调试助手的时候(如图3),却发现单片机掉电了(如图4).其实HC6800上有另一个串口的,我们只要把连接图5黄框处串口.并且在图4中的6处

STM8L151G6串口通信问题

问题描述 STM8L151G6串口通信问题 哪位大神用过STM8低功耗的单片机 最近在用这个调到串口通信怎么也调不通了,谁有这个方面经验分享下.感激不尽,坐等回复 解决方案 http://www.pudn.com/downloads554/sourcecode/embedded/detail2285865.html

单片机读写内部的EEPROM怎么操作,串口通信我已经做好了?

问题描述 单片机读写内部的EEPROM怎么操作,串口通信我已经做好了? 我要从PC上把数据发给单片机,单片机接收到后存储到EEPROM,单片机读取EEPROM的数据发送到PC上,我看了手册.网上查过资料,做了好久,没 有实现,单片机是STC15F2K16S2,求指导 解决方案 你没有实现,是卡在什么地方了?PC 与单片机的串口通讯.还是 EEPROM 的读写呢? 解决方案二: 我是卡在了EEPROM的读写了,看了手册.百度过了,还是不能实现EEPROM的读写,我用的单片机是15F2S16S2,用

在php串口通信编程时,出现win_serial is not compiled into PHP

问题描述 在php串口通信编程时,出现win_serial is not compiled into PHP 最近想试试php的串口通信,我装的是phpstudy2014,我看了一下apache2.4和php5xx等系列都装在里面,于是下了个对应php版本的php_ser++.dll,并且放在了ext中,并在php.ini中添加了extension=php_ser++.dll,但用php designer8.0调试时,却出现了win_serial不能被编译成PHP,事关紧急,忘大神指导?????

在CB6下基于api函数编写串口通信程序简介

1-在C++ Builder 6.0下基于api函数编写串口通信程序简介: 在dos/win95/win98的年代,操作系统对串口是不保护的,也就是说将串口的的资源完全开放给用户,用户可以用直接操作硬件的函数(比如说TC2.0下的inport()和outport()函数) 跟串口直接打交道,这时候用户使用直接操作串口的函数怎样"折磨"串口都是没有问题的,操作系统根本就不管不问,对串口操作所造成的一切后果都是用户一个人承担的,这时候用户对串口具有高度自由的支配权:但是,这种情况好景不长,

C#结合串口通信类实现串口通信源代码

mycom是串口通信类.下面是串口通讯测试程序的源代码,将mycom类放在此项目中,可以实现简单的串口通信,希望读者能通过这个程序对串口通信过程有一个初步的了解: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; namesp

Win32下的几种串口通信编程

要完成串口通信, 在32位模式下, 一般说来有以下四种方法: 1.以文件方式打开串口: 这里使用的是Win32 API 函数, 所以无论在BCB或VC下都可以实现.具体的函数的意义可以参考Win32 API 的帮助.这里有一个易于使用的BCB下的类, 可以方便的使用串口. 下面给出简要说明: (1) 应用CreateFile() 来初始化串口 FhFileComm=CreateFile( FCommName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, //

.NET Compact Framework下的串口通信

在Wince和Windows Mobile下,很多设备以串口(Serial Port/Com Port)的方式提供访问接口,例如 可以通过串口访问GPS的receiver,从而接收NMEA Data. 在CF.NET2.0开始,MS把串口操作封装了到System.IO.Ports.SerialPort里面,大大简便了对串口的操 作,不再需要P/Invoke就可以直接操作串口. 下面展现两个串口通信类,一个负责发生,一个负责接收,两个类分别在不要的设备上运行. public class Recei

VisualBasic串口通信程序设计

1mscomm.vbx通信控件描述 mscomm.vbx通信控件可直接从vb的toolbox中加入窗体form,即可用其进行通信.若toolbox中无此控件,则用tools的customcontrols将mscomm.vbx从windows的system子目录中加入vb的toolbox中. 1.1通信方式 mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题 1.事件驱动.它与c/c 写windows软件时的窗口回调函数类似,是1种功能强大的处理问题的方法.在实际工作中,

zigbee学习之串口通信

纠错:U0DBUF发送缓冲区,但是我在中文手册手册上没有找的到这个寄存器,手册上只有U0BUF,U0BUF编译会出错, 我去查了下英文手册,才发现原来是翻译人员翻译错误了,只有U0DBUF,建议看英文手册. 串口通信: P_2 接收端 P_3发送端(单片机和电脑的电频不同,通过PL2303转换,这是针对zigbee模块的 ,想51单片机可以通过232,485来转换). TTL 输出:低电平小于0.8,高电平大于2.4 .TTL 输入:低电平小于1.2,高电平大于2 P_2和P_3可以复用到串口,