从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少量代码就完成串口的信息收发程序。本文将介绍如何在PC端用C# .Net 来开发串口应用程序。

  1. 串口硬件信号定义
    DB9 Connector 信号定义

  2. 串口端口号搜索
    一个最简单的办法:
string[] portList = System.IO.Ports.SerialPort.GetPortNames();
for (int i = 0; i < portList.Length; i++)
{string name = portList[i];comboBox.Items.Add(name);
}

还有一种通过调用API的方法来获取实现,可以获取详细的完整串口名称,对于USB-to-COM虚拟串口来说特别适用。

通过下面程序可以获取到与设备管理器中一样的名字,例如“Prolific USB-to-Serial Comm Port(COM34)”, 而上面的方法只能获取到“COM34”。

/// <summary>
/// 枚举win32 api
/// </summary>
public enum HardwareEnum
{// 硬件Win32_Processor, // CPU 处理器Win32_PhysicalMemory, // 物理内存条Win32_Keyboard, // 键盘Win32_PointingDevice, // 点输入设备,包括鼠标。Win32_FloppyDrive, // 软盘驱动器Win32_DiskDrive, // 硬盘驱动器Win32_CDROMDrive, // 光盘驱动器Win32_BaseBoard, // 主板Win32_BIOS, // BIOS 芯片Win32_ParallelPort, // 并口Win32_SerialPort, // 串口Win32_SerialPortConfiguration, // 串口配置Win32_SoundDevice, // 多媒体设置,一般指声卡。Win32_SystemSlot, // 主板插槽 (ISA & PCI & AGP)Win32_USBController, // USB 控制器Win32_NetworkAdapter, // 网络适配器Win32_NetworkAdapterConfiguration, // 网络适配器设置Win32_Printer, // 打印机Win32_PrinterConfiguration, // 打印机设置Win32_PrintJob, // 打印机任务Win32_TCPIPPrinterPort, // 打印机端口Win32_POTSModem, // MODEMWin32_POTSModemToSerialPort, // MODEM 端口Win32_DesktopMonitor, // 显示器Win32_DisplayConfiguration, // 显卡Win32_DisplayControllerConfiguration, // 显卡设置Win32_VideoController, // 显卡细节。Win32_VideoSettings, // 显卡支持的显示模式。// 操作系统Win32_TimeZone, // 时区Win32_SystemDriver, // 驱动程序Win32_DiskPartition, // 磁盘分区Win32_LogicalDisk, // 逻辑磁盘Win32_LogicalDiskToPartition, // 逻辑磁盘所在分区及始末位置。Win32_LogicalMemoryConfiguration, // 逻辑内存配置Win32_PageFile, // 系统页文件信息Win32_PageFileSetting, // 页文件设置Win32_BootConfiguration, // 系统启动配置Win32_ComputerSystem, // 计算机信息简要Win32_OperatingSystem, // 操作系统信息Win32_StartupCommand, // 系统自动启动程序Win32_Service, // 系统安装的服务Win32_Group, // 系统管理组Win32_GroupUser, // 系统组帐号Win32_UserAccount, // 用户帐号Win32_Process, // 系统进程Win32_Thread, // 系统线程Win32_Share, // 共享Win32_NetworkClient, // 已安装的网络客户端Win32_NetworkProtocol, // 已安装的网络协议Win32_PnPEntity,//all device
}/// <summary>
/// WMI取硬件信息
/// </summary>
/// <param name="hardType"></param>
/// <param name="propKey"></param>
/// <returns></returns>
public static string[] MulGetHardwareInfo(HardwareEnum hardType, string propKey)
{List<string> strs = new List<string>();try{using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + hardType)){var hardInfos = searcher.Get();foreach (var hardInfo in hardInfos){if (hardInfo.Properties[propKey].Value.ToString().Contains("COM")){strs.Add(hardInfo.Properties[propKey].Value.ToString());}}searcher.Dispose();}return strs.ToArray();}catch{return null;}finally{ strs = null; }
}//通过WMI获取COM端口
string[] portList = MulGetHardwareInfo(HardwareEnum.Win32_PnPEntity, "Name");
  1. 串口属性参数设置
    参见MSDN上的帮助文件,SerialPort类所包含的属性详见下表。
名称 说明
BaseStream

获取 Stream 对象的基础 SerialPort 对象。

BaudRate

获取或设置串行波特率。

BreakState

获取或设置中断信号状态。

BytesToRead

获取接收缓冲区中数据的字节数。

BytesToWrite

获取发送缓冲区中数据的字节数。

CanRaiseEvents

获取一个值,该值指示组件是否可以引发一个事件。(继承自 Component。)

CDHolding

获取端口的载波检测行的状态。

Container

获取 IContainer ,其中包含 Component。(继承自 Component。)

CtsHolding

获取“可以发送”行的状态。

DataBits

获取或设置每个字节的标准数据位长度。

DesignMode

获取一个值,该值指示是否 Component 当前处于设计模式。(继承自 Component。)

DiscardNull

获取或设置一个值,该值指示 null 字节在端口和接收缓冲区之间传输时是否被忽略。

DsrHolding

获取数据设置就绪 (DSR) 信号的状态。

DtrEnable

获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号。

Encoding

获取或设置传输前后文本转换的字节编码。

Events

获取的事件处理程序附加到此列表 Component。(继承自 Component。)

Handshake

使用 Handshake 中的值获取或设置串行端口数据传输的握手协议。

IsOpen

获取一个值,该值指示 SerialPort 对象的打开或关闭状态。

NewLine

获取或设置用于解释 ReadLine 和 WriteLine 方法调用结束的值。

Parity

获取或设置奇偶校验检查协议。

ParityReplace

获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节。

PortName

获取或设置通信端口,包括但不限于所有可用的 COM 端口。

ReadBufferSize

获取或设置 SerialPort 输入缓冲区的大小。

ReadTimeout

获取或设置读取操作未完成时发生超时之前的毫秒数。

ReceivedBytesThreshold

获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数。

RtsEnable

获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号。

Site

获取或设置 ISite 的 Component。(继承自 Component。)

StopBits

获取或设置每个字节的标准停止位数。

WriteBufferSize

获取或设置串行端口输出缓冲区的大小。

WriteTimeout

获取或设置写入操作未完成时发生超时之前的毫秒数。

简单初始化串口参数的示例程序:

SerialPort mySerialPort = new SerialPort("COM2");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity=Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.Non;mySerialPort.DataReceived += new SerialDataReceivedEvenHandler(DataReceive_Method);mySerialPort.Open();
  1. 串口发送信息
    SerialPort类定义了多种方法用于串口发送信息。

Write(Byte[], Int32, Int32) 使用缓冲区中的数据将指定数量的字节写入串行端口
Write(Char[], Int32, Int32) 使用缓冲区中的数据将指定数量的字符写入串行端口
Write(String) 将指定的字符串写入串行端口
WriteLine(String) 将指定的字符串和NewLine值写入输出缓冲区

下面是一个简单的例子说明如何通过串口发送字符串和字节数据:

using System.IO.Ports;private static void SendSampleData()
{// Instantiate the communications// port with some basic settingsSerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);// Open the port for communicationsport.Open();// Write a stringport.Write("Hello World");// Write a set of bytesport.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);// Close the portport.Close();
}

下面是如何发送一个文本文件的例子:

private static void SendTextFile(SerialPort port, string FileName)
{port.Write(File.OpenText(FileName).ReadToEnd());
}

下面是如何发送一个二进制文件的例子:

private static void SendBinaryFile(SerialPort port, string FileName)
{using (FileStream fs = File.OpenRead(FileName))port.Write((new BinaryReader(fs)).ReadBytes((int)fs.Length), 0, (int)fs.Length);
}
  1. 串口接收信息
    SerialPort类定义了多种方法用于串口接收信息。

Read(Byte[], Int32, Int32) 从SerialPort输入缓冲区读取一些字节,并将那些字节写入字节数组中指定的偏移量处
Read(Byte[], Int32, Int32) 从SerialPort输入缓冲区读取一些字符,并将那些字符写入字符数组中指定的偏移量处
ReadByte() 从SerialPort输入缓冲区中同步读取一个字节
ReadChar() 从SerialPort输入缓冲区中同步读取一个字符
ReadExisting() 在编码的基础上,读取SerialPort对象的流和输入缓冲区中所有立即可用的字节
ReadLine() 一直读取到输入缓冲区中的NewLine值
ReadTo(String) 一直读取到输入缓冲区中的指定value的字符串

通常一个比较常见的用法就是将串口里面立即能用的字符或数据读取然后打印在textbox等控件中显示。

#region Namespace Inclusions
using System;
using System.IO.Ports;
using System.Windows.Forms;
#endregionnamespace SerialPortExample
{class SerialPortProgram{// Create the serial port with basic settingsprivate SerialPort port = new SerialPort("COM1",9600, Parity.None, 8, StopBits.One);[STAThread]static void Main(string[] args){// Instatiate this classnew SerialPortProgram();}private SerialPortProgram(){Console.WriteLine("Incoming Data:");// Attach a method to be called when there// is data waiting in the port's bufferport.DataReceived += newSerialDataReceivedEventHandler(port_DataReceived);// Begin communicationsport.Open();// Enter an application loop to keep this thread aliveApplication.Run();}private void port_DataReceived(object sender, SerialDataReceivedEventArgs e){// Show all the incoming data in the port's bufferConsole.WriteLine(port.ReadExisting());}}
}

另外还有一种应用场合是需要缓存一段串口接收数据,然后在缓存数据中查找有用信息,这时可以采用下面例子所用的办法。

using System;
using System.IO.Ports;
using System.Collections.Generic;namespace SerialComBuffering
{class Program{SerialPort com = new SerialPort(SerialPort.GetPortNames()[0],9600, Parity.None, 8, StopBits.One);List<byte> bBuffer = new List<byte>();string sBuffer = String.Empty;static void Main(string[] args){ new Program(); }Program(){com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);com.Open();Console.WriteLine("Waiting for incoming data...");Console.ReadKey();}void com_DataReceived(object sender, SerialDataReceivedEventArgs e){// Use either the binary OR the string technique (but not both)// Buffer and process binary datawhile (com.BytesToRead > 0)bBuffer.Add((byte)com.ReadByte());ProcessBuffer(bBuffer);// Buffer string datasBuffer += com.ReadExisting();ProcessBuffer(sBuffer);}private void ProcessBuffer(string sBuffer){// Look in the string for useful information// then remove the useful data from the buffer}private void ProcessBuffer(List<byte> bBuffer){// Look in the byte array for useful information// then remove the useful data from the buffer}}
}

[C#] Microsoft .Net框架SerialPort类的用法与示例相关推荐

  1. SerialPort类的用法与示例

    SerialPort类的用法与示例 文章目录 SerialPort类的用法与示例 1. 串口硬件信号定义 2. 串口端口号搜索 3. 串口属性参数设置 4. 串口发送信息 5. 串口接收信息 串口工具 ...

  2. C#winform小demo-串口传输实现硬件数据回传(SerialPort类使用)

    这节介绍实现的是利用SerialPort类进行串口的链接. .Net Framework 作为微软开发的一个框架,万变不离其宗,要怎么使用一个东西,就最好看它的说明书 . SerialPort Cla ...

  3. 在C#中使用SerialPort类实现串口通信

    在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信等.本文章将本人在学习过程中从网络上搜集到的相关信息写出来供大家参考. 下面主要介绍该类的主要属性(表1) ...

  4. 在C#中使用SerialPort类实现串口通信 遇到多线程问题

    在C#中使用SerialPort类实现串口通信 遇到多线程问题 在C#中使用SerialPort类实现串口通信. 2009年11月01日 星期日 10:03 在.NET work 2.0中提供了Ser ...

  5. Microsoft .NET 框架资源基础 ---摘自:msdn

    Chris Sells Sells Brothers Consulting 摘要:Chris Sells 讨论无类型清单资源和有类型资源,它们是受 Microsoft .NET 框架支持的两种资源.他 ...

  6. php with语法,Yii框架关联查询with用法分析

    本文实例分析了Yii框架关联查询with用法.分享给大家供大家参考.具体方法如下: Yii框架关联查询与mysql中的关联查询会有什么区别呢?这里小编就与各位来一起来看看吧. Yii的关联查询确实是一 ...

  7. php tp框架选择题,thinkPHP框架单元测试库tpunit用法示例

    本文实例讲述了thinkPHP框架单元测试库tpunit用法.分享给大家供大家参考,具体如下: thinkphp本身并没有提供相应的单元测试支持,所以这里介绍一个可以对tp进行单元测试的库tpunit ...

  8. Microsoft MVC3 框架

    Microsoft MVC3 框架 1. 安装MVC3框架 官网:http://www.asp.net/mvc 下载:ASP.NET MVC3 with Tools http://go.microso ...

  9. Microsoft 解决方案框架版本 3.0 概述

    发布日期: 2004年06月04日 关于 Microsoft 解决方案框架的更多信息,请参阅 http://www.microsoft.com/china/technet/itsolutions/te ...

  10. Microsoft 解决方案框架版本 3.0 概述(MSF3.0)

    Microsoft 解决方案框架版本 3.0 概述 发布日期: 2004年06月04日 关于 Microsoft 解决方案框架的更多信息,请参阅 http://www.microsoft.com/ch ...

最新文章

  1. R语言绘制箱图(Base R and ggplot2)
  2. 一文讲清楚FusionInsight MRS CDL如何使用
  3. 计算MACD(指数平滑移动平均线)Moving Average Convergence / Divergence
  4. 荣耀系列到底算不算华为手机
  5. git fatal: index file smaller than expected
  6. git 上的 python package 的安装
  7. 聊聊我的 2018 年
  8. 惊恐!电脑竟然会使用计谋了!——第二局感悟
  9. 2020-11-30 OpenCV人工智能图像处理学习笔记 第4章 计算机视觉加强之图像特效
  10. 大数据之 Hadoop 基本概念
  11. 匹配区县代码_行政区划代码查询
  12. c语言铺地板,【北理乐学】铺地板
  13. Python + ElasticSearch:轻松玩转跨越千年的两百三十万条地震数据
  14. web service压测工具:siege安装及使用介绍
  15. feign.RetryableException: xxx executing POST
  16. 分数的和 (Standard IO)——————xdm快帮我记住这一刻,我肝了35分钟,做了只有天知道多少次时间的优化,终于做出来了ohhhhhhhhhhhhhhh
  17. oracle comment语法,oracle 之 COMMENT
  18. 音视频开发系列(7):完成本地摄像头直播推流
  19. 前台、后台、前端、后端的区分
  20. 机械结构day_13

热门文章

  1. 利用java实现一个简单的远程监控程序
  2. less中mixins与extend的区别
  3. 对variable-sized object may not be initialized的一点理解
  4. 跑步进入全站 HTTPS ,这些经验值得你看看
  5. 《游戏改变企业》一一第 2 章 实时的经济信息反馈(为什么游戏很重要) 游戏改变企业...
  6. 微软Azure、谷歌GAE、亚马逊AWS比較
  7. 启用Mac系统读写NFTS磁盘
  8. 解决iTnues对PC授权,连接不上iTnues的问题
  9. 2.24小时365天不间断服务 --- 优化服务器及基础设施的拓扑结构(冗余,负载分流,高性能的实现)
  10. 5.Linux/Unix 系统编程手册(上) -- 深入探究文件IO