C#winform小demo-串口传输实现硬件数据回传(SerialPort类使用)
这节介绍实现的是利用SerialPort类进行串口的链接。
.Net Framework 作为微软开发的一个框架,万变不离其宗,要怎么使用一个东西,就最好看它的说明书 。
SerialPort Class 的文档链接:https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport?view=netframework-4.5
它的示例介绍写着:
The following code example demonstrates the use of the SerialPort class to allow two users to chat from two separate computers connected by a null modem cable. In this example, the users are prompted for the port settings and a username before chatting. Both computers must be executing the program to achieve full functionality of this example.
提取重点就是:两个计算机的users 通过使用SerialPort class 去进行聊天 ,两个电脑通过的是a null modem cable(这里应该指的是串口线,因为RS232线的名字是RS232 Cable (Null Modem Cable))进行连接。
我们现阶段主要实现的从串口中获取数据,写数据暂时不需要,所以我们可以在里面提取我们需要的部分。
在文档的左侧,我们可以选择其方法和事件来选择我们所需要的实例。
选取事件中的DataReceived,我们这次所需要的,其实例代码:
using System;
using System.IO.Ports;class PortDataReceived
{public static void Main(){SerialPort mySerialPort = new SerialPort("COM1");mySerialPort.BaudRate = 9600;mySerialPort.Parity = Parity.None;mySerialPort.StopBits = StopBits.One;mySerialPort.DataBits = 8;mySerialPort.Handshake = Handshake.None;mySerialPort.RtsEnable = true;mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);mySerialPort.Open();Console.WriteLine("Press any key to continue...");Console.WriteLine();Console.ReadKey();mySerialPort.Close();}private static void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e){SerialPort sp = (SerialPort)sender;string indata = sp.ReadExisting();Console.WriteLine("Data Received:");Console.Write(indata);}
}
可以看到,微软的实例很清楚的向我们展示了需要初始化的内容和SerialDataReceivedEventHandler的使用,有兴趣的可以先体验实现一下,然后我们看一下我们程序里面使用的版本。
看一下界面:
界面实现,两个 comboBox,DropDownStyle选择DropDownList只允许选不允许修改,然后通过button进行触发(打开/关闭)。comboBox的数据项自己设计,串口这里就可以利用SerialPort.GetPortNames()来获取电脑的串口。
串口comboBox实现代码:
private void Com_comboBox_Click()
{string[] portNamesArray = SerialPort.GetPortNames();this.Com_comboBox.Items.Clear();foreach (var item in portNamesArray){this.Com_comboBox.Items.Add(item);}this.Com_comboBox.Items.Add("");
}
波特率就没什么实现代码啦,数据项我是写了几个常用在item里面了。
(因为停止位什么的都是写死的,所以直接用Label写死)
然后就是按钮的实现代码,里面主要是对串口的初始化和打开 :
private void Com_btn_Click(object sender, EventArgs e){if (!com.IsOpen){try{string serialName = Com_comboBox.SelectedItem.ToString();com.PortName = serialName;string strBaudRate = Bps_comboBox.SelectedItem.ToString();Int32 iBaudRate = Convert.ToInt32(strBaudRate);com.BaudRate = iBaudRate;com.Parity = Parity.None;//无奇偶校验位com.StopBits = StopBits.One;//1个停止位com.Handshake = Handshake.RequestToSend;//控制协议com.ReceivedBytesThreshold = 13;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数com.Handshake = Handshake.RequestToSend;//握手协议:RTS硬件流控制com.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);if (com.IsOpen == true){com.Close();}com.Open();Com_btn.Text = "关闭串口";}catch (Exception ex){MessageBox.Show("错误信息:" + ex.Message + "!");return;}}else{com.Close();Com_btn.Text = "打开串口";}}
DataReceivedHandler的代码:
void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e){try{if (com.IsOpen){try{TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);//自己加的延时Thread.Sleep(waitTime);string str = "";//接收的字符串int count = com.BytesToRead;byte[] readBuffer = new byte[count];//bytecom.Read(readBuffer, 0, count);foreach (byte item in readBuffer){str += Convert.ToChar(item);//byte[] to char ->string}com.DiscardOutBuffer();//outBufferif (count != 0){//线程里不可以直接对UI进行赋值this.Invoke(new System.Threading.ThreadStart(delegate (){/*这里可以更新UI*/}}));}}catch (TimeoutException) { }}else{TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);Thread.Sleep(waitTime);}}catch (Exception ex){MessageBox.Show("错误信息:" + ex.Message + "!");}}
(这里转换数据的方法网上五花八门,而且有的还有些乱码什么的,踏了不少坑还是微软的文档比较省事)
我用的是读取字节,再转成char再拼接成字符串,好像Read可以直接接收Char字符,可以把处理数据那里改成:
// Read (char[] buffer, int offset, int count);char[] readBuffer = new char[count];com.Read(readBuffer, 0, count);foreach (char item in readBuffer){str += item;}
SerialPort类到此就介绍完成了,完成到这里,你的项目已经具备了连接串口、接收数据的功能了(更新UI的代码在更新Ui章节贴出)。
自备串口助手这个就不用说了,除此之外建议大家安装一个虚拟串口工具,在大家没有连接硬件的情况下,通过串口助手发送数据,也能进行测试。
我用的是Configure Virtual Serial Port Driver,添加端口就能用,一个发一个收,还挺好用的。
下一节介绍Chart图表的应用。
C#winform小demo-串口传输实现硬件数据回传(SerialPort类使用)相关推荐
- C#winform小demo-串口传输实现硬件数据回传(数据处理/输出txt文件保存)
这节主要介绍通过串口接收回来的数据,我是如何处理的. 首先跟负责硬件的同学约定好格式,首个字母作为标志,判断是哪一个数据,然后利用字符:和@约定为数据,然后裁剪出来,就获得了数据. 话不多说,上代码( ...
- Apache DolphinScheduler征稿 — 小Demo轻松入门DolphinSchedule大数据调度工具
文章目录 官方文档 | [GitHub源码](https://github.com/apache/dolphinscheduler) 一.从实际需求入手,我们为何要选择使用DolphinSchched ...
- Java小程序之串口传输
前段时间在工作中用到了串口传输方面的知识,前段时间分享了一个博文,里面很仔细的讲解了串口传输的相关知识, https://blog.csdn.net/weixin_41792162/article/d ...
- 启明云端方案分享| 小尺寸串口屏在充电桩的应用
提示:启明云端从2013年起就作为Espressif(乐鑫科技)大中华区合作伙伴,我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程.同时也用心推出了基于乐鑫的相关应用方案!希望你 ...
- 接收udp数据_聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo
最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再UDP方面还有些不了解的地方,所以要给自己扫盲. 好了,咱们进入今天的主题,先列一下提纲: 1. UDP是什么,UDP适 ...
- Android学习小Demo(10)ToDoList的改进版之ViewPager显示多个图片
在TodoList增强版的增加界面上,为了显示图片,我是挖了两块地方,放了两个ImageButton,来显示图片,而且限制了最多只能放两张图片.当两个View都放置图片之后,我就会把"Gal ...
- 电脑向linux板卡传文件,ARM 开发板嵌入式linux系统与主机PC通过串口传输文件
ARM 开发板嵌入式linux系统与主机PC通过串口传输文件 本来以为按以下两篇文章就可以几步轻松搞定这个问题,没想到遇到两个小麻烦: 1,我用的xp虚拟机下redhat9.0做主机,按照下面第一篇文 ...
- 微信小程序小Demo
微信小程序小Demo 调用API,轮播图,排行榜,底部BabTar的使用... board // board/board.js Page({/*** 页面的初始数据*/// 可以是网络路径图片,也可以 ...
- 嵌入式linux与pc串口传输文件基于lrzsz
嵌入式linux与pc串口传输文件基于lrzsz 嵌入式linux传输应用程序通常用nfs.tftp等比较麻烦,一般小应用也就几k用串口就行,这里给出一种串口传输文件的方式lrzsz lzsz需要在开 ...
最新文章
- C# 检测dll的新版本号方法
- 谭浩强C语言程序设计 学习辅导练习题
- 【Java/JFrame/多线程】小球碰到边缘的回弹效果
- 准大学生的实用省钱小技巧
- pycharm 如何自动添加头注释,比如时间,作者信息等
- java判断回文用valueof_判断字符串是否是回文
- 优化理论08-----约束优化的最优性条件、拉格朗日条件、凸性、约束规范、二阶最优性条件(上)
- c语言作业及参考答案,C语言试题及答案
- android仿ios录音动画,仿IOS录音机
- CSS特效(一):制作盒子荧光特效
- Mysql高阶sql语句
- linux下Umail服务的停止
- Excel常用操作标记删除重复项、查找替换文本、更改文本大小写、删除文本中的空格和非打印字符
- css字体毛边属性设置
- 《C#程序设计》猜猜看游戏开发总结
- 电脑显示屏只显示中间部分其他地方不显示问题
- php 判断白天黑夜
- ORA-02292_主表在有子表外键约束的情况,如何快速批量删除和插入数据?
- Git断开与原来远程仓库连接,连接新仓库并重新上传
- 感知器-面向幼儿园的人工智能(2)
热门文章
- Basler工业相机基于opencv 采集图像
- Unity 相机围绕目标旋转、缩放功能实现
- php职教云答案,智慧职教云作业答案,智慧职教期末考试幼儿园课程答案,智慧职教mooc测验答案...
- windows server2012中创建密码重设盘
- 云里黑白第三回——火绒全盘扫描自动重启蓝屏
- ---大数据入门学习笔记(贰)- 初识Hadoop
- 【BIM+GIS】ArcGIS Pro2.8如何打开Revit模型,BIM和GIS融合?
- 微信群裂变有哪些技巧?这款社群裂变工具不要说你还不知道!
- 注册表禁用远程桌面服务器,注册表配置远程桌面终端服务修改远程桌面端口号...
- Microsoft Office 2016安装教程