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。事件DataReceived
SerialPort 提供了DataReceived事件。当有数据进入时,该事件被触发。该事件的触发由操作系统决定,当有数据到达时,该事件在辅助线程中被触发。辅助线程的优先级比较低,因此并不能确保每个字节的数据到达时,该事件都被触发。
在使用该事件接收数据时,最好对定义通讯协议格式,添加桢头和桢尾。在DataReceived事件中接收数据时,把数据放在数组中或字符串中缓冲起来,当接收的包含桢头和桢尾的完整数据时,在进行处理,另外,为了有效地接收数据,可以在每次读取数据后,加入System.Threading.Thread.Sleep方法进行演示。

8。其他
用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过串口的第2、3针的连接可以对程序进行检测。

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

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

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

对于长度的完整性,可以用同步方式接收数据,在从线程用serialPort.BytesToRead 判断累计接收字节的长度.

对于预先知道结尾处字节的完整性,你可以用serialPort.ReadTo (string value)方法读取数据(value为结尾处的字符串)

对 于长度和结尾处字节不能确定信息的完整性处理,我的一种方法是用异步的方式,这种方法需事先估计出接收对方信息所需的时间,将此时间设置为从线程睡眠的时 间。另一种方法是用同步方式接收,当SerialPort.ReadByte()方法阻塞到接收到初始始数据后,从线程每次睡眠一个短暂的时间,用 serialPort.BytesToRead ==0判断有无新数据.若有新数据,从线程继续睡眠;若没有新数据到来,说明数据是完整的。

当然数据完整接收后,仍要用接收数据的协议(头、尾字节、校验等方式)判断数据的正确性,保证数据真正是完整的。

转载于:https://www.cnblogs.com/JuneZhang/p/3625258.html

SerialPort使用相关推荐

  1. linux安装语言总是waiting,node的serialport在arm的Linux安装血泪史之我太难了

    0.序 本人在arm的Linux系统上serialport耗时5天,现在想想都头皮发麻! 下面我简单说一下过程,由于error时没有截图留档,关于出现的error,我就用语言描述一下,要是有什么不理解 ...

  2. C#利用SerialPort类对串口发送接收数据

    1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...

  3. serialport接收串口数据_C#串口操作类,包括串口读写操作

    串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...

  4. SerialPort实现对串口COM的操作(有些纠结)

    这段时间做了一个小型贷款软件,包括客户管理,交易管理,存折管理和打印,统计分析等模块,其中要求结合存折读卡器一起使用,比如添加存折的时候,存折号要求刷完卡后读出来,刷卡后可以显示客户信息等,和银行的刷 ...

  5. 在C#中使用SerialPort类实现串口通信

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

  6. POS 客显 设备 显示 总价 单价 找零 收款 C# SerialPort 法

    在网上找了一堆的方法 基本都是C++或者VB 的DLL调用之类的     其实还有另一种2005的SerialPort方法  下载源代码    ---------------------------控 ...

  7. SerialPort.DataReceived 事件

    https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived.aspx

  8. 串口使用stream_使用SerialPort库进行Node物联网项目开发

    如果说Nodejs将JavaScript的应用从网页端扩展到了服务器和操作系统端,Electron为JavaScript实现了跨平台应用的能力,那么SerialPort就是打通JavaScript软件 ...

  9. 使用Java进行串口SerialPort通讯

    1.准备工作 在进行串口连接通讯前,必须保证你当前操作电脑上有可用且闲置的串口.因为一般的电脑上只有一个或者两个串口,如COM1或COM2,但大多数情况下,这些串口可能会被其他的程序或者应用所占用,所 ...

  10. c# SerialPort会出现“已关闭 Safe handle”的错误

    c# SerialPort使用时出现"已关闭 Safe handle"的错误 我在开发SerialPort程序时出现了一个问题,在一段特殊的扫描代码的时候会出现"已关闭 ...

最新文章

  1. R,Git和Github(上)
  2. ACS AD 和本地验证SSL ×××
  3. Android --- Unable to resolve dependency for ‘:app@debug/compileClasspath‘: Could not resolve com.a
  4. nvm-windows的安装配置
  5. 有一种小说叫“纯爱”:为“纯爱小说系列写的序言
  6. glassfish5_将Glassfish 3连接到外部ActiveMQ 5代理
  7. 嵌入式开发-lesson9-顺序结构程序设计
  8. 手把手教你在Modelarts平台上进行视频推理
  9. java 继承 extends
  10. 大神是如何装逼的 之 vim插件使用taglist和nerdtree
  11. 在线ERD工具DrawERD
  12. [信号]预加重与去加重--转
  13. 密码学(一):古典密码之维吉尼亚密码原理介绍
  14. html中闰年的计算方法,什么是闰年(怎么计算)
  15. 王者荣耀官网全皮肤超超超清原皮爬取!!!
  16. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄
  17. Matlab中图像剪裁命令——imcrop()
  18. CIMISS数据获取流程
  19. 太阳能心率智能骑行仪(STM32)
  20. 产生任意进制乘法表的程序代码

热门文章

  1. 总结常见应用层协议端口号
  2. Whatsup-gold简介
  3. Java中容器大全(Java基础篇)
  4. Java后端之数据库操作事务回滚
  5. 三相三线STATCOM仿真模型。无功电流采用ipiq检测,pwm采用滞环控制。
  6. KEIL 调试【调试lib库】【调试模式快捷键】【debug init脚本】【 Pre-Download Script into脚本(utilities下init file)】【将数据导出到文件】
  7. U2 掌握U盘分区与启动-孙宇彤-专题视频课程
  8. OpenAL 3D效果营造
  9. python自动修图_3 行 Python 代码 5 秒抠图的 AI 神器,根本无需 PS
  10. C语言程序——变量及其应用