为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

将串口接收到的数据保存到EXCEL文档

2012-06-08 10页 pdf 181KB 161阅读

用户头像

is_379182

暂无简介

举报
将串口接收到的数据保存到EXCEL文档 《一》 用 VB DDE 通讯! 《二》 1.启动 excel 从:工具-->宏-->Visual Basic 编辑器,打开 excel VBA. 2.在 ThisWorkbook 上右单击鼠标选择插入--用户窗体 3.单击一下插入的窗体,单击菜单上的--工具--附加控件--选择 Microsoft Communications Control, version 6.0 4.在窗体上添加 mscomm1,添加 commandButton1 5.单串口机子,短接 rs232 的 ...
将串口接收到的数据保存到EXCEL文档
《一》 用 VB DDE 通讯! 《二》 1.启动 excel 从:工具-->宏-->Visual Basic 编辑器,打开 excel VBA. 2.在 ThisWorkbook 上右单击鼠标选择插入--用户窗体 3.单击一下插入的窗体,单击菜单上的--工具--附加控件--选择 Microsoft Communications Control, version 6.0 4.在窗体上添加 mscomm1,添加 commandButton1 5.单串口机子,短接 rs232 的 2 脚和 3 脚,双串口机子用 232 线连接两个串口,注意 2、3 线交叉,我这里 以单串口短接举例。 6.复制以下代码到你的窗体里: VB code 'VBA 代码 Private Sub CommandButton1_Click() MSComm1.Output = "BEG1END" End Sub Private Sub MSComm1_OnComm() Dim t1 As Long, com_String As String Static i As Integer t1 = Timer Select Case MSComm1.CommEvent Case comEvReceive '收到 RThreshold 定义的字符数 1 字节 MSComm1.RThreshold = 0 Do DoEvents Loop While Timer - t1 < 0.1 '延时时间自己调整 com_String = MSComm1.Input MSComm1.RThreshold = 1 i = i + 1: If i > 255 Then i = 1 Application.Cells(3, i).Value = com_String End Select 'ActiveWorkbook.SaveAs Filename:="C:\d1.xls" End Sub Private Sub iniMscomm() 'On Error Resume Next '=====-----初始化通信串口-----===== MSComm1.CommPort = 1 '使用 COM1 MSComm1.Settings = "9600,N,8,1" '9600 波特,无奇偶校验,8 位数据,一个停止位 MSComm1.PortOpen = True '打开端口 MSComm1.RThreshold = 1 '缓冲区有 1 个字节就产生 OnComm 事件 MSComm1.InputLen = 0 '为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全 部的内容。 MSComm1.InputMode = comInputModeText 'Input 以二进制形式取回用 comInputModeBinary,以文本形式 取回是(缺省项) MSComm1.RTSEnable = True MSComm1.InBufferCount = 0 '清空缓冲区 End Sub Private Sub UserForm_Initialize() iniMscomm End Sub 7.双击 thisWorkBook,复制以下代码到窗体里: VB code 'VBA 代码 Private Sub Workbook_Open() UserForm1.Show 0 'UserForm1.Hide End Sub 8.保存文件并关闭 excel,然后再打开你的文件,然后单击你窗体上的按钮看看。 9.这个程序是我为你特意做的,已经做过测试,sys2003 office2003。 10.如果 excel 中有数据输入,再去测试你的设置,注意 com 与波特率的设置。 《三》 mark excel 串口 还有一个办法就是用任何编程,只需将收到的数据用 csv 文件的,生成一个文本文件,然后就可以用 excel 打开了。 这个方法适合于任何语言,只要能生成文本文件就可以了。 如果存成 txt 再打包可以的话, Perl 简单些,不熟悉的人 3 天也能做出来. Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel 《四》 Excel VBA串口通信 2010-01-27 16:41 1466 人阅读 评论(0) 收藏 举报 用 c#也可以实现这种功能,那就是用 serialPort 控件,这里用 VBA 写的,用 MSComm 控 件实现。其实还有另外一个控件叫 NETComm 控件,也可以做,源码中注释很清楚,不再 赘述 [vb:showcolumns:firstline[1]] view plaincopyprint? ·········10········20········30········40········50········60········70········80········90········100·······110······ ·120·······130·······140·······150 1. Private Sub btn_Close_Click() 2. MSComm1.PortOpen = False '打开串口 3. btn_Start.Enabled = True '连接按钮响应 4. btn_Close.Enabled = False '断开按钮变灰 5. End Sub 6. 7. Private Sub btn_exit_Click() 8. If MSComm1.PortOpen = True Then '如果串口被打开 9. MSComm1.PortOpen = False '关闭按钮 10. End If 11. Unload UserForm1 '关闭窗体 12. End Sub 13. 14. Private Sub btn_Start_Click() 15. iniMSComm '对串口控件设置 16. MSComm1.PortOpen = True 17. btn_Close.Enabled = True 18. btn_Start.Enabled = False 19. End Sub 20. 21. Private Sub iniMSComm() '对串口控件设置 22. MSComm1.CommPort = 1 '占用的串口号,1 表示 COM1 23. MSComm1.Settings = "115200,n,8,1" '这个自己根据自己的情况设置 24. 25. MSComm1.RThreshold = 1 26. MSComm1.InputLen = 0 27. 'MSComm1.PortOpen = True'这句话放到连接按钮事件中去 28. MSComm1.InputMode = comInputModeText 29. MSComm1.RTSEnable = True 30. MSComm1.InBufferCount = 0 31. End Sub 32. 33. Private Sub MSComm1_OnComm() '事件处理 34. Dim t1 As Long, com_string As String 35. Static i As Integer 36. t1 = Timer 37. Select Case MSComm1.CommEvent 38. Case comEvReceive '如果接收到数据则执行下列语句 39. MSComm1.RThreshold = 0 40. Do 41. DoEvents 42. Loop While Timer - t1 < 0.1 43. com_string = MSComm1.Input 44. MSComm1.RThreshold = 1 45. i = i + 1: If i > 255 Then i = 1 46. Application.Cells(3, i).Value = com_string '写到 Excel 中去 47. txtRec.Text = txtRec.Text + com_string '写到文本框中去 48. End Select 49. End Sub 《五》 VBA的妙用:串口通讯程序与 EXCEL相结合 发布时间:2010-3-11 发布者:北京世纪长秋科技有限公司 1 VBA 简介 Visual Basic 的应用程序版(VBA)是 Microsoft 公司长期追求的目标,使可编程应用软件得到完美的实现,它作为 一种通用的宏语言可被所有的 Microsoft 可编程应用软件所共享。在没有 VBA 以前,一些应用软件如 Excel、Word、Ac cess、Project 等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不 兼容,使得应用软件之间不能在程序上互联。拥有一种可跨越多个应用软件,使各应用软件产品具有高效、灵活且一致性 的开发工具是至关重要的。VBA 作为一种新一代的宏语言,具有上述跨越多种应用软件并且具有控制应用软件对象 的能力,使得程序设计人员仅需学习一种统一的标准宏语言,就可以转换到特定的应用软件上去,程序设计人员在编程和 调试代码时所看到的是相同的用户界面,而且 VBA 与原应用软件的宏语言相兼容,以保障用户在代码和工作上的投资。 有了 VBA 以后,多种应用程序共用一种宏语言,节省了程序人员的学习时间,提高了不同应用软件间的相互开发和调用 能力。 2 串口通讯程序 简单的串口通讯程序一般是先由上位机向下位机发送读(write)或写(read)数据命令,然后等待下位机应答;下位机接 受到命令之后,首先要对数据命令进行校验,对于符合校验约束的命令下位机会将相应的数据回复到上位机,对于不符合 校验约束的命令下位机或将其抛弃或回复错误信息;上位机接收到下位机的响应之后,首先要对接收到的回复信息进行校 验,对不符合校验约束的数据进行异常处理,对符合校验约束的信息进行解码,解码之后的信息便是上位机从下位机获得 的有效信息了。 上位机向串口发送读命令之后需要等待下位机应答并读取回复信息,常用的等待有 3 种方式: 1) 轮询式 上位机向串口发送读命令之后一直等待下位机应答,通讯程序处于一个等待循环中。 优点:速度快、误码率低(几乎不存在误码)。 缺点:消耗 CPU。(解决办法:使用 Sleep()API 函数)。 2) 消息式 消息式通讯是采用响应 WINDOWS 消息的办法读取串口。 优点:节省 CPU、误码率低。 缺点:发送接收机制过于繁琐。 3) 定时接收式 定时接收式通讯是根据预设的定时器时间进行读取数据。 优点:发送接收机制相对简单、节省 CPU。 缺点:误码率太高,不同的硬件需要配置不同的通讯时间参数,需要严格的校验运算。 3 EXCEL-VBA 串口通讯实例 软件:EXCEL。 硬件:艾默生 EC10 PLC。 功能:通过 EXCEL 中的按钮控制 PLC 的输出继电器 Y0。 界面:RUN(运行通讯)、STOP(停止通讯)、Y0(Y0 ON/OFF 控制)。 主程序: Option Explicit Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Lon g Public com1 As New MSCommLib.MSComm Public y0Stt As Boolean Public y0_on As Boolean Public tmrFlag As Boolean Public tmr As Long Sub runn() On Error GoTo ed com1.Settings = "9600,e,8,1" If com1.PortOpen = False Then com1.PortOpen = True End If tmr = SetTimer(0, 0, 500, AddressOf ontimer) Exit Sub ed: MsgBox "串口打开错误!" End Sub Sub stoppi() If com1.PortOpen = True Then com1.PortOpen = False KillTimer 0, tmr End If End Sub Public Function ontimer() Dim a(7) As Byte Dim add As Long On Error GoTo ed If tmrFlag = False Then tmrFlag = True If y0_on = True Then y0_on = False If y0Stt = True Then a(0) = &H1 a(1) = &H5 a(2) = &H0 a(3) = &H0 a(4) = &HFF a(5) = &H0 a(6) = &H8C a(7) = &H3A com1.Output = a add = 0 Do DoEvents Sleep 10 add = add + 1 If add >= 100 Then Exit Do End If Loop Until com1.InBufferCount >= 8 Else a(0) = &H1 a(1) = &H5 a(2) = &H0 a(3) = &H0 a(4) = &H0 a(5) = &H0 a(6) = &HCD a(7) = &HCA com1.Output = a add = 0 Do DoEvents Sleep 10 add = add + 1 If add >= 100 Then Exit Do End If Loop Until com1.InBufferCount >= 8 End If End If End If tmrFlag = False Exit Function ed: MsgBox "串口错误!" tmrFlag = False End Function 界面程序: Private Sub cmd1_Click() y0_on = True y0Stt = Not y0Stt End Sub Private Sub cmdRun_Click() runn CheckBox1.Value = 1 End Sub Private Sub cmdStop_Click() stopp CheckBox1.Value = 0 End Sub 4 结束语 由上可见,VBA 已经广泛应用于微软的应用软件当中,所以为更好的完善二次开发功能,众多的组态软件都在 V BA 支持上做了努力,世纪星组态软件开发语言已与 VBA 非常相似,相信在未来的版本中,世纪星将全面支持 VBA, 它的二次开发功能会迈上一个新的台阶。 《六》
/
本文档为【将串口接收到的数据保存到EXCEL文档】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索