VC串口上位机编程实例_第1页
VC串口上位机编程实例_第2页
VC串口上位机编程实例_第3页
VC串口上位机编程实例_第4页
VC串口上位机编程实例_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VC+串口上位机简单例程(源码及详细步骤)串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW 等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用 C语言来写串口通信上位机程序的资料,在图书管理找到了用 VC+编写串口上位机的资料,参考书籍,用自己相当蹩脚的C+写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。编译环境:VC+6.0操作系统:VMWare虚拟出来的Windows XP程序实现功能:1、PC初始化COM1 口,使用n81方式,波特率57600与单片机通信。PC的COM 口编号

2、可 以通过如下方式修改:-片W zw *9 妪rnqtinni -JLf-回凸di if固 JrJrS-* tji IH ATVP44T:g 爲-5 «714口APJ打印甌口 MTl i J ZB call JCW* itlfl-* LaaiE 冠-当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1 口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到 0xaa后启动ADC转换一次,并把转换

3、结果 ADCL、ADCH共两个字节的结果发送至 PC,PC进行数值转换后在 窗口里显示。(见文章末尾图)3、为防止串口被一只占用,点击关闭串口可以关闭 COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。程序的编写:1、 打开VC+6.0建立基于对话框的 MFC应用程序Test,工程名称(HI:位置Gl:|z刑CH串口上往梔I亡耐-创建新的工作空闾文件Tffi |工作区|其它文档| ATLCOM AppWizariiCluBlrr Resource Type Wiiard TlCusWff) AppWizardDa1ab»sc Praject DevSfudta

4、 Add in Wizard Extt nderi Stored Proc Wi?Hrd filSAPI Exlens ion WizardMakefilejMFC AtliveX CnntfolWizaid 旬 MFC AppWiztrd |dlljsNew Dalabssr Wizard 科 Uliltty Project alWin3? Application Win3?ApplkniivuWin32 DynarniLink Libiary 3Win32 Stetic L ibraryV Win32您爰创建的应用程序类型是:FC应用程序向导-步驟厂单文档圖 广多重文档(MJ 泾基本对话框

5、叵j?P立栏症£盲吓糸结刊克持¥您的资源使用的语言是:I 申文1中国APPWZCHS.dIZjHFC应用程序向导-步驟2共4步您是否希望包含:厂“关于“对话框厂上下文相关帮助V 3D外观您希望包含什么其他支持?厂自动操作凹0 ActiveX控件回您希望包含WOSA支持吗?厂 Windows Sockets (W|对话框的标题是:|test您喜欢的风格是:Microsoft Develcyer StudiornrrniwMIFC应用程序向导-步骤3共4步a MFC'WIr Windows资源管理器样式您希望生成源文件备注吗?a 是 Cx3您希望使用MFC,辛吗?G作为

6、共享的DLL作为静态的DLLFC应用程序向导-步骤&共克步类名型头文件:CTestApptest.h基类:执行文件:CWinApptest.cpi:上一歩|下 步完成2、 在项目中插入 MSComm 控件:工程-增加到工程-Components and Controls-双击 Registered ActiveX Controls- 选择 Microsoft Communications Control, version 6.0-lnsert ,按 默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。插入 工程世)组建1工具 窗口血 帮助设置活动工程电)増加到工程I cl&am

7、p;SS FSource Control新逹卜匕 新建文件夹册)te st从属性设导出制作文件Alt+F7fjjiComtonents and Controls,.插入工程到工作空间(I).Components and Controls Gallery选择要插入到工程的组件直扶苑围(X): _ Xegi star ed ActiveX Cantr &ls :3 空亡駁 Microsoft AnirEiati on Control, version 5- 0 (S?2)icrasoft Common Dial。耳 CaRtrol, version 6. 0 (STB)Microsoft

8、Communi cations Controij version 6,0fNicroEof t EitaCombo Control, vers ion 6. 0 (OLEEE ) Nicr&soft. EataGrid Control &. 0 CSF6) (OLEEB) Microsof t EAtaLi st Control, version 5. 0 (OLEDBDcr«7 Mi cr<ffilllicriMi cr<cr<Mi cr(文件名 ) : |Mi crosoft Commuiti cati ons Control, vrsiInse

9、rtMicrosoft Comm Control 6.0膻abl口®函冒一一嚎矗日団匹 再禺C3IX國圈丰圍3*-fficlsl3、删除确认、取消和提示框,添加电话”进程、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局。控件B4、右击编辑框Edit选择属性,在样式里设置,勾选多行、垂直滚动,其它可按默认值。 右击静态文本Text选择属性,在常规设置里,修改标题。右击按钮PushButton选择属性,在在常规设置里,修改标题。修改后界面如下,程序写出来运行时电话”标志会自动消失。Aft abl OF 9 ® S 血a $画EH 1= a H 鱼園 ffi e5、查看-&

10、gt;建立类向导 MFC ClassWizard->Member Viariable,选择 ClassName 为 CTestDIg 的类,Control ID为MSC0MM1,双击它,为它添加控制变量m_comm1。类似的,选择IDC_BUTT0N2添加控制变量 m_serial。(建立类向导也可以右击然后在弹出的快捷菜单里选择建立类向导)FC ClassiMe&sagt Maps Member Variables | Aulomation | AcIrveX Events | Class Info | Projcd:Class name:| lestcTeslDIg;Cont

11、rol IDs:TypeMemberZX-Vest1estDlg.h, ZA.-VsttestDlg,cppMessage Maps Member VriabJes Automation | ActiveX Events | Class InloProject:Class name:testT CTeslDIgZ:V*AtesttestDlg,h, Z:VAtes(teslDtgxpipConlrol IDs:TypeMemberIDCBUTTON】IDCHUTTON2CButtonm serial1IDCEDIT3IOCMSCOMM1CMSCornmm_cornm1IDCPROGRESSl(

12、组建-> 全部组件,然至此,基本框架已经出来了,编译后运行可以看到如下所示的界面。 后组建-> 执行)|5f li开始转换打开串口民li打开串口6、点击左侧的视图窗口,可以在三种模式下切换,第三个是打开我们的源代码窗口, 个是类,第二个是窗体的资源视图。凶 test n选择File View,展开test files->Header Files,打开testDIg.h,在全局变量下添加如下代码,然 后保存:int gllen;定义整型标量gllen,用于记录接收数据的个数CProgressCtrl * pbar; /指向进度条的指针,用于操作进度条CString

13、strRXDdata; /编辑框显示的文本,记录历次转换值/ Constructionpublic:CTestDlgtCWnC* pPrent - NULL); / standard constructorint gllen;"定义整型标量gllen.用于记移收数据的个数CProgressCtrl pbar;"拒冋逬扈条的擀针,用壬理隹迸废惫string strRXDdata; "编辑签示的支笨.垃隶蔚次蒔誓鹰/ H H HV «« »»»!补 " ««»«

14、1;«« 耳1(11:鼻«!«»*««« W« H »»»/ Dialog Data/AFX DATA(ClpstDlq)enun 7e>D - 10D TEST DIALOG ):C8utton n serial;7、点击 Recourse View,展开 test recourses->Dialog,双击 IDD_TEST_DIALOG ,编辑我们 的主界面对话框。双击击电话”弹出如下对话框,按确认键:Add Member FuiiGtion|P|OnComm

15、MscommlMember function name:CancelMessage: OnCommObject ID: IDC_MSCOMM1VC会进入源码编辑窗口,这个函数是用来处理串口事件的,当PC串口接收到数据时,会产生一个数据缓冲区有数据的消息事件,然后调用执行这个函数。添加如下代码,进行数据处理,窗口更新等操作:VARIANT variant1;定义VARIANT型变量,用于存放接收到的数据COleSafeArray safearray;/ 定义 safearray 型变量LONG len,k;定义长整型变量 len,kBYTE rxdata2048; 定义 BYTE 型数组CStr

16、ing stremp1,stremp2; 定义两个字符串if(m_comm1.GetCommEve nt()=2)/ 判断引起 On Comm 时间的原因/如果是接收到特定个字节数,则读取接收到的数据variant1 = m_comm1.GetInput();把接收到的数据存放到VARIANT型变量里safearray = variant1;/V ARIANT 型变量转换为 ColeSafeArray 型变量 len = safearray.GetOn eDimSize();for(k=0;k<le n;k+)safearray.GetElement(&k,rxdata+k);

17、/ 得到接接收到的数据放到BYTE 型数组 rxdata 里for(k=0;k<le n;k+)BYTE bt = (*(unsigned char*)(rxdata+k); / 读取 AD 转换的高字节if(k%2)=0)if(k+1)<le n)gllen+;全局的变量,对接收到的转换结果的个数进行计算stremp2.Format("第%d次转换结果:",gllen);显示第几次转换int temp = bt*4+(*(u nsig ned char *)(rxdata+k+1)>>6); /高低字节合并成实际的转换结果,注意转换结果是左对齐st

18、remp1.Format("%2.2f",(2.56*temp/1024); 计算成实际电压值SetDlgItemText(IDC_STATIC,("当前电压值为:"+stremp1+" V"); / 更新静态文本控件pbar -> SetPos(temp);/更新进度条的当前位置strRXDdata += stremp2;把新的数据放到全局的字符串里strRXDdata += stremp1;strRXDdata += " Vrn" 字符串加单位 V后换行SetDlgltemText(IDC_EDIT1,s

19、trRXDdata); 更新文本控件的显示uoidl CTrst D>lq:DnDnCoMHscofWil ()/ TDDDi Add yicur control natirltdtiiCHn handL«ia CDdFUAH I AHI vdrUnt 1 ;COlPSdfffirrjyLONGBVTECStrinq £trnpl4strRfi2; if coniI elC>oiMiLu?rit()-?>":uAHiflingw*厝F存放接收到的樹蚪 / :Eft/T . 卜丰谒串varljirit 1 fh> CQimli .EeU np

20、ul:(); sifrjrriigi u.iri"割辭弓庭oncoT间的匣因M恋电捋J巧峙;炸"优L注平! "把妾收赧刮异§ "UHfUAHT型査*转换左Ct)】 MdFl说rl©Mt"" 即;i叮fl賞別刖皿£试如XE2里nr(*f0;k<lrri ;k*)bvte bt chr丄*k) y/j -fl Di < r- ?'-这时重新编译一下,看会不会有什么错误,出现下面提示,可以选择全部组建来清除。LINK : LNK4073: cann ot create map for .IL

21、K file; lin ki ng nonin creme ntally 出现下面错误,请关闭运行的test.exe后重试。LINK : fatal error LNK1104: cannot open file "Debug/test.exe"出现下面错误两种错误,是由于空间编号问题引起的,当我们添加了编辑框或者电话”后再添加,其编号自动加一,就会出现控件没定义。Z:vc+ 串口上位机 testtestDlg.cpp(32) : error C2065: 'IDC_MSC0MM1' : undeclared identifier Z:vc+ 串口上位机 t

22、esttestDlg.cpp(139) : error C2065: 'IDC_EDIT1' : undeclared identifier 解决方法是,在 RecourseView里,打开窗体IDD_TEST_DIALOG ,右击 电话”或者编辑框 等其它出错的控件,右击选择属性,在常规里修改ID,这里的程序,除 BUTTON有1、2两个之外,其它都是1P可见圖己禁用回厂组IS丽制表站回全部组建编译一下,看看有没有错误,没有错误就可以运行一下,可以看到界面更原来是,li crvs?ft CoBBuai cati o&s Conlrolj虫缪常规GeneralBuffe

23、rs |D: |iDC_MSC0MM1样的。有错误就修改一下,省得弄多了,错在哪里都不知道,查起来麻烦。8、在源码编辑里,打开testDlg.cpp文件,进行窗口初始化函数的编写。找到 BOOL CTestDlg:OnlnitDialog()函数,在 SetIcon(m_hlcon, FALSE);/ Set small icon/ TODO: Add extra ini tialization here后面添加如下初始化代码:gllen = 0; /记录转换次数全局变量清零if(! m_comm1.GetPortOpen() 判断串口是否已经打开m_comm1.SetCommPort(1);

24、 / 选择串口号 1m_comm1.SetPortOpen(TRUE); / 打开串口m_comm1.SetRThreshold(2); / 收到两个字节引发 On Comm 事件 m_comm1.SetInputMode(1); 输入模式选为二进制m_comm1.SetSetti ngs("57600, n,8,1"); 设置串口参数,波特率 57600,无奇偶校验,1位停止 位,8位数据位MessageBox("串口初始化完毕",”提示");/提示串口成功初始化else MessageBox("串口被占用","

25、提示");/如果已经打开串口,消息框提醒pbar = (CProgressCtrl*)GetDlgltem(IDC_PROGRESS1); 获得指向 IDC_PROGRESS1 的指针 pbar -> SetRa nge(0,1023); 设置进度条的范围 01023pbar -> SetPos(O);/当前位置为 0m_serial.SetWindowText(”关闭串口 ");/按钮显示状态改变ff lnOH; rtrJjl fxI rd ini t bi L i tn hrrrgllen 0;lF(f n com,EetPartop*n(><“

26、576C率n-h制r羽我希引二M1-十仁功 号?谨参成 口口卒式口口到A© -.£.聶i? / /口皿圈吏 开的尬壬 打W蕖齿优 好局淹賈事 已翼 $:一禎 / / / / /HCDnnl.SetCDnrrfDrttl); ncoiwil £tPDrl:Oppn(TftUE); n cgiwki fe$etft1hreshold (2 >h_£qiw<i1 nputiNodrfl):ncoml .SvtSptting&tAOe.n.S甲匸;HessigpBox串口初姑化死毕”、“探示” 1 ; ?1m Hpssjge>(

27、7;c<h*$口袖占用"J呕示"X pbjr -11:叶0亍铮1;叶1)Ept»lg t»M I DC_PR4E«ESS1);pb*F -> SetRdng?(t«1023);pbar -> tPt>M D>;_»riM .SttWndoiHKt(关宙串 口 "可以看到,串口的参数等等都在在这里初始化的,可以根据自己的需要修改的,具体可以查看VC+里的详细介绍,看看有哪些参数可以给我们修改来用。添加后再编译一下,运行后可以看到多了一个串口初始化的提示信息窗口。 至此,我们已经完成了主要

28、的串口操作及界面,剩下的就是两个按钮的操作了。9、回到资源视图的IDD_TEST_DIALOG 窗口,双击开始转换按钮,给它添加事件,点击 后PC通过串口发送Oxaa出来,给单片机接收。添加如下代码:CByteArray m_Array; / 定义字节数组 m_Array.RemoveAII(); / 字节数组清空 m_Array.SetSize(1); / 设定维数为 1 m_Array.SetAt(0,0xaa); / 给 m_arrayO赋值 0 m_comm1.SetOutput(COIeV ariant(m_Array); 由于 SetOutput 函数的参数为 VARIANT 型,

29、必 须强制转换后才能发送uold Cf:DnButtonli ()</ IODO: Add j/our control not iFicat i<in handlerhere/*»»*»*»*»<*»*»*>»*»*CBteArra n Array;"宅义宇节数组.Renoueftllf ;丿/字誤報殂清空n_Array ,SetSize( 1);"设定堆數方Ti* Arry.Setfttf 叫馭ao);館r coRinl SetOutputf COleUariantfm Rrra>):Set Out puWsJ數的券數 为 UfN ! -H H M-« » * N< N H 41 H i « M H H同样地,双击另外一个按钮,给串口操作按钮添加代码,用于关闭或者打开串口。添加如下代码:if(! m_comm1.GetPortOpen() 判断串口是否已经打开

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论