搜索
bottom↓
回复: 8

Excel-串口配合工具分享

[复制链接]

出0入0汤圆

发表于 2020-10-13 13:25:52 | 显示全部楼层 |阅读模式
本帖最后由 zyqcome 于 2020-10-13 13:35 编辑

-1- 缘由

Excel 作为数据统计的神奇,能非常方便的筛选和生成各种数据
串口作为嵌入式的常见接口,是个板子都会用到
将二者结合起来使用,

  • 方便直观的生成数据
  • 在Excel中点击即可通过串口发送
  • 在Excel中点击即可从串口读回数据


-2- 实现路径
在实现上,我绕过了用vba底层实现串口读写,采用更熟悉的编程语言生成串口读写 exe, 在通过 Excel vba 调用 cmd 运行 底层 exe。
这样的实现,相当于可以调用任一语言平台打包的 exe,在 exe 中封装底层,为实现更丰富的功能留下可能。

-3- 实现细节
-3.1- Excel文件的区别

  • 选择 Excel 后缀为 xlsm 支持宏的文件格式
  • alt + F11 打开 vba 编程面板


-3.2- 底层exe实现
这里实现一个最简单串口发送数据

  • 我自己选择的实现平台是 C# net4.0 32bit
    [**]net4.0 默认支持win7 (目前没有布置win7环境来测试)
    [**]我对 c# 相对要熟悉一些
  • 这里加了些编程内容
    [**]对串口配置以xml文件的形式保存,在每次点击的时候读入配置,这样的实现只在excel点击时候占用串口
    [**]封装了查找当前目录的实现
    [**]封装了串口配置的序列化和反序列化
    [**]对串口open失败的可能做了处理,但没有打印失败信息,为从串口读值留下打印信息


代码实现

  1. class Program
  2. {
  3.     private static MySerialPort _serialPort;
  4.     private static ServiceConfigModel _serviceConfigModel;
  5.     static void Main(string[] sss)
  6.     {
  7.         byte[] result = CommonTool.HexStringToByteArray(sss[0]);
  8.         if (result == null)
  9.         {
  10.             return;
  11.         }
  12.         string path = CommonTool.GetDirectory() + @"\ConsoleAppConfig.xml";
  13.         _serviceConfigModel = new ServiceConfigModel();
  14.         _serviceConfigModel = SerializeTool<ServiceConfigModel>.ReadXML(path);
  15.         _serialPort = new MySerialPort();
  16.         _serialPort.ConfigService(_serviceConfigModel.PortName, _serviceConfigModel.ConfigDates);

  17.         try
  18.         {
  19.             _serialPort.Open();
  20.             _serialPort.Write(result, 0, result.Length);
  21.             _serialPort.Close();
  22.         }
  23.         catch
  24.         {   
  25.             _serialPort = null; // 其实这个没必要,当总要放点啥在这才安心
  26.         }
  27.     }
  28. }
复制代码

代码就是一个很简单的控制台程序

-3.3- Excel的命令行调用
这个实现是对比了几种实现,搜了好一通才找到了,目前这种实现基本满意,唯一的不好的地方是 cmd 窗口会弹一下,目前把它当成有没有成功调用的提醒

在 excel vba 中添加一个模块,注意是添加一个模块 键入以下内容

  1. Public Sub SendStringNoRead(abc As String)
  2.     Dim strProgramName As String
  3.     strProgramName = Application.ActiveWorkbook.Path & "\ConsoleApp.exe " & abc
  4.     ShellRun (strProgramName)
  5. End Sub

  6. '网上搜到的实现
  7. Public Function ShellRun(sCmd As String) As String

  8.     'Run a shell command, returning the output as a string

  9.     Dim oShell As Object
  10.     Set oShell = CreateObject("WScript.Shell")

  11.     'run command
  12.     Dim oExec As Object
  13.     Dim oOutput As Object
  14.     Set oExec = oShell.Exec(sCmd)
  15.     Set oOutput = oExec.StdOut

  16.     'handle the results as they are written to and read from the StdOut object
  17.     Dim s As String
  18.     Dim sLine As String
  19.     While Not oOutput.AtEndOfStream
  20.         sLine = oOutput.ReadLine
  21.         If sLine <> "" Then s = s & sLine & vbCrLf
  22.     Wend

  23.     ShellRun = s

  24. End Function
复制代码


SendStringNoRead这个函数的功能是

  • 接收单击单元格的值-就是输入参数
  • 给出 exe 的路径 并把 命令行参数拼上去
  • 调用函数 ShellRun 实现exe执行


-3.4- Excel单击发送的实现
  • 在对应的 Sheet对象上双击
  • 选择 Worksheet 中的 SelectionChange


键入下面的代码

  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If Target.Column = 11 Then
  3.         If Target.Count = 1 Then
  4.             If Target.Value <> "" Then
  5.                 SendStringNoRead (Target.Value)
  6.             End If
  7.         End If
  8.      End If
  9. End Sub
复制代码


要解释一下,这几个if

  • Target.Column = 11 选择的 第11列
  • Target.Count = 1 筛出单个格子点击的情况
  • Target.Value <> "" 单个格子的内容不为空


tip:这里有个地方,命令行是以空格分割参数的,我不想再往字符串上加双引号,所以Excel生成的命令不能有空格(这个可以在 Excel 中观察到)


-4- 往后的方向
  • 加入可配置的读串口
  • 加入 modbus 协议
  • 等等,待更新


-5- 测试指南
建议先通过虚拟串口,用命令行中测试 exe 能否使用
假设有两个直连的串口 COM2 <----> COM1

在命令行中
  1. //xml中配置 COM2
  2. >ConsoleApp.exe A55A0582036B0001
  3. >_
复制代码


在另一个串口调试器中连接 COM1
  1. [10:28:27.789]收←◆ A5 5A 05 82 03 6B 00 01
复制代码


测试文件下载 -- 文件是在实际的文件中简化的,所有不用奇怪 Excel 的空格 另外有异常报告可以留言



添加一个图片说明吧






排版还是有些不好用

你也可以看markdown 的博客  link

----修改记录---
0 添加博客链接
1 修改排版
2 添加图片说明

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2020-10-13 13:29:26 | 显示全部楼层
占楼定位

出0入0汤圆

发表于 2020-10-13 13:30:27 | 显示全部楼层
谢谢分享!

  

出0入0汤圆

发表于 2020-10-13 17:30:28 | 显示全部楼层
这种发送方式新颖,谢谢分享!

出0入89汤圆

发表于 2020-10-13 18:09:38 | 显示全部楼层
大概15年前,也就是2005年我做过一个Excel中群发短信的,做成一个excel的插件,显示在excel菜单里面。一点就弹出窗口可以吧excel数据读进来。改一改应该可以实现楼主这样的功能。不过时间太久远了,懒得搞了。楼主加油。

出0入8汤圆

发表于 2020-10-13 19:24:13 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2020-10-13 21:04:01 | 显示全部楼层

谢谢分享!

出0入0汤圆

发表于 2020-10-13 21:18:53 | 显示全部楼层
这个真是不错的思路

出0入42汤圆

发表于 2020-10-13 21:24:40 来自手机 | 显示全部楼层
没有听说过这种用法,看来还是要多多学习啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-16 22:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表