基于PC机Windows环境下数据通信处理存储程序设计与实现.docx
《基于PC机Windows环境下数据通信处理存储程序设计与实现.docx》由会员分享,可在线阅读,更多相关《基于PC机Windows环境下数据通信处理存储程序设计与实现.docx(24页珍藏版)》请在冰豆网上搜索。
基于PC机Windows环境下数据通信处理存储程序设计与实现
1VisualBasic6.0简介
VisualBasic6.0,是微软公司于1998年推出的可视化编程工具MSDN之一,是目前世界上使用最广泛的程序开发工具之一。
结构简单,编写程序对系统的资源占有极低,是程序编写者编写小型程序的第一选择!
(完整源代码发邮件至xiaopoyu@)
VB的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。
因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。
过去的版本里面VB程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少。
窗体控件的增加和改变可以用拖放技术实现。
一个排列满控件的工具箱用来显示可用控件(比如文本框或者按钮)。
每个控件都有自己的属性和事件。
默认的属性值会在控件创建的时候提供,但是程序员也可以进行更改。
很多的属性值可以在运行时候随着用户的动作和修改进行改动,这样就形成了一个动态的程序。
举个例子来说:
窗体的大小改变事件中加入了可以改变控件位置的代码,在运行时候每当用户更改窗口大小,控件也会随之改变位置。
在文本框中的文字改变事件中加入相应的代码,程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。
VB的程序可以包含一个或多个窗体,或者是一个主窗体和多个子窗体,类似于操作系统的样子。
有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能。
VB的组件既可以拥有用户界面,也可以没有。
这样一来服务器端程序就可以处理增加的模块。
VB使用引用计数的方法来进行垃圾收集,这个方法中包含有大量的对象,提供基本的面向对象支持。
因为越来越多组建的出现,程序员可以选用自己需要的扩展库。
和有些语言不一样,VB对大小写不敏感,但是能自动转换关键词到标准的大小写状态,以及强制使得符号表入口的实体的变量名称遵循书写规则。
默认情况下字符串的比较是对大小写敏感的,但是可以关闭这个功能。
2VB6.0设计上位机软件
2.1单片机和PC机的通讯流程
2.2程序界面设计
运行VB6.0,创建标准的工程文件项目,设计程序窗体。
(1)添加串口通信控件Mscomm。
默认的工具中没有MScomm,因此,首先要把它添加到工具箱中,然后添加到程序窗体上。
(2)添加2个文本控件,1个作为接收区,用于显示收到数据,另一个用来显示所储存文件的位置。
添加5个commandbutton控件,1个frame,5个label控件等。
(3)属性设置如下表格:
控件类型
名称
主要属性
功能
Form1
Form1
Borderstyle=2
窗口可放大
Label1
Label1
Caption=串口
标签
Labe2
Labe2
Caption=波特率
标签
Label3
Labe3
Caption=校验位
标签
Label4
Labe4
Caption=数据位
标签
Label5
Label5
Caption=停止位
标签
CboBaudrate
CboBaudrate
List=300,1200,2400……
波特率选择
CboBaudrate
CboBaudrate
List=NONE,ODD……
校验位选择
CboDatabit
CboDatabit
List=8,7,6
数据位选择
CboStopbit
CboStopbit
List=1,1.5,2
停止位选择
CboCom
CboCom
List=Com1,Com2,Com3……
串口选择
TxtReceive
TxtReceive
空
显示接收数据
TxtSavePath
TxtSavePath
空
显示保存路径
CmdSwitch
CmdSwitch
Caption="打开/关闭串口"
打开/关闭串口
CmdClearReceive
CmdClearReceive
Caption="清空接收区"
清空接收区
CmdSaveDisp
CmdSaveDisp
Caption="保存显示数据"
保存显示数据
CmdAmend
CmdAmend
Caption="更改"
更改保存路径
CmdQuit
CmdQuit
Caption="关闭程序"
关闭程序
2.3VB程序
详细程序见附录
2.4软件运行界面
3单片机与PC机的通信
3.1串行接口简介
串行接口一般包括RS232/422/485,其技术简单成熟,性能可靠,价格低廉;所要求的软硬件开发环境都很低,广泛应用于计算机相关领域,如调制调解器,串行打印机,各种监控模块,PLC,摄像头云台,数控机床,单片机及相关智能设备,甚至路由器等。
一般的MCU都通过RS232接口与外设进行通讯。
它的基本通信原理图如下:
PC
MCU
图3.1MCU与PC机通信连接图
3.2设计中的串行通信采用异步通信
串行通信的数据或者字符是一帧一帧地传送,在异步通信中,一帧数据先用一个起始位“0”表示字符的开始,然后是5~8位上诉局,即该字符的代码,规定低位在前,高位在后,接下来是奇偶校验位,最后一个停止位“1”表示字符的结束。
下面是异步通信一帧数据为10位的帧格式。
起始位数据位校验位停止位
3.3波特率和发送时钟
波特率是通信中对数据传送速率的要求。
在计算机通信中,其意义是美妙钟传送多少位二进制数。
假如异步传送速率为每秒120个字符,每个字符有1个起始位,8个数据位,1个停止位组成,则其传送波特率为
传送一位所需要的时间为波特率的倒数,即
在串行传输中,二进制数据序列是以数字波形出现的,发送时在发送时钟下将通信线上传来的数据串行移入移位寄存器,所以,发送时钟和接受时钟也可作移位时钟。
能产生该时钟的电路称为波特率发生器。
为提高采样的分辨率,准确地测定数据位的上升沿或下降沿,时钟频率总是高于波特率的若干倍,这个倍数称为波特率因子。
在单片机中,发送和接收时钟可以由系统时钟
产生,其波特率因子为12,32,64.如果波特率由
决定称为,固定波特率方式。
也可以由单片机的内部定时器
产生,它工作于自动重装8位定时方式,由于定时器的计数初值可以人为的改变,
产生的时钟频率就可以改变,称为可变波特率方式。
此次设计的波特率选择为1200,10位/帧。
每次通信的数据流13字节,ACSII码,无奇偶校验位。
得;
X=0XFD;
即为定时器T1的计数初值。
3.4单片机通信程序
具体程序见附录
4小结与体会
本次课程设计我的题目是采用任何一种开发平台,设计出一款集数据采集、处理、存储及打印程序,设计要求:
1.通信接口为RS-232,1200波特率,10位/帧。
2.每次通信的数据流13字节,ACSII码,无奇偶校验位。
3.存储数据以数据库文件的形式存在硬盘上。
4.可在A4的纸上打印数据库文件。
5.具体数据处理要求另附。
我选择的是可视化编程软件VisualBasic6.0。
由于知识量的不足,在设计的过程当中遇到了很多困难,不过在查阅大量资料和同学之间的讨论之后,总体上达到了要求。
通过4*4矩阵键盘发送0-F的任意13个字符,将要发送的字符数据通过12864液晶显示出来,并且统计当前选择字符的总数。
在按发送数据之前,将软件的各种属性设置好,波特率为1200,校验位为N,数据位为8,停止位为1,选择串口为COM4,并打开串口。
在字符选择好并设置好软件后,通过ok按键发送数据。
同时,液晶上显示“开始发送DATA>>”.软件上显示发送的数据,通信成功。
经过这次课程设计,使我觉得不论从理论知识还是从实际操纵中都学到了不少知识,我想归纳起来,主要有以下几个方面:
1.经过这次课程设计,它让我接触更多平时没有接触过的科学仪器设备,元器件以及获得相关的仪器调试经验,同时我也发现自己在这方面很多不足之处。
体会到理论知识对实践有很大的指导作用,她让我知道,只有在正确的理论指引下,才能设计出合乎实际需要的硬件电路;2.学会了高效率的查阅资料、运用工具书、利用网络查找资料。
我发现,在我们所使用的书籍上有一些知识在实际应用中其实并不是十分理想,各种参数都需要自己去调整。
偶而还会遇到错误的资料现象,这就要求我们应更加注重实践环节;3.在设计中,我们应当注意重点与细节的关系;4.失败不可怕,只要不趴下,昂首向前走,希望总会有;5.同组同学相互包容,彼此合作,取长补短,才能铸就最后的成功。
可以这样说课程设计是对大学所学知识的一次运用和检阅,同时对自学能力提出很高的要求,所以平时的学习离开思考,就是严重的错误,我们学习不应该有偏科现象,各方面的知识都应该要接触,这样做才能把课程设计做得完整。
通过本次课程设计,我受益匪浅,对VB以及单片机和PC机的串口通信的基础知识得到了巩固,学习到了新的知识,在理论的基础上更深刻地掌握了单片机和VB的深层内容及实际生活中的应用,实训锻炼了自己的动手能力和思维能力,还有在软件方面的编程能力,同时也暴露出平时学习上的一些问题,让我们深刻反思。
这些问题的发现将为我们以后的学习和工作照明道路,查漏补缺为进一步学习做好准备。
5参考文献
[1]VisualBasic.NET案例开发集锦.康祥顺.电子工业出版社2003
[2]VisualBasic自学手册.安剑.人民邮电出版社2005
[3]VisualBasic.NET项目开发实用案.王立峰.科技出版社2006
[4]VB6.0程序设计实训教程.杨克玉.机械工业出版社2005
[5]VisualBasic串口通信实例编程.龚建伟.清华大学2004
6附录
1vb源程序
'=====================================================================================
'变量定义
'=====================================================================================
OptionExplicit'强制显式声明
DimComSwitchAsBoolean'串口开关状态判断
DimFileDataAsString'要发送的文件暂存
DimInputSignalAsString'接收缓冲暂存
DimOutputSignalAsString'发送数据暂存
DimDisplaySwitchAsBoolean'显示开关
DimModeSendAsBoolean'发送方式判断
DimSavetimeAsSingle'时间数据暂存延时用
DimSaveTextPathAsString'保存文本路径
ConstHWND_TOPMOST=-1
'=====================================================================================
'窗体载入
'=====================================================================================
PrivateSubForm_Load()'载入窗体
OnErrorGoToErr
IfMSComm.PortOpen=TrueThenMSComm.PortOpen=False'先判断串口是否打开,如果打开则先关闭
'初始化串口
CallComm_initial(Val(Mid(CboCom.Text,4,1)),CboBaudrate.Text,Left(CboParitybit.Text,1),CboDatabit.Text,CboStopbit.Text)
'数据位载入
CboDatabit.AddItem"8"
CboDatabit.AddItem"7"
CboDatabit.AddItem"6"
'停止位载入
CboStopbit.AddItem"1"
CboStopbit.AddItem"1.5"
CboStopbit.AddItem"2"
Err:
EndSub
'=====================================================================================
'保存接收文本
'=====================================================================================
PrivateSubCmdSaveDisp_Click()'保存显示数据
OnErrorGoToErr'错误处理
SaveTextPath=TxtSavePath'路径暂存
OpenTxtSavePath&"\1.txt"ForOutputAs#1'打开文件
'不存在的话会创建文件,如已存在会覆盖
'output改为append为追加
'改为input则只读
Print#1,Year(Date)&"年"&Month(Date)&"月"&Day(Date)&_
"日"&Hour(Time)&"时"&Minute(Time)&"分"&Second(Time)&_
"秒"&vbCrLf&TxtReceive.Text+vbCrLf'把接收区的文本保存文本前加上保存时间(0000年00月00日00时00分00秒)
'vbcrlf为回车换行
Close#1'关闭文件
TxtSavePath="OK,1.txtSave"'提示保存成功
CmdSaveDisp.Enabled=False
Savetime=Timer'记下开始的时间
WhileTimerDoEvents'转让控制权,以便让操作系统处理其它的事件。
Wend
TxtSavePath=SaveTextPath'显示保存路径
CmdSaveDisp.Enabled=True
Err:
EndSub
'=====================================================================================
'更改保存显示数据的目录
'=====================================================================================
PrivateSubCmdAmend_Click()'更改
DimspShellAsObject'定义存放引用对象的变量
DimspFolderAsObject'定义存放引用对象的变量
DimspFolderItemAsObject'定义存放引用对象的变量
DimspPathAsString'定义存放的变量
OnErrorGoToErr'错误处理,防止取消打开文件夹时报错
ConstWINDOW_HANDLE=0
ConstNO_OPTIONS=0
SetspShell=CreateObject("Shell.Application")
SetspFolder=spShell.BrowseForFolder(WINDOW_HANDLE,"选择目录:
",NO_OPTIONS,"C:
\Scripts")
SetspFolderItem=spFolder.Self
spPath=spFolderItem.Path
spPath=Replace(spPath,"\","\")'Replace函数的返回值是一个字符串
TxtSavePath.Text=spPath'把文件夹路径显示在标签上
SaveTextPath=TxtSavePath.Text'路径暂存
Err:
EndSub
'=====================================================================================
'串口设置
'=====================================================================================
PrivateSubCboBaudrate_Click()'修改波特率
CallComm_reSet(Val(Mid(CboCom.Text,4,2)),CboBaudrate.Text,Left(CboParitybit.Text,1),CboDatabit.Text,CboStopbit.Text)'串口设置
EndSub
PrivateSubCboCom_Click()'修改串口
CallComm_reSet(Val(Mid(CboCom.Text,4,2)),CboBaudrate.Text,Left(CboParitybit.Text,1),CboDatabit.Text,CboStopbit.Text)'串口设置
EndSub
PrivateSubCboDatabit_Click()'修改数据位
CallComm_reSet(Val(Mid(CboCom.Text,4,2)),CboBaudrate.Text,Left(CboParitybit.Text,1),CboDatabit.Text,CboStopbit.Text)'串口设置
EndSub
PrivateSubCboParitybit_Click()'修改校验位
CallComm_reSet(Val(Mid(CboCom.Text,4,2)),CboBaudrate.Text,Left(CboParitybit.Text,1),CboDatabit.Text,CboStopbit.Text)'串口设置
EndSub
PrivateSubCboStopbit_Click()'修改停止位
CallComm_reSet(Val(Mid(CboCom.Text,4,2)),CboBaudrate.Text,Left(CboParitybit.Text,1),CboDatabit.Text,CboStopbit.Text)'串口设置
EndSub
PrivateSubCmdClearReceive_Click()'清空接收区
TxtReceive.Text=""
EndSub
'=====================================================================================
'选择要发送的文件并放入内存中
'=====================================================================================
PrivateSubCmdSelectFile_Click()'选择要发送的文件
OnErrorGoToErr'错误处理
CommonDialog1.Flags=cdlCFBoth
CommonDialog1.ShowOpen
TxtSendPath.Text=CommonDialog1.FileName'把打开的文件名给于TxtSendPath
OpenTxtSendPath.TextForInputAs1'打开选择的文件
FileData=StrConv(InputB$(LOF
(1),1),vbUnicode)'显示打开的文件
Close1'关闭文件
Err:
EndSub
'====================================================================================
'通信触发事件
'====================================================================================
PrivateSubMSComm_OnComm()'设置oncomm事件,读取片机内存的值
OnErrorGoToErr
SelectCaseMSComm.CommEvent'每接收1个数就触发一次
CasecomEvReceive
CalltextReceive'文本接收
CaseElse
EndSelect
Err:
EndSub
'====================================================================================
'文本接收
'====================================================================================
PrivateSubtextReceive()
OnErrorGoToErr
InputSignal=MSComm.Input
IfDisplaySwitch=FalseThen'显示接收文本
TxtReceive.Text=TxtReceive.Text&InputSignal'单片机内存的值用TextReceive显示出
TxtReceive.Text=TxtReceive.Text/2000
TxtReceive.SelStart=Len(TxtReceive.Text)'显示光标位置
EndIf
Err:
EndSub
'=====================================================================================
'串口开关
'=========================================