串口读取和发送

private void serialPortA1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

{
ReadRU(serialPortA1, 1);
}

private void ReadRU(System.IO.Ports.SerialPort serial, int num)
{
  var name = num.ToString();
  string readString = serial.ReadLine();  ///发送用serial.WriteLine()
  if (readString.Length > 20)
  {

 String R = readString.Split(‘,‘)[0].ToString();
  String U = readString.Split(‘,‘)[1].ToString();
  }
}

最近总结了串口(COM)读写操作的三种方式:

第1种方式是采用微软在.NET2.0推出了一个串口控件,SerialPort类,但必须是.NET2.0才可以
第2种方式是用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能
第3种方式是通过采用Visual Studio 6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册

以下详细分析了每种方式的使用方式,并提供相应例题下载:

A.1种方式:

.NET 2.0提供了对串口通信功能的支持,在命名空间System.IO.Ports下找到SerialPort类,通过创建一个新的SerialPort对象,我们就可以在.NET程序中控制串口通讯的全过程。

(1).属性介绍
进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort类的属性来进行。
SerialPort属性主要包括:
.PortName 串口名称,COM1, COM2等。
.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。
.Parity 奇偶校验。可以选取枚举Parity中的值
.DataBits 数据位
.StopBits 停止位,枚举StopBits中的值
.Handshake 握手方式,也就是数据流控制方式,枚举Handshake中的值

(2).打开与关闭串口
在创建一个SerialPort对象,设置串口属性后,可以通过Open()方法打开串口。数据读写完成后,可以通过Close()方法关闭串口。
根据经验,对于有些系统,在打开串口后,还需要将RtsEnable设置为True,这样才能读写数据,否则不能正常读写数据。

(3).读写行数据
ReadLine()方法是阻塞的,直至遇到一个换行符后返回。在读取数据时,如果一直没有遇到换行符,那么在等待ReadTimeout时间后,抛出一个TimeoutException。默认情况下,ReadTimeout为InfiniteTimeout。这样,ReadLine一直处于阻塞状态,直至有新一行数据到达。
WriteLine()方法也是阻塞的,如果另一方不能及时接收数据,就会引起TimeoutException异常。
由于ReadLine()和WriteLine()方法都是阻塞式的,在程序使用SerialPort 进行串口通讯时,一般应该把读写操作交由其他线程处理,避免因为阻塞而导致程序不响应。

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

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

时间: 2024-10-10 10:27:52

串口读取和发送的相关文章

【转】搞定单片机多字节串口接收(串口多字节接收发送的高阶研究)

搞定单片机多字节串口接收(串口多字节接收发送的高阶研究) 原文地址:http://bbs.ednchina.com/BLOG_ARTICLE_3007162.HTM 工作了一年多,写了不少单片机串口程序.感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环. 串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了.然而在实际应用当中,基本

C#----串口数据接收发送

虚拟串口驱动工具,创建俩个虚拟串口,如图: 创建两个Console模拟串口的发送接收数据 C#串口数据接收发送,类空间: using System.IO.Ports; C# 串行端口 接收数据,代码如下: //遍历串行端口名称数组 foreach (string port in System.IO.Ports.SerialPort.GetPortNames()) { Console.WriteLine(port); } byte[] b = new byte[32]; SerialPort sp

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

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

Arduino学习笔记A6(补充) - 在串口读取多个字符串,并且转换为数字数组

功能如题目. 在串口收到逗号分割的6串数字比如 100,200,45,4,87,99 然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值 代码注释很详细了,就不再说明了. ARDUINO 代码复制打印 //定义一个comdata字符串变量,赋初值为空值 String comdata = ""; //numdata是分拆之后的数字数组 int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;

[Arduino] 在串口读取多个字符串,并且转换为数字数组

功能如题目.在串口收到逗号分割的6串数字比如100,200,45,4,87,99然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值代码注释很详细了,就不再说明了. //定义一个comdata字符串变量,赋初值为空值 String comdata = ""; //numdata是分拆之后的数字数组 int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0; void setup() { //定义

读取XML 发送网页版邮件

DataSet ds = new DataSet(); ds.ReadXml(AppDomain.CurrentDomain.BaseDirectory + "XML\\Mail.xml"); if (ds.Tables.Count > 0) { DataTable dt = ds.Tables[0]; if (dt.Rows.Count > 0) { body = dt.Rows[0]["content"].ToString(); } } body =

关于STM32-CubeMx工程中串口无法正常发送/接收的问题解决

最近翻船了,万万在第一时间没想到串口无法正常发送数据竟然是因为CubeMX软件设置的问题. 在最近一个项目中由于物料不足,导致一批板子使用了24Mhz和8Mh两种参数的晶振,写程序时也没多想,调试阶段使用的是焊接24Mhz晶振的板子,一切功能OK,可是在将时钟配置24修改未8之后,在8Mhz的板子上竟然出现了BUG,串口无法正常发送/接收数据,首先想到的是波特率,其实也就是时钟,可是没想到竟然是使用CubeMx建立工程的问题,最后还是拿出了之前建立的8MHz的模板来解决的问题. 由于时间问题,尚

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeMX配置外部时钟 注意在进行外部时钟配置时,即"High Speed Clock"和"Low Speed Clock"需配置成"Crytal/Ceramic Resonator(低温/陶瓷谐振器)"不能配置为"BYASS Clock Sour

linux串口驱动分析——发送数据

一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口.步骤不再赘述. static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_wr