物联网架构成长之路(37)-基于C#开发串口工具
0. 前言
作为物联网平台开发,最基础的工具链还是要有的。前几篇博客,介绍了用C#开发一个MQTT的客户端,用于模拟设备连接平台,并发送数据到平台。但是对于一些硬件来说,可能会用到串口uart来发送数据。然后经过模块,转换为JSON再通过MQTT发往平台。这个适合需要开发一些工具来协助开发。平台固然重要,但是对应的工具链也是比较重要的。
1. 创建虚拟串口
要做一个串口工具,为了方便调试,我们需要安装一个虚拟串口软件。模拟两个串口,然后用标准的串口工具来发送数据,自己开发的工具用来接收数据。
http://www.greenxf.com/soft/213933.html 可以在这里下载破解版。
先安装第二个原版。然后用第一个打开。
打开后,创建虚拟串口
2. C#串口编程
效果图(本工具,不开源,不给代码):
3. 参考代码
#region 模块串口功能 private void btnSerialModulRefresh_Click(object sender, EventArgs e)
{
string[] names = SerialPort.GetPortNames();
if(names == null || names.Length <= )
{
MessageBox.Show("未找到串口COM 可以在这里下载虚拟串口工具: http://www.greenxf.com/soft/213933.html");
return;
}
cbbSerialModulCOM.Items.Clear();
cbbSerialModulCOM.Items.AddRange(names);
cbbSerialModulCOM.SelectedItem = names[];
} private void btnSerialModulOpen_Click(object sender, EventArgs e)
{
try
{
if (serialModulPort.IsOpen)
{
//串口处于打开状态
serialModulPort.Close();
btnSerialModulOpen.Text = "●打开串口";
btnSerialModulOpen.ForeColor = Color.Red;
txtSerialModulRecv.Text = ""; cbbSerialModulCOM.Enabled = true;
cbbSerialModulDataBits.Enabled = true;
cbbSerialModulParity.Enabled = true;
cbbSerialModulRate.Enabled = true;
cbbSerialModulStopBits.Enabled = true;
}
else
{
if (string.IsNullOrEmpty(cbbSerialModulCOM.Text))
{
MessageBox.Show("串口COM不能为空");
return;
} //串口处于关闭状态,需要设置好属性后打开
cbbSerialModulCOM.Enabled = false;
cbbSerialModulDataBits.Enabled = false;
cbbSerialModulParity.Enabled = false;
cbbSerialModulRate.Enabled = false;
cbbSerialModulStopBits.Enabled = false; serialModulPort.PortName = cbbSerialModulCOM.Text;
serialModulPort.BaudRate = Convert.ToInt32(cbbSerialModulRate.Text);
serialModulPort.DataBits = Convert.ToInt16(cbbSerialModulDataBits.Text); string parity = cbbSerialModulParity.Text;
if (parity.Equals("None"))
{
serialModulPort.Parity = Parity.None;
}else if (parity.Equals("Odd"))
{
serialModulPort.Parity = Parity.Odd;
}else if (parity.Equals("Even"))
{
serialModulPort.Parity = Parity.Even;
}else if (parity.Equals("Mark"))
{
serialModulPort.Parity = Parity.Mark;
}else if (parity.Equals("Space"))
{
serialModulPort.Parity = Parity.Space;
} string stopbit = cbbSerialModulStopBits.Text;
if (stopbit.Equals(""))
{
serialModulPort.StopBits = StopBits.One;
}else if (stopbit.Equals("1.5"))
{
serialModulPort.StopBits = StopBits.OnePointFive;
}else if (stopbit.Equals(""))
{
serialModulPort.StopBits = StopBits.Two;
} serialModulPort.Open();
btnSerialModulOpen.Text = "●关闭串口";
btnSerialModulOpen.ForeColor = Color.Blue;
}
}catch(Exception ex)
{
serialModulPort = new SerialPort();
btnSerialModulOpen.Text = "●打开串口";
btnSerialModulOpen.ForeColor = Color.Red;
txtSerialModulRecv.Text = ""; cbbSerialModulCOM.Enabled = true;
cbbSerialModulDataBits.Enabled = true;
cbbSerialModulParity.Enabled = true;
cbbSerialModulRate.Enabled = true;
cbbSerialModulStopBits.Enabled = true;
//出现可能的错误
MessageBox.Show(ex.Message);
}
} private void btnSerialModulPortSend_Click(object sender, EventArgs e)
{
try
{
if (serialModulPort.IsOpen)
{
string data = txtSerialModulSend.Text.Replace(" ", "");
if (string.IsNullOrEmpty(data))
{
MessageBox.Show("请先在发送区填写发送数据(十六进制)");
return;
}
byte[] bytes = HexStrTobyte(data);
serialModulPort.Write(bytes, , bytes.Length);
}
else
{
MessageBox.Show("请先打开串口COM");
}
}catch(Exception ex)
{
serialModulPort = new SerialPort();
btnSerialModulOpen.Text = "●打开串口";
btnSerialModulOpen.ForeColor = Color.Red;
txtSerialModulRecv.Text = ""; cbbSerialModulCOM.Enabled = true;
cbbSerialModulDataBits.Enabled = true;
cbbSerialModulParity.Enabled = true;
cbbSerialModulRate.Enabled = true;
cbbSerialModulStopBits.Enabled = true;
//出现可能的错误
MessageBox.Show(ex.Message);
}
} private void serialModulPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Console.WriteLine("收到数据");
try
{
//因为要访问UI资源,所以需要使用invoke方式同步ui
Invoke((EventHandler)(delegate{
txtSerialModulRecv.Text = "";
int size = serialModulPort.BytesToRead;
string buf = "";
for(int i=; i<size; i++)
{
byte c = (byte)serialModulPort.ReadByte();
buf += ByteToHexString(c) + " ";
}
txtSerialModulRecv.Text = buf;
}));
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
MessageBox.Show(ex.Message);
}
} private void btnSerialModulPortClearRecv_Click(object sender, EventArgs e)
{
txtSerialModulRecv.Text = "";
}
#endregion
参考文章:
https://www.cnblogs.com/liaocheng/p/9144317.html
本文地址: https://www.cnblogs.com/wunaozai/p/11665404.html
物联网架构成长之路(37)-基于C#开发串口工具的更多相关文章
- 物联网架构成长之路(31)-EMQ基于HTTP权限验证
看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...
- 物联网架构成长之路(25)-Docker构建项目用到的镜像1
0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...
- 物联网架构成长之路(32)-SpringBoot集成MQTT客户端
一.前言 这里虽然是说MQTT客户端.其实对于服务器来说,这里的一个具有超级权限的MQTT客户端,就可以做很多事情.比如手机APP或者网页或者第三方服务需要发送数据到设备,但是这些又不是设备,又不能让 ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
- 物联网架构成长之路(35)-利用Netty解析物联网自定义协议
一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...
- 物联网架构成长之路(3)-EMQ消息服务器了解
1. 了解 物联网最基础的就是通信了.通信协议,物联网协议好像有那么几个,以前各个协议都有优劣,最近一段时间,好像各大厂商都采用MQTT协议,所以我也不例外,不搞特殊,采用MQTT协议,选定了协议,接 ...
- 物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
1. 前言 按照我自己设计的物联网框架,对于MQTT集群中的所有消息,是要持久化到磁盘的,这里采用一个消息队列中间件Kafka作为数据缓冲,缓冲结果存到数据仓库中,以供后续作为数据分析.由于MQTT集 ...
- 物联网架构成长之路(16)-SpringCloud从入门到吹水
1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/ ...
- 物联网架构成长之路(33)-EMQ数据存储到influxDB
一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...
随机推荐
- C语言程序设计100例之(12):Eratosthenes筛法求质数
例12 Eratosthenes筛法求质数 问题描述 Eratosthenes筛法的基本思想是:把某范围内的自然数从小到大依次排列好.宣布1不是质数,把它去掉:然后从余下的数中取出最小的数,宣布它 ...
- LeetCode 205:同构字符串 Isomorphic Strings
题目: 给定两个字符串 s 和 *t*,判断它们是否是同构的. 如果 s 中的字符可以被替换得到 *t* ,那么这两个字符串是同构的. 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字 ...
- asp.net 使用NPOI读取excel文件
asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...
- layui 使用随记
layui confir使用 不显示右上角关闭按钮 针对提示框内按钮指定操作 layer.confirm("这里填写提示信息", {closeBtn:0,icon: 0, titl ...
- go-goroutine 和 channel
goroutine 和 channel goroutine-看一个需求 需求:要求统计 1-9000000000 的数字中,哪些是素数? 分析思路: 1) 传统的方法,就是使用一个循环,循环的判断各个 ...
- PlayJava Day005
今日所学: /* 2019.08.19开始学习,此为补档. */ 类:一类事物的抽象体(如全人类,学生类,订单类) 对象:具体的个体(如张三,某个外卖订单) 对象具有属性和行为. 声明的属性语句一般放 ...
- 数据库系统原理(第四章:SQL与关系数据库基本操作 )
一.SQL概述 sql是结构化查询语言(Structured Query Language,SQL)是专门用来与数 据库通信的语言,它可以帮助用户操作关系数据库. SQL的特点: SQL不是某个特定数 ...
- 0基础入门学习Python(第4章)
第四章,了不起的分支和循环 4.1 分支和循环 Python主要依靠缩进来区分代码块 4.2 快速上手 成绩按照分数来划分等级,90分以上为A,80~90 为B,60~80 为C,60以下为D p4_ ...
- Android Studio当中的创建新方法的快捷键该如何使用?
当有红线出现的时候,我们的代码并没有编译出错,则需要输入alt+enter则可以得到相应的神奇效果了.这个方法我竟然今天才知道,也真是丢脸了.比如说我们书写了一个新的没有创建的方法,我们直接输入alt ...
- Cygwin添加右键菜单
修改注册表 统一的方式,添加一个右键命令 找到HKEY_CLASSES_ROOT\Directory\Background\shell 右键,新建项.名字随便起 再次右键,新建项.命名command ...