C#中显现串口通信SerialPort类

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 plain copy

  1. private void ReadPort()
  2. {
  3. while (_keepReading)
  4. {
  5. if (com.IsOpen)
  6. {
  7. byte[] readBuffer = new byte[com.ReadBufferSize + 1];
  8. try
  9. {
  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 plain copy

  1. private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  2. {
  3. int SDateTemp = this.serialPort1.ReadByte();
  4. //读取串口中一个字节的数据
  5. this.tB_ReceiveDate.Invoke(
  6. //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
  7. //即在textBox_ReceiveDate控件的父窗口form中执行委托.
  8. new MethodInvoker(
  9. /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke    方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
  10. delegate{
  11. /*匿名方法,<a href="http://lib.csdn.net/base/csharp" class=‘replace_word‘ title="C#知识库" target=‘_blank‘ style=‘color:#df3434; font-weight:bold;‘>C#</a>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://blog.csdn.net/cy757/article/details/4474930

来自为知笔记(Wiz)

时间: 2024-08-19 04:14:48

C#中显现串口通信SerialPort类的相关文章

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

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

创建C#串口通信程序详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准的RS 232 C 在PC间通信.它工作在全双工模式下,而且我们不打算使用任何的握手或流控制器,而是使用无modem连接.创建C#串口通信程序的具体实现是如何的呢?让我们开始吧: 创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类. 创建C#串

Java实现RS485串口通信,发送和接收数据进行解析

最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的jar包,win64位下载地址:http://pan.baidu.com/s/1o6zLmTc):将解压后的rxtxParallel.dll和rxtxSerial.dll两个文件放在%JAVA_HOME%/jre/bin目录下,这样该包才能被正常的加载和调用. 代码如下: package com.g

QT 串口通信 数据16进制发送

在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray senddata; int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { hstr=st

在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

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

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

(转)VC串口小程序(用SerialPort类)

××××××××××××××××××××××××××××××××××××××××××××××××××××× 在MFC里面实现串口通讯有很多方式: 方案一:使用微软公司提供的 串口类,SerialPort.这是官方的东西   有最大的灵活性和可靠性.  我的主攻选择为这个. 微软资源地址:https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx?cs-save-lang=1&cs-lang=

MFC串口的编程 mscomm控件与SerialPort类

MFC制作上位机,首先需要了解的是串口的编程,一般有两种方法,一个是使用ActiveX控件,例如mscomm串口控件,还有一个是用SerialPort类或者一些其他的串口类,这两个的区别是使用SerialPort类不需要注册控件,在其他没有安装控件的电脑上也能够用. 一·使用mscomm串口控件 使用mscomm串口控件的方法网上一大堆,大致说一些方法和一些需要注意的地方.如果是使用VC6.0在WIN7上来编写就会有个问题会通常说添加控件的方法为选中项目à“工程”à“添加到工程”à“Compon

Visual Stdio 2010中新建WPF与Arduino进行串口通信

C# 使用 System.IO  + System.IO.Ports()使用SerialPort类(调试程序): Skeleton[] skeletons = new Skeleton[0]; //Open Serial.Com SerialPort com; com = new SerialPort(); com.BaudRate = 115200; com.PortName = "COM3"; com.DataBits = 8; com.Open(); while(true) co