在C#中使用SerialPort类实现串口通信(陆续更新)

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

下面主要介绍该类的主要属性(表1)和方法(表.2)。

如果需要了解更多的信息请登录http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(VS.80).aspx查看。

相关文章

《使用System.IO.Ports读取COM口数据》

http://www.devasp.net/net/articles/display/727.html

表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

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

表2                                                     SerialPort类的常用方法

方 法 名 称

说  明

Close

关闭端口连接,将 IsOpen 属性设置为False,并释放内部 Stream 对象

Open

打开一个新的串行端口连接

Read

从 SerialPort 输入缓冲区中读取

ReadByte

从 SerialPort 输入缓冲区中同步读取一个字节

ReadChar

从 SerialPort 输入缓冲区中同步读取一个字符

ReadLine

一直读取到输入缓冲区中的 NewLine 值

ReadTo

一直读取到输入缓冲区中指定 value 的字符串

Write

已重载。将数据写入串行端口输出缓冲区

WriteLine

将指定的字符串和 NewLine 值写入输出缓冲区

使用SerialPort类的方法:

方法一:

首先要添加

using System.IO;
using System.IO.Ports;

1...在类的内部定义SerialPort com;

2...打开串口

            com = new SerialPort();
            com.BaudRate = 115200;
            com.PortName = "COM1";
            com.DataBits = 8;
            com.Open();//打开串口

3...发送数据

            Byte[] TxData ={1,2,3,4,5,6,7,8 };
            com.Write(TxData, 0, 8);

4...接收数据

     4.1使用事件接收

     this.com.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.OnDataReceived);

private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)

    4.2使用线程接收

     接收数据启动一个线程,使其接收。

在类的内部定义

        Thread _readThread;
        bool _keepReading;

打开串口后启动线程

            _keepReading = true;
            _readThread = new Thread(ReadPort);
            _readThread.Start();

线程函数

[c-sharp] view plaincopy
01.private void ReadPort()
02.{
03.    while (_keepReading)
04.    {
05.        if (com.IsOpen)
06.        {
07.            byte[] readBuffer = new byte[com.ReadBufferSize + 1];
08.            try
09.            {
10.                // If there are bytes available on the serial port,
11.                // Read returns up to "count" bytes, but will not block (wait)
12.                // for the remaining bytes. If there are no bytes available
13.                // on the serial port, Read will block until at least one byte
14.                // is available on the port, up until the ReadTimeout milliseconds
15.                // have elapsed, at which time a TimeoutException will be thrown.
16.                int count = com.Read(readBuffer, 0, com.ReadBufferSize);
17.                String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count);
18.                if (count != 0)
19.                    //byteToHexStr(readBuffer);
20.                    ThreadFunction(byteToHexStr(readBuffer,count));
21.            }
22.            catch (TimeoutException) { }
23.        }
24.        else
25.        {
26.            TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);
27.            Thread.Sleep(waitTime);
28.        }
29.    }
30.}  

方法二:使用C#自带的SerialPor控件。

1...在“工具箱”的“组件”中选择SerialPor控件添加。

2...设置串口并打开

serialPort1.PortName = "COM1";

serialPort1.BaudRate = 9600;

serialPort1.Open();

3...写入数据可以使用Write或者下面的函数

serialPort1.WriteLine(str);

4...添加数据接收的事件

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

使用中的一些常见问题

C#中SerialPort类中DataReceived事件GUI实时处理方法(来自[email protected] 的看法)
MSDN:从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke 回发更改请求,这将在正确的线程上执行.进而要想将辅助线程中所读到的数据显示到主线程的Form控件上时,只有通过Invoke方法来实现
下面是代码实例: 

[c-sharp] view plaincopy
01.private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
02.{
03.   int SDateTemp = this.serialPort1.ReadByte();
04.   //读取串口中一个字节的数据
05.   this.tB_ReceiveDate.Invoke(
06.    //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
07.    //即在textBox_ReceiveDate控件的父窗口form中执行委托.
08.    new MethodInvoker(
09.    /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke    方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
10.    delegate{
11.    /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可  以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死      */
12.    this.tB_ReceiveDate.AppendText(SDateTemp.ToString());//输出到主窗口文本控件
13.    this.tB_ReceiveDate.Text += " ";}
14.    )
15.    );
16.}  

如何知道当前电脑有哪个串口

在窗体上添加一个comboBox控件。

然后使用comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());  或者

 string[] portList = System.IO.Ports.SerialPort.GetPortNames();
            for (int i = 0; i < portList.Length; ++i)
            {
                string name = portList[i];
                comboBox1.Items.Add(name);
            }

 具体请参考http://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.getportnames.aspx
时间: 2024-10-12 20:44:59

在C#中使用SerialPort类实现串口通信(陆续更新)的相关文章

C#中使用UdpClient类进行简单通信的例子

UdpClient 类提供了一些简单的方法,用于在阻止同步模式下发送和接收无连接 UDP 数据报. 因为 UDP 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接.但您可以选择使用下面两种方法之一来建立默认远程主机: 使用远程主机名和端口号作为参数创建 UdpClient 类的实例. 创建 UdpClient 类的实例,然后调用 Connect 方法. 可以使用在 UdpClient 中提供的任何一种发送方法将数据发送到远程设备. 使用 Receive 方法可以从远程主机接收数据.

vc 使用了SerialPort类的串口通信软件分析

实现串口通信,使用的类文件是SerialPort.cpp.在项目中使用mscomm控件的时候,串口连续传递若干数据后,会出现卡死的情况,关闭串口再打开,继续读取的话可以正常通信. 为了解决这个问题,想到就用SerialPort串口类来实现会好吧.当然,完全用windows的api函数来实现也可以,太麻烦吧,我也没用过.用微软的一些控件编程虽然容易了,但是也不熟悉底层. 软件主界面为: 点了自动发送单选框后: 点开始发送按钮: 一个界面就知道很好实现. 借这个例子,重点来梳理一下串口类的使用. 1

C#实现简单的串口通信

前言 本着学习研究的态度,用c#语言实现简单的串口通信工具. 一.串口通信原理 串口通信 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远距离通信.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据.其他线用于握手,但不是必须的.串口通信最重要的参数是波特率.数据位.停止位和奇偶校验.对于两个进行通信的

串口通信属性及事件解析

RS-232串口,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.典型地,串口用于ASCII码字符的传输.通信使用3根线完成:(1)地线,(2)发送,(3)接收. 本文以c#中的SerialPort类为例,分析串口各参数及事件,其他平台串口库的操作类似. 专门串口通信的朋友,建议参看<Visual C++串口通信工程开发实例导航>.   一.属性 1. PortName 串口名    默认值COM1 串口对于操作

c#串口通信

最近在做串口通信,空闲下来的时候想写篇博客来谈谈串口通信..net程序集中提供了类SerialPort进行串口通信,此类位于命名空间System.IO.Ports中,SerialPort类有波特率,数据位数等属性,所以根据设备即可连接通信,比如我们在面临这样的设备时: # COMx * Port Settings 1 9600 baud 2 8 data bits 3 No parity 4 1 Stop Bit 5 Flow Control Hand-shake Off 这样写即可: //假如

Qt串口通信专题教程

查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 --------------2010年7月8日更新--------------– 网友 赵文杰 使用多线程完成的linux下的串口通信. 下载源码:下载 ------------------------------------- 以下是正文: 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序

Mac下的串口通信

最近在工作中遇到有关Mac下串口通信的问题,一开始直接用以前同事写的framework,基本通信没问题,但是一打开串口,CPU的占用率就直接飙到100%,而且读信息的时候很难判断“\r”换行符,于是打算自己重写串口类. 到网上搜索资料,“Mac+串口”,无果,大部分都转往Linux串口方向.虽然很多人都说mac系统跟linux差不多,但是对于小白,概念还是比较模糊的,无从下手. 无意间找到一篇文章:mac下串口通讯工具的编写 看了一下注释,觉着作者写的类不错,于是乎跑到Github,幸运地找到了

单片机第12课:串口通信---中断方式--从计算机接收数据

JP3和P0口连接.用中断的方式来接收数据. #include<reg51.h> //声明初始化子函数 void initSer(); void main() { //初始化子函数调用 initSer(); while(1) { //一句话都没有 } } //定义初始化子函数 void initSer() { //定时器工作方式为2 TMOD = 0x20; //波特率9600,SMOD=0 TH1 = 0xfd; TL1 = 0xfd; //启动定时器 TR1 = 1; //串口工作方式1

C#中显现串口通信SerialPort类

SerialPort类的常用属性 名 称 说 明 BaseStream 获取 SerialPort 对象的基础 Stream 对象 BaudRate 获取或设置串行波特率 BreakState 获取或设置中断信号状态 BytesToRead 获取接收缓冲区中数据的字节数 BytesToWrite 获取发送缓冲区中数据的字节数 CDHolding 获取端口的载波检测行的状态 CtsHolding 获取"可以发送"行的状态 DataBits 获取或设置每个字节的标准数据位长度 Discar