序言:最近做了一个智能体育项目——跆拳道积分系统,硬件部分会向软件传入振动值等数据,链接方式为串口,所以用到SerialPort类。

值得注意的是:

  DataReceived 方法,当串口缓冲区有数据时执行该方法。

  ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。串口接收的指令可能是错误值,所以这块根据自己需求进行设置。

首先需要引用SerialPort

  1. using System.IO.Ports;

创建全局串口对象

  1. SerialPort com;

SerialPort配置,并打开端口进行接收数据

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3. com = new SerialPort("COM5"); //实例化SerialPort并设置COM口
  4. com.BaudRate = ;//波特率
  5. com.Parity = Parity.None;//无奇偶校验位
  6. com.StopBits = StopBits.Two;//两个停止位
  7. com.Handshake = Handshake.RequestToSend;//控制协议
  8. com.ReceivedBytesThreshold = ;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数,我这里是13字节为一组
  9. com.Open(); //打开串口
  10. com.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived); //接受数据线程
  11. }
  1. /// <summary>
  2. /// 监听串口数据线程
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
  7. {
  8. try
  9. {
  10. if (com.IsOpen)
  11. {
  12. byte[] readBuffer = new byte[com.ReadBufferSize + ];
  13. try
  14. {
  15. int count = com.Read(readBuffer, , com.ReadBufferSize); //读取串口数据(监听)
  16. //String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count);
  17. if (count != )
  18. {
  19. //将返回值byte数组转换为string类型数据
  20. String result = bytesToHexString(readBuffer);
  21.  
  22. //这里强调一下,线程里不可以直接对UI进行赋值
  23. this.BeginInvoke(new System.Threading.ThreadStart(delegate ()
  24. {
  25. textBox1.Text = result; //对控件进行赋值
  26. }));
  27. }
  28. }
  29. catch (TimeoutException) { }
  30. }
  31. else
  32. {
  33. TimeSpan waitTime = new TimeSpan(, , , , );
  34. Thread.Sleep(waitTime);
  35. }
  36. }
  37. catch (Exception ex)
  38. {
  39.  
  40. }
  41. }

Byte数组转换成16进制方法

  1. /// <summary>
  2. /// Byte数组转换成16进制
  3. /// </summary>
  4. /// <param name="bArr"></param>
  5. /// <returns></returns>
  6. String bytesToHexString(byte[] bArr)
  7. {
  8. string result = string.Empty;
  9. for (int i = ; i < ; i++)//逐字节变为16进制字符,以%隔开
  10. {
  11. result += Convert.ToString(bArr[i], ).ToUpper().PadLeft(, '') + " ";
  12. }
  13. return result;
  14. }

发送数据

  1. /// <summary>
  2. /// 发送数据
  3. /// </summary>
  4. void SendData()
  5. {
  6. Byte[] TxData = { , , , , , , , };
  7. com.Write(TxData, , );
  8. }

续补:串口数据接受不完整处理方法

  1. /// <summary>
  2. /// 监听串口数据线程
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
  7. {
  8. try
  9. {
  10. if (com.IsOpen)
  11. {
  12. try
  13. {
  14. int byteNumber = com.BytesToRead;
  15. Thread.Sleep();
  16.  
  17. //延时等待数据接收完毕。
  18. while ((byteNumber < com.BytesToRead) && (com.BytesToRead < ))
  19. {
  20. byteNumber = com.BytesToRead;
  21. Thread.Sleep();
  22. }
  23.  
  24. int n = com.BytesToRead; //记录下缓冲区的字节个数
  25. byte[] buf = new byte[n]; //声明一个临时数组存储当前来的串口数据
  26. com.Read(buf, , n); //读取缓冲数据到buf中,同时将这串数据从缓冲区移除
  27.  
  28. //设置文字显示
  29. Control.CheckForIllegalCrossThreadCalls = false;
  30. StringBuilder sb = new StringBuilder();
  31. for (int i = ; i < n; i++)
  32. {
  33. string s;
  34. if (buf[i] < )
  35. s = "" + Convert.ToString(buf[i], ).ToUpper() + " ";
  36. else
  37. s = Convert.ToString(buf[i], ).ToUpper() + " ";
  38.  
  39. sb.Append(s);
  40. }
  41. textBox3.Text += sb.ToString() +"\r\n";
  42. }
  43. catch (Exception ee)
  44. {
  45. }
  46. }
  47. else
  48. {
  49. TimeSpan waitTime = new TimeSpan(, , , , );
  50. Thread.Sleep(waitTime);
  51. }
  52. Thread.Sleep();
  53. }
  54. catch (Exception ex)
  55. {
  56.  
  57. }
  58. }

到这里就结束了,网上也有一些测试串口数据的程序,我这也有一个但是不记得在哪里下载的了,如果有需要跟我吱一声~

  

C# 串口类SerialPort的使用方法的更多相关文章

  1. C#中用SerialPort类中的Write()方法发送十六进制数

    在C#中用SerialPort类中的Write()方法向串口发送十六进制数的方法: MSDN对SerialPort::Write()是这样解释的: 将数据写入串行端口输出缓冲区. 重载列表   名称 ...

  2. c#实现串口操作 SerialPort

    命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问. 操作类声明: SerialPort sp = ...

  3. mfc的一个串口类

    这几天一直再看串口相关知识,对于其总结为如下串口类: 头文件声明如下: #pragma once // 声明当串口接收到线程的时候调用的函数指针 // 参数: 1,接收到的数据: 2,数据长度: 3, ...

  4. Remon Spekreijse CSerialPort串口类的修正版2014-01-10

    转自:http://m.blog.csdn.net/blog/itas109/18358297# 2014-1-16阅读691 评论0 如需转载请标明出处:http://blog.csdn.net/i ...

  5. Qt 串口类QSerialPort 使用笔记

    Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了.但是由于RS232串口操作简单.通讯可靠,在工业领域中仍然有大量的应用.Qt以前的版本中,没有提供 ...

  6. CSerialPort串口类最新修正版(解决关闭死锁问题)2014-01-11

    这是一份优秀的类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等.Remon提供的串口类网址为:http://codeguru.earthweb.com/network/ ...

  7. CSerialPort串口类最新修正版(解决关闭死锁问题)

    这是一份优秀的类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等.Remon提供的串口类网址为:http://codeguru.earthweb.com/network/ ...

  8. <QT之Bug制造机>QT中串口类“QSerialPort”的学习笔记

    QT5中已经增加了串口类QSrialPort,可以直接调用API函数进行快速开发. 1. 获取串口信息 Dialog::Dialog(QWidget *parent) : QDialog(parent ...

  9. C#串口类封装 SuperSerialPort

    C#串口类封装 SuperSerialPort 基于SerialPort类做了简单的封装方便调用 代码 /// <summary> /// SuperSerialPort /// < ...

随机推荐

  1. maven项目update报错

    MAVEN项目报错:An internal error occurred during: "Updating Maven Project" java.lang.NullPoint ...

  2. Linux进程的原理及与信号的联系

    第1节 程序.进程.守护进程.僵尸进程的区别 程序.进程.守护进程.僵尸进程: 程序:c/php/java,代码文件,静态的,放在磁盘里的数据. 进程:正在内存中运行的程序,进程是动态的,会申请和使用 ...

  3. python中type、class、object之间的关系

    先看一段代码 # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/11/13 18:40' a = 1 b = 'abc' pri ...

  4. webapi 重复提交问题

    https://izen.live/Blog/info/13.html /// <summary> /// action方法过滤器 /// </summary> public ...

  5. MySQL优化(五) SQL 语句的优化 索引、explain

    一.索引 1.分类 (1)主键索引:当一张表的某个字段设置为主键时,该字段就是主键索引: (2)唯一索引:索引列中的值必须是唯一的,但是允许为空值(可以存在多个null): (3)普通索引:基本索引类 ...

  6. python 之 函数

    什么是函数 引言 现在有这么个情况:假设我们python中的len方法不可以使用了,而恰好你又要计算一个字符串的长度你该怎么办呢?有人说:‘简单,可以使用for循环嘛 s1 = "hello ...

  7. 多进程和mongo的配合使用

    这篇文章主要是讲在多线程下使用mongo数据库的一个报错,算是一个警告,如下: /usr/lib64/python2.6/site-packages/pymongo/topology.py:75: U ...

  8. Connection lost: The server closed the connection

    想必很多初学者都会遇到这个问题 其实很简单.mysql有个机制,就是8小时无通信,myslq就会自动关闭数据; 解决方案(2选1): 或者: 1.定时去做一个查询,就是 select * from X ...

  9. 《笨方法学Python》加分题10

    print(r"\n [换行]演示:", "\n第一行\n第二行") print("-" * 20) print(r"\\ [反斜 ...

  10. 20165213Java第二次实验

    实验二Java面向对象程序设计 实验1 实验目的与要求: 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 提交 ...