将串口接收到的数据保存到EXCEL文档.docx
《将串口接收到的数据保存到EXCEL文档.docx》由会员分享,可在线阅读,更多相关《将串口接收到的数据保存到EXCEL文档.docx(14页珍藏版)》请在冰点文库上搜索。
将串口接收到的数据保存到EXCEL文档
《一》
用VBDDE通讯!
《二》
1.启动excel从:
工具-->宏-->VisualBasic编辑器,打开excelVBA.
2.在ThisWorkbook上右单击鼠标选择插入--用户窗体
3.单击一下插入的窗体,单击菜单上的--工具--附加控件--选择MicrosoftCommunicationsControl,version6.0
4.在窗体上添加mscomm1,添加commandButton1
5.单串口机子,短接rs232的2脚和3脚,双串口机子用232线连接两个串口,注意2、3线交叉,我这里以单串口短接举例。
6.复制以下代码到你的窗体里:
VBcode
'VBA代码
PrivateSubCommandButton1_Click()
MSComm1.Output="BEG1END"
EndSub
PrivateSubMSComm1_OnComm()
Dimt1AsLong,com_StringAsString
StaticiAsInteger
t1=Timer
SelectCaseMSComm1.CommEvent
CasecomEvReceive'收到RThreshold定义的字符数1字节
MSComm1.RThreshold=0
Do
DoEvents
LoopWhileTimer-t1<0.1'延时时间自己调整
com_String=MSComm1.Input
MSComm1.RThreshold=1
i=i+1:
Ifi>255Theni=1
Application.Cells(3,i).Value=com_String
EndSelect
'ActiveWorkbook.SaveAs"C:
\d1.xls"
EndSub
PrivateSubiniMscomm()
'OnErrorResumeNext
'=====初始化通信串口
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
EndSub
PrivateSubUserForm_Initialize()iniMscomm
EndSub
7.双击thisWorkBook,复制以下代码到窗体里:
VBcode
'VBA代码
PrivateSubWorkbook_Open()
UserForm1.Show0
'UserForm1.Hide
EndSub
8.保存文件并关闭excel,然后再打开你的文件,然后单击你窗体上的按钮看看。
9.这个程序是我为你特意做的,已经做过测试,sys2003office2003。
10.如果exceI中有数据输入,再去测试你的设置,注意com口号与波特率的设置
《二》
markexcel串口
还有一个办法就是用任何编程,只需将收到的数据用csv文件的格式,生成一个文本文件,然后就可以用
excel打开了。
这个方法适合于任何语言,只要能生成文本文件就可以了。
如果存成txt再打包可以的话,Perl简单些,不熟悉的人3天也能做出来.
Spreadsheet:
:
WriteExcel和Spreadsheet:
:
ParseExcel
《四》
ExcelVBA串口通信
2010-01-2716:
411466人阅读评论(0)收藏举报
用c#也可以实现这种功能,那就是用serialPort控件,这里用VBA写的,用MSComm控
件实现。
其实还有另外一个控件叫NETComm控件,也可以做,源码中注释很清楚,不再
赘述
[vb:
showcolumns:
firstline[1]]viewplaincopyprint?
-102030405060708090-100…•••••110120130140150
1.PrivateSubbtn_Close_Click()
2.MSComm1.PortOpen=False'打开串口
3.btn_Start.Enabled=True'连接按钮响应
4.btn_Close.Enabled=False'断开按钮变灰
5.EndSub
6.
6.PrivateSubbtn_exit_Click()
7.IfMSComm1.PortOpen=TrueThen'如果串口被打开
8.MSComm1.PortOpen=False'关闭按钮
9.EndIf
10.UnloadUserForm1'关闭窗体
11.EndSub
13.
12.PrivateSubbtn_Start_Click()
13.iniMSComm'对串口控件设置
14.MSComm1.PortOpen=True
15.btn_Close.Enabled=True
16.btn_Start.Enabled=False
17.EndSub
20.
18.PrivateSubiniMSComm()'对串口控件设置
19.MSComm1.CommPort=1'占用的串口号,1表示COM1
20.MSComm1.Settings="115200,n,8,1"'这个自己根据自己的情况设置
24.
21.MSComm1.RThreshold=1
22.MSComm1.InputLen=0
23.'MSComm1.PortOpen=True'这句话放到连接按钮事件中去
24.MSComm1.InputMode=comInputModeText
25.MSComm1.RTSEnable=True
26.MSComm1.InBuferCount=0
27.EndSub
32.
28.PrivateSubMSComm1_OnComm()'事件处理
29.Dimt1AsLong,com_stringAsString
30.StaticiAsInteger
31.t1=Timer
32.SelectCaseMSComm1.CommEvent
33.CasecomEvReceive'如果接收到数据则执行下列语句
34.MSComm1.RThreshold=0
35.Do
36.DoEvents
37.LoopWhileTimer-t1<0.1
_string=MSComm1.Input
39.MSComm1.RThreshold=1
40.i=i+1:
Ifi>255Theni=1
41.Application.Cells(3,i).Value=com_string'写到Excel中去
42.txtRec.Text=txtRec.Text+com_string'写到文本框中去
43.EndSelect
49.EndSub
11ML$
ei.
++1.-h.i1.110«.***+aa20+•■*^•■***30*+*•*«•»■40*•*s■***S0■•■*•***■60*•■*■■***7®■*■*•***■8B*•*■■***SB^■*•**
PrivateSubbrnClosClldkQ
HjCHul.PDrtOaer-F«ls«"『廿半|_|
阪
btnirt«Enabled-Tru«"旌携扶钮耿应
04.
ttn_(]c&c.EnjoLed-Falsa■肝幵4$氐杏克
05.
EndSub
驱
0九
PrlvticSub
as.
IfHSCdm»1-PartCpe-i-TrueThein'如皐串>口SS;打开
»9V
NSCcrmL„PortOpan-False"沱|界摂旬
10.
日MIf
仏
UiloedU理rFonrtl筈|可窗体
13.
41
EndSub
1J.i
14-
PrivateSub}
15.
inlfULami对半口控
IS.
MSCcimHl.P口rt£s3er=True
17.
btn^CloSie.Enaoled-Tme
IB.
bt^_5tir,ci,EraoLed■Falit
19.
IndSub
23.
21.
PrivateSubiniNSComm()■对串口控件设置
22.
M5Connrnl-ConiiniPort=1■占用的串口号】1表示匚OM1
23.
MSComnl.Settings=“115200」』8J”1这个自己根据自己的情况设置
24.
25.
MSComml-RThreshold=1
25.
MSCooinl.InputLen-0
27*
-MSCoraml.PortOpen=True'^fl话放到连接按钮事件中去
2趴
MSComnl,InpuVk?
de=gnl叩utModeText
29.
MSComml.RTSEnable二True
sa.
^iSComnfll.In^uf-ferCount=6
31*
EndSub
32+d
PrivateSubMSComnil_OnCornfii()'事件处理
込
DimtlAsLongj亡cmstringAs.String
iS.
StaticiA±Integer
S6.
tl=Timer
37.
SelectCase^SComni'l.〔oniinE対◎nt
35.
Case匚onEvfteceive,如果接收封数据则执行下列营句
59.
SSComml.RThneshold=0
伽.
Do
414
DoEvents
42.
LoopWhileTimer・tl<0.1
41.
42.
◎
44.
45.
阪
47.
范
4久
DoEvent弓
LoopWhileTimer-tl<0*1
contestring=rSCohiml.Input
MSCoonl.RThreshold■1
i-1+1:
If1>255Theni-1
Application.Cells(3ji)・Value=comstring'写至(JExceI中去txtRec.Iext=txtRec.Text+com_string'写到文本框中去
EndSub
EndSelect
《五》
VBA的妙用:
串口通讯程序与EXCEL相结合
发布时间:
2010-3-11发布者:
北京世纪长秋科技有限公司
1VBA简介
VisualBasic的应用程序版(VBA)是Microsoft公司长期追求的目标,使可编程应用软件得到完美的实现,它作为
一种通用的宏语言可被所有的Microsoft可编程应用软件所共享。
在没有VBA以前,一些应用软件如Excel、Word、Access、Project等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。
拥有一种可跨越多个应用软件,使各应用软件产品具有高效、灵活且一致性的开发工具是至关重要的。
VBA作为一种新一代的标准宏语言,具有上述跨越多种应用软件并且具有控制应用软件对象的能力,使得程序设计人员仅需学习一种统一的标准宏语言,就可以转换到特定的应用软件上去,程序设计人员在编程和
调试代码时所看到的是相同的用户界面,而且VBA与原应用软件的宏语言相兼容,以保障用户在代码和工作上的投资。
有了VBA以后,多种应用程序共用一种宏语言,节省了程序人员的学习时间,提高了不同应用软件间的相互开发和调用能力。
2串口通讯程序
简单的串口通讯程序一般是先由上位机向下位机发送读(write)或写(read)数据命令,然后等待下位机应答;下位机接
受到命令之后,首先要对数据命令进行校验,对于符合校验约束的命令下位机会将相应的数据回复到上位机,对于不符合
校验约束的命令下位机或将其抛弃或回复错误信息;上位机接收到下位机的响应之后,首先要对接收到的回复信息进行校
验,对不符合校验约束的数据进行异常处理,对符合校验约束的信息进行解码,解码之后的信息便是上位机从下位机获得
的有效信息了。
上位机向串口发送读命令之后需要等待下位机应答并读取回复信息,常用的等待有3种方式:
1)轮询式
上位机向串口发送读命令之后一直等待下位机应答,通讯程序处于一个等待循环中。
优点:
速度快、误码率低(几乎不存在误码)。
缺点:
消耗CPU。
(解决办法:
使用Sleep()API函数)。
2)消息式
消息式通讯是采用响应WINDOWS消息的办法读取串口
优点:
节省CPU、误码率低。
缺点:
发送接收机制过于繁琐。
3)定时接收式
定时接收式通讯是根据预设的定时器时间进行读取数据。
优点:
发送接收机制相对简单、节省CPU。
缺点:
误码率太高,不同的硬件需要配置不同的通讯时间参数,需要严格的校验运算。
3EXCEL-VBA串口通讯实例
软件:
EXCELo
硬件:
艾默生EC10PLCo
功能:
通过EXCEL中的按钮控制PLC的输出继电器Y0。
界面:
RUN(运行通讯)、STOP(停止通讯)、Y0(Y0ON/OFF控制)。
主程序:
OptionExplicit
PublicDeclareSubSleepLib"kernel32"(ByVaidwMillisecondsAsLong)
PublicDeclareFunctionSetTimerLib"user32"(ByValhwndAsLong,ByValnIDEventAsLong,ByValuElapseAsLong,ByVallpTimerFuncAsLong)AsLong
PublicDeclareFunctionKillTimerLib"user32"(ByValhwndAsLong,ByValnIDEventAsLong)AsLon
g
PubliccomlAsNewMSCommLib.MSComm
PublicyOSttAsBoolean
PublicyO_onAsBoolean
PublictmrFlagAsBoolean
PublictmrAsLong
Subrunn()
OnErrorGoToedcoml.Settings="9600,e,8,1"
Ifcom1.PortOpen=FalseThencom1.PortOpen=True
EndIf
ontimer)
tmr=SetTimer(0,0,500,AddressOf
ExitSub
ed:
MsgBox"串口打开错误!
"
EndSub
Substoppi()
Ifcom1.PortOpen=TrueThencom1.PortOpen=FalseKillTimer0,tmr
EndIf
EndSub
PublicFunctionontimer()
Dima(7)AsByte
DimaddAsLong
OnErrorGoToed
IftmrFlag=FalseThen
tmrFlag=True
Ify0_on=TrueTheny0_on=False
Ify0Stt=TrueThena(0)=&H1a
(1)=&H5
a
(2)=&H0
a(3)=&H0
a(4)=&HFF
a(5)=&H0
a(6)=&H8C
a(7)=&H3Acom1.Output=a
add=0
Do
DoEvents
Sleep10add=add+1
Ifadd>=100Then
EndIf
LoopUntilcom1.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
Sleep10
add=add+1
Ifadd>=100Then
ExitDo
EndIf
LoopUntilcom1.InBufferCount>=8
EndIf
EndIf
EndIf
tmrFlag=False
ExitFunction
ed:
MsgBox"串口错误!
"
tmrFlag=False
EndFunction
界面程序:
PrivateSubcmd1_Click()
y0_on=True
y0Stt=Noty0Stt
EndSub
PrivateSubcmdRun_Click()runn
EndSub
PrivateSubcmdStop_Click()
stopp
CheckBox1.Value=0
EndSub
4结束语
V
VBA,
由上可见,VBA已经广泛应用于微软的应用软件当中,所以为更好的完善二次开发功能,众多的组态软件都在BA支持上做了努力,世纪星组态软件开发语言已与VBA非常相似,相信在未来的版本中,世纪星将全面支持它的二次开发功能会迈上一个新的台阶。
六》