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

值得注意的是:

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

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

首先需要引用SerialPort

using System.IO.Ports;

创建全局串口对象

SerialPort com;

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

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

Byte数组转换成16进制方法

/// <summary>
/// Byte数组转换成16进制
/// </summary>
/// <param name="bArr"></param>
/// <returns></returns>
String bytesToHexString(byte[] bArr)
{
string result = string.Empty;
for (int i = ; i < ; i++)//逐字节变为16进制字符,以%隔开
{
result += Convert.ToString(bArr[i], ).ToUpper().PadLeft(, '') + " ";
}
return result;
}

发送数据

/// <summary>
/// 发送数据
/// </summary>
void SendData()
{
Byte[] TxData = { , , , , , , , };
com.Write(TxData, , );
}

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

        /// <summary>
/// 监听串口数据线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (com.IsOpen)
{
try
{
int byteNumber = com.BytesToRead;
Thread.Sleep(); //延时等待数据接收完毕。
while ((byteNumber < com.BytesToRead) && (com.BytesToRead < ))
{
byteNumber = com.BytesToRead;
Thread.Sleep();
} int n = com.BytesToRead; //记录下缓冲区的字节个数
byte[] buf = new byte[n]; //声明一个临时数组存储当前来的串口数据
com.Read(buf, , n); //读取缓冲数据到buf中,同时将这串数据从缓冲区移除 //设置文字显示
Control.CheckForIllegalCrossThreadCalls = false;
StringBuilder sb = new StringBuilder();
for (int i = ; i < n; i++)
{
string s;
if (buf[i] < )
s = "" + Convert.ToString(buf[i], ).ToUpper() + " ";
else
s = Convert.ToString(buf[i], ).ToUpper() + " "; sb.Append(s);
}
textBox3.Text += sb.ToString() +"\r\n";
}
catch (Exception ee)
{
}
}
else
{
TimeSpan waitTime = new TimeSpan(, , , , );
Thread.Sleep(waitTime);
}
Thread.Sleep();
}
catch (Exception ex)
{ }
}

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

  

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. zabbix3.4 监控ESXI6.7

    一.ESXI WEB界面 管理--高级配置启用 键 Config.HostAgent.plugins.solo.enableMob 访问:https://10.81.1.219/mob/?moid=h ...

  2. 业务数据实体(model) 需要克隆的方法

    业务数据实体(model) 需要克隆的时候 可以使用 Json.Deserialize<InquireResult>(Json.Serialize<InquireResult> ...

  3. input text 只能输入数字

    添加 onkeyup="value=value.replace(/[^\d]/g,'')"

  4. 在当前目录打开DOS命令窗口

    Windows7系统:Shift + 鼠标右键 Windows10系统:Shift + 鼠标右键打开Power shell,在Power shell的命令窗口中输入:start cmd

  5. Linux驱动之输入子系统简析

    输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...

  6. linux kernel notifier chain(事件通知链)

    Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制(notif ...

  7. php5.6 phpmystudy 版本出问题

    No input file specified的解决方法 https://jingyan.baidu.com/article/f7ff0bfccce11c2e26bb1381.html

  8. 《C#从现象到本质》读书笔记(九)第11章C#的数据结构

    <C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...

  9. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20175316 盛茂淞 2018-2019-2 <Java程序设计>实验一 Java开发环境的熟悉 实验报告 一.实验要求 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA ...

  10. 2019.02.21 bzoj2739: 最远点(决策单调性+分治)

    传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...