序言:最近做了一个智能体育项目——跆拳道积分系统,硬件部分会向软件传入振动值等数据,链接方式为串口,所以用到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. js控制easyui文本框例子及控制html例子

    easyui $('#value').textbox('setValue',''); //赋值 $('#value').textbox({required:false});//必填,方框变红 $('# ...

  2. [leetcode]297. Serialize and Deserialize Binary Tree 序列化与反序列化二叉树

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  3. Linux系统minicom命令详解

    minicom 功能说明:调制解调器通信程序 语 法:minicom [-8lmMostz][-a<on或0ff>][-c<on或off>][-C<取文件>][-d ...

  4. spring-boot的三种启动方式[z]

    https://blog.csdn.net/u011425751/article/details/79507386 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记, ...

  5. Xadmin弹出窗口

    Xadmin弹出窗口 需求分析: 1.在添加页面的一对多和多对多字段后面加上+,点击+后,能显示出添加相应字段的窗口 2.提交后窗口关闭,添加的内容显示到当前页面 1.判断出当前字段是否为Foreig ...

  6. centos 7 安装python 3.x

    首先 安装一些 可能需要的依赖: yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-d ...

  7. VS 2015 Android 环境设置

    一般有3个地方需要设置(否则新建项目时会弹出值不能为空 null 参数名:path1.参见:http://www.cnblogs.com/fang8206/p/5020942.html) 1.Tool ...

  8. The current state of generics in Delphi( 转载)

    The current state of generics in Delphi   To avoid duplication of generated code, the compiler build ...

  9. javascript Date对象扩展相关function

    本篇均以es5为主: 1,月份加减来推日期 // 根据所给月份往后推出日期 function getMonth(count) { var date = new Date(); var year = d ...

  10. OpenCV图像分割2

    1.GrubCut算法 2.K-means聚类算法 3.分水岭算法