现在大多数硬件设备均采用串口技术与计算机相连,因此串口的应用程序开发越来越普遍。例如,在计算机没有安装网卡的情况下,将本机上的一些信息数据 传输到另一台计算机上,那么利用串口通信就可以实现。运行本程序,在“发送数据”文本框中输入要传送的数据,单击【发送】按钮,将传送的数据发送到所选择 的端口号中;单击【接收】按钮,传递的数据被接收到“接收数据”文本框中。如图13.1所示。
技术要点
在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信等。下面主要介绍该类的主要属性(表13.1)和方法(表13.2)。
表13.1 SerialPort类的常用属性
名称
说明
BaseStream
获取 SerialPort 对象的基础 Stream 对象
BaudRate
获取或设置串行波特率
BreakState
获取或设置中断信号状态
BytesToRead
获取接收缓冲区中数据的字节数
BytesToWrite
获取发送缓冲区中数据的字节数
CDHolding
获取端口的载波检测行的状态
CtsHolding
获取“可以发送”行的状态
DataBits
获取或设置每个字节的标准数据位长度
DiscardNull
获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之间传输时是否被忽略
DsrHolding
获取数据设置就绪 (DSR) 信号的状态
DtrEnable
获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号
Encoding
获取或设置传输前后文本转换的字节编码
Handshake
获取或设置串行端口数据传输的握手协议
IsOpen
获取一个值,该值指示 SerialPort 对象的打开或关闭状态
NewLine
获取或设置用于解释 ReadLine( )和WriteLine( )方法调用结束的值
Parity
获取或设置奇偶校验检查协议
续表
名称
说明
ParityReplace
获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节
PortName
获取或设置通信端口,包括但不限于所有可用的 COM 端口
ReadBufferSize
获取或设置 SerialPort 输入缓冲区的大小
ReadTimeout
获取或设置读取操作未完成时发生超时之前的毫秒数
ReceivedBytesThreshold
获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数
RtsEnable
获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号
StopBits
获取或设置每个字节的标准停止位数
WriteBufferSize
获取或设置串行端口输出缓冲区的大小
WriteTimeout
获取或设置写入操作未完成时发生超时之前的毫秒数
表13.2 SerialPort类的常用方法
方 法 名 称
说明
Close
关闭端口连接,将 IsOpen 属性设置为False,并释放内部 Stream 对象
Open
打开一个新的串行端口连接
Read
从 SerialPort 输入缓冲区中读取
ReadByte
从 SerialPort 输入缓冲区中同步读取一个字节
ReadChar
从 SerialPort 输入缓冲区中同步读取一个字符
ReadLine
一直读取到输入缓冲区中的 NewLine 值
ReadTo
一直读取到输入缓冲区中指定 value 的字符串
Write
已重载。将数据写入串行端口输出缓冲区
WriteLine
将指定的字符串和 NewLine 值写入输出缓冲区
注意:用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过串口的第2、3针的连接可以对程序进行检测。串口截面图如图13.2所示。
图13.2 串口截面图
实现过程
(1)新建一个项目,命名为Ex13_01,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e) { serialPort1.PortName = "COM1"; serialPort1.BaudRate = 9600; serialPort1.Open(); byte[] data = Encoding.Unicode.GetBytes(textBox1.Text); string str = Convert.ToBase64String(data); serialPort1.WriteLine(str); MessageBox.Show("数据发送成功!","系统提示"); } private void button2_Click(object sender, EventArgs e) { byte[] data = Convert.FromBase64String(serialPort1.ReadLine()); textBox2.Text = Encoding.Unicode.GetString(data); serialPort1.Close(); MessageBox.Show("数据接收成功!","系统提示"); }
举一反三
根据本实例,读者可以实现以下功能。
远程监控对方计算机屏幕。
下位机控制程序。
实例419通过串口关闭对方计算机
实例说明
在网络应用程序中,主要通过网卡实现数据的传输,因此可以利用套接字技术实现远程关闭计算机。如果计算机中没有安装网卡,该如何实现远程关闭计算机呢?本例实现了利用串口关闭对方计算机,程序运行结果如图13.3所示。
技术要点
本实例使用SerialPort类的属性和方法,请参见实例“通过串口发送数据”。下面主要介绍SerialPort类的DataReceived 事件,DataReceived 事件为本实例的主要使用技术。DataReceived事件表示将处理 SerialPort 对象的数据接收事件的方法。串行接收事件可以由 SerialData 枚举中的任何项引起,是否引发此事件由操作系统决定,所以不一定会报告所有奇偶校验错误。
注意:本实例从开发到测试,都是由本地计算机完成的,用户只需要使用跳线将串口的第2、3针连接,可以在本地计算机上实现串口通信。跳线连接请参见图13.2。
实现过程
(1)新建一个项目,命名为Ex13_02,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于打开通信串口和关闭对方计算机。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e) { //打开串口 serialPort1.PortName = "COM1"; serialPort1.Open(); button1.Enabled = false; button2.Enabled = true; } //数据接收事件,等待接收关机命令 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] data = Convert.FromBase64String(serialPort1.ReadLine()); string str = Encoding.Unicode.GetString(data); serialPort1.Close(); if (str == "关机") { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.WriteLine("shutdown /s"); p.StandardInput.WriteLine("exit"); } } //发送关机命令 private void button2_Click(object sender, EventArgs e) { if (button2.Text == "关闭计算机") { //发送关机命令数据 byte[] data = Encoding.Unicode.GetBytes("关机"); string str = Convert.ToBase64String(data); serialPort1.WriteLine(str); button2.Text = "取消关机"; } else { button2.Text = "关闭计算机"; button1.Enabled = true; button2.Enabled = false; //取消关机 Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.WriteLine("shutdown /a"); p.StandardInput.WriteLine("exit"); } }
在我的测试软件中发现一个问题,就是当发送数据小于或等于8位时,一切正常,如果大于8为字节,则在datareceived事件中接收到的数据会分成两段,第一段为8位,第二段为剩下的字节,很奇怪,在msdn中讲到不能保证每次发送的数据都能正确接收到,需要参照BytesToRead属性来确定要读取的数据量,所以我想出来的解决办法为:
int DataLength=serialPort.BytesToRead; int i=0; StringBuilder sb=new StringBuilder(); while(i<DataLength) { byte[] ds=new byte[1024]; int len=serialPort.Read(ds,0,1024); sb.Append(Encoding.Ascii.GetString(ds,0,len)); i+=len; } Console.Write(sb,ToString());
这种奇怪的方法可以解决问题,后来想想应该是串口的工作方式决定的也有可能,期待其他的解决方式。
发表评论
-
(转)ASP.NET文件上传控件——WebbUpload我下载了这个组件后做了一些修改并应用了ajax技术
2010-12-06 16:28 974我下载了这个组件后做了一些修改并应用了ajax技术,你们可以去 ... -
ASP.NET 下载管理的基础篇
2010-10-13 11:20 834很多时候一个网站是需要对文件下载进行管理的,不是任何人都允许下 ... -
C#实现获取CPU使用率的方法
2010-10-13 11:09 2125无需多说,直接上代码 using System; ... -
用C#取得远程IP地址,MAC地址的方法
2010-10-13 11:05 1286经常需要获得远程的地址,需要用sendarp这个函数来实现。具 ... -
C#在应用程序中实现自动升级(转)
2010-10-11 12:06 5890这是本人第一次写比较复杂的文章,表达不清之处,请各位见谅。好, ... -
.Net垃圾收集机制 了解算法与代龄
2010-10-08 17:40 629垃圾收集器在本质上就是负责跟踪所有对象被引用到的地方,关注 ... -
深入了解Array,弄个明明白白
2010-10-08 17:28 6891. 数组大局观 数组是一个引用类型,也就是意味着数 ... -
Asp.Net如何实现断点续传
2010-10-08 17:07 1062断点续传的原理 ... -
编码实现动态调用WebService的方法
2010-10-08 11:00 1685调用方法,同时也支持带ref参数的 /// ... -
ASP.NET得到当前代码位置的类名和方法名
2010-10-08 10:31 961protected void writeerror(obje ... -
文本字符的html格式转换
2010-10-08 10:23 760前一段仿泡泡网做了个论坛,遇到了个文本符号转化成相应htm ... -
C#.Net创建不规则窗体的几种方法
2010-09-30 13:41 1527现在,C#创建不规则窗体不是一件难事,下面总结一下: 一、自 ... -
浅解XML与DataSet对象的关系及转换
2010-09-30 13:39 965在.NET Framework 中,经常使用XML 作为存储和 ... -
用Visual Studio来自动化测试
2010-09-30 13:32 1103自动化测试的实现 编写自动化测试也许对很多测试人员来说比较陌 ... -
10个C#编程和Visual Studio使用技巧
2010-09-30 13:29 777C#是一门伟大的编程语言,与C++和Java相比,它的语法更简 ...
相关推荐
C# SerialPort串口开发技术相关类、属性、方法、事件等用法详细说明,并且配有详细的开发实例。
C#的SerialPort串口编程,对于初学C#串口的有一些帮助的。
最近在学C#,在网上找了很多有关串口通信的资料,自己总结了一下,开发环境是VS2005,代码实现
C# 串口 使用SerialPort类源码 源码单片机可执行 带注释 C# 串口 使用SerialPort类源码 源码单片机可执行 带注释 C# 串口 使用SerialPort类源码 源码单片机可执行 带注释
支持串口大量数据读写操作,能一次性读取数据,通过设置超时大小控制一次读取串口所有数据。支持事件触发,异步发送接收数据。附件有demo,可下载Virtual Serial Port Driver模拟串口测试。
C#串口通信、发送、监听串口数据,可以使用windows api或者C#自带serialPort通信。
用C#编写的用ASCII码发送的串口通信程序
对C#的serialport类功能进行了总结,给出了发送,接收数据的完整操作类代码,可直接运用该类进行c#的串口数据操作
//声明串口类实例 public SerialPortUtility mySp = new SerialPortUtility(); //打开串口 mySp.OpenSerialPort("COM1" /*串口号*/, 9600/*波特率*/, 0/*校验位*/, 8/*数据位*/, 1/*停止位*/); // 订阅事件...
在串口接受特定格式的数据,将数据显示在屏幕上。 练手的小程序,跟arm通信采ad信号弄得
类中实现串口事件DataReceived接收数据。定义3个事件,用来通知数据接收完成、数据发送完成、每次接收数据。实现C#串口通信SerialPort类,包含C#编程代码。
这是一个用c#写的窗口配置窗体。包含了异常处理。使用serialport组件。适合win7,xp,vista等。可以生产dll文件,用于继承窗体。很是方便。
003.C#串口通信:MSComm控件使用详解.doc 004.C#_.net常用控件(09软件).pdf 005.C#_.NET常用控件(3).doc 006.C#_窗体及常用控件、组件.ppt 007.C#_第3章_Windows窗体与控件.ppt 008.王牌2_C__控件查询手册.pdf 009....
C#winform串口SerialPort和API调用实例源码
主要实现功能是将串口发送过来的数据按波形显示 注:本例是以串口调试助手和虚拟串口VSPD软件模拟串口发送数据的 我所用的串口调试助手每次...详细说明见同名CSDN博客“C#用serialPort和chart控件实现简单波形绘制”
C#.NET SerialPort控件实现
C# 使用SerialPort控件制作的串口助手,请忽略我的名字,源代码全部开放,实现功能有收发数据,自动收发,十六进制收发和收发文件等。大家可以下载可以修改,完全开源。好东西值得这么多分。
简单明了的利用SerialPort类读取和发送串口数据
001.C#串口通信编程类(修改版).doc 002.C#结合串口通信类实现串口通信源代码.doc 003.C_并口及串口通信.docx 004.C#_SerialPort通信详细介绍.pdf 005.SerialPort控件的使用.doc 006.C#与51单片机串口通信.doc 007.C_...
C# Serialport 串口 C#编程 串口通信