.NET 2.0中串口通讯类SerialPort

1。简介

随着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地方,如U盘、相机、打印机等。除了USB这种较为奢侈的串口外,在工控和嵌入式行业,大量被使用的是另一种古老的串口协议,RS-232串口。RS-232是一种非常简洁的低速串口通讯接口,它可以同时进行数据接收和发送的工作。

2。.NET 2.0对串口的支持

.NET 2.0提供了对串口通信功能的支持,有关类可以在命名空间System.IO.Ports下找到,这其中最为重要的是SerialPort类。

通过创建一个新的SerialPort 对象,我们就可以在.NET程序中控制串口通讯的全过程。

3。使用 SerialPort 设置串口属性

进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。串口属性主要包括

.PortName                 串口名称,COM1, COM2等。
.BaudRate                 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。
.Parity                        奇偶校验。可以选取枚举Parity中的值
.DataBits                    数据位
.StopBits                    停止位,可以选取枚举StopBits中的值
.Handshake                握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值

4。打开与关闭串口

 

 

 

在创建一个SerialPort 对象,设置串口属性后,可以通过 Open()方法打开串口。数据读写完成后,可以通过Close()方法关闭串口。

根据经验,对于有些系统,在打开串口后,还需要将RtsEnable设置为True,这样才能读写数据,否则不能正常读写数据。

5。读写行数据

双方通讯时,一般都需要定义通讯协议,即使最简单的通过串口发送文本聊天的程序。

通常是在当一方按下回车时,将其所数据的文本连同换行符发给另一方。在这个通讯事例中,协议桢是通过换行符界定的,每一桢数据都被换行符隔开,这样就很容易识别出通讯双发发送的信息。

在以上的例子中,可以用WriteLine()来发送数据,用ReadLine()来读取数据。WriteLine发送完数据后,会将换行符作为数据也发送给对方。ReadLine()读取数据时,直至遇到一个换行符,然后返回一个字符串代表一行信息。换行符可以通过SerialPort 的属性NewLine来设置。一般地,Windows将CrLn作为换行符,而在Linux下,换行符则只用一个Ln表示。

ReadLine()方法是阻塞的,直至遇到一个换行符后返回。在读取数据时,如果一直没有遇到换行符,那么在等待ReadTimeout时间后,抛出一个TimeoutException。默认情况下,ReadTimeout为InfiniteTimeout。这样,ReadLine一直处于阻塞状态,直至有新一行数据到达。

WriteLine()方法也是阻塞的,如果另一方不能及时接收数据,就会引起TimeoutException异常。

由于ReadLine()和WriteLine()方法都是阻塞式的,在程序使用SerialPort 进行串口通讯时,一般应该把读写操作交由其他线程处理,避免因为阻塞而导致程序不响应。

6。读写字节或字符数据

对于字节或字符数据,用Read()方法来读数据,该方法需要一个字节或字符数组作为参数来保存读取的数据,结果返回实际读取的字节或字符数。写数据使用Write()方法,该方法可以将字节数组、字符数据或字符串发送给另一方。

如果通讯双方交换的数据位字节流数据,要构建一个使用的串口通讯程序,那么双方应该定义数据桢格式。通常数据桢由桢头和桢尾来界定。

发送数据比较简单,只需要将构造好的数据用Write()方法发送出去即可。

接收数据则比较复杂,通讯是以字节流的形式到达的,通过调用一次Read()方法并不能确保所读取的数据就是完整一桢。因此需要将每次读取的数据整合在一起,对整合后的数据进行分析,按照定义的桢格式,通过桢头和桢尾,将桢信息从字节流中抽取出来,这样才能获取有意义的信息。

除了利用Read()方法来读数据,还可以使用ReadExisting()方法来读取数据。该方法读取当前所能读到的数据,以字符串的形式返回。

7。事件

SerialPort 提供了DataReceived事件。当有数据进入时,该事件被触发。该事件的触发由操作系统决定,当有数据到达时,该事件在辅助线程中被触发。辅助线程的优先级比较低,因此并不能确保每个字节的数据到达时,该事件都被触发。

在使用该事件接收数据时,最好对定义通讯协议格式,添加桢头和桢尾。在DataReceived事件中接收数据时,把数据放在数组中或字符串中缓冲起来,当接收的包含桢头和桢尾的完整数据时,在进行处理,另外,为了有效地接收数据,可以在每次读取数据后,加入System.Threading.Thread.Sleep方法进行演示。

8。其他

.BytesToRead 该属性返回能够读到的字节数。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在.NET,我们可以使用SerialPort来封装串口通讯SerialPort是System.IO.Ports命名空间下的一个,它提供了一系列属性和方法来控制和管理串口通讯。 首先,我们可以通过实例化一个SerialPort对象来打开指定的串口。例如,使用以下语句可以打开COM1串口SerialPort serialPort = new SerialPort("COM1"); 然后,我们可以通过设置SerialPort对象的属性来配置串口的波特率、数据位、停止位、校验位等参数。例如,通过以下语句可以配置波特率为9600,数据位为8位,无停止位,无校验位: serialPort.BaudRate = 9600; serialPort.DataBits = 8; serialPort.StopBits = StopBits.None; serialPort.Parity = Parity.None; 接下来,可以通过调用SerialPort对象的Open()方法来打开串口serialPort.Open(); 之后,我们可以通过调用SerialPort对象的Write()方法来向串口发送数据,通过调用Read()方法来从串口读取数据。例如,以下语句可以向串口发送一段文本信息: serialPort.Write("Hello, SerialPort!"); 同时,可以通过以下语句来读取串口返回的数据: string data = serialPort.ReadExisting(); 最后,在使用完SerialPort对象后,我们需要关闭串口并释放相关资源。通过调用SerialPort对象的Close()方法来关闭串口serialPort.Close(); 以上就是如何在.NET封装串口通讯的简单示例。通过使用SerialPort,我们可以方便地实现串口通讯功能,并且提供了丰富的方法和属性来控制和管理串口通讯。 ### 回答2: .NET提供了一个用于串口通讯的封装SerialPortSerialPort位于System.IO.Ports命名空间,通过该我们可以方便地实现与串口设备的通讯。 首先,我们需要在项目引入System.IO.Ports命名空间,然后创建一个SerialPort对象。 ```csharp using System.IO.Ports; SerialPort mySerialPort = new SerialPort(); ``` 接下来,我们可以通过设置SerialPort对象的属性来配置串口通讯的相关参数,例如串口号、波特率、数据位数、校验位等。 ```csharp mySerialPort.PortName = "COM1"; // 串口号 mySerialPort.BaudRate = 9600; // 波特率 mySerialPort.DataBits = 8; // 数据位数 mySerialPort.Parity = Parity.None; // 校验位 ``` 然后,我们可以打开串口并设置事件处理程序来处理串口的数据接收。 ```csharp mySerialPort.Open(); // 打开串口 mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // 设置事件处理程序 private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { // 处理接收到的串口数据 SerialPort sp = (SerialPort)sender; string data = sp.ReadExisting(); Console.WriteLine("Received data: " + data); } ``` 在事件处理程序,我们可以通过ReadExisting()方法获取串口接收到的数据,并对其进行处理。 最后,当我们不再需要使用串口时,记得关闭串口。 ```csharp mySerialPort.Close(); // 关闭串口 ``` 通过上述步骤,我们就可以方便地使用.NET封装的SerialPort来实现串口通讯。需要注意的是,在实际应用,我们还需要根据具体需求处理异常、超时等情况,以确保串口通讯的可靠性和稳定性。 ### 回答3: .NET封装串口通讯可以通过使用SerialPort来实现。SerialPort.NET Framework提供的一种用于串行端口通信的,可以实现串口的打开、关闭、读取和写入等操作。 首先,我们需要引用System.IO.Ports命名空间,然后创建一个SerialPort对象。可以通过参数设置串口的名称、波特率、数据位、停止位、校验位等相关属性。 使用SerialPort的Open方法可以打开串口,使用Close方法可以关闭串口。 使用SerialPort的Read方法可以读取串口接收到的数据,可以指定读取的字节数,也可以通过DataReceived事件来异步读取数据。 使用SerialPort的Write方法可以向串口发送数据,将数据以字节数组的形式传入,也可以通过WriteLine方法发送字符串。 在使用完SerialPort后,需要及时释放资源,可以通过调用Close方法或者在使用完毕后使用using语句块来释放资源。 在封装串口通讯时,可以根据具体的需求定义一些方法和事件,例如发送数据、接收数据、处理数据等。可以通过封装对应的方法来简化串口通信的操作,提高代码的可重用性和可维护性。 总之,通过.NET封装串口通讯,可以方便地实现对串口的读取和写入操作,并可以根据具体的需求封装自定义的方法和事件,以实现更加灵活和高效的串口通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值