最详细的VC++串口上位机编程_第1页
最详细的VC++串口上位机编程_第2页
最详细的VC++串口上位机编程_第3页
最详细的VC++串口上位机编程_第4页
最详细的VC++串口上位机编程_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

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

2、 口编号可 以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择 COM端口号,但是此次仅仅是简单的例 程,就没有弄那么复杂了。 COM1 口可用的话,会提示串口初始化完毕。否则会提示串口已 经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送 0 xaa,单片机串口中断接收到 0 xaa后启动ADC转 换一次,并把转换结果 ADCL、ADCH共两个字节的结果发送至 PC, PC进行数值转换后在 窗口里显示。 (见文章末尾图) 3、为防止串口被一只占用, 点击关闭串口可以关闭 COM1 ,供其它程序使用,点击后按钮 变为打开

3、串口,点击可重新打开 COM1。 程序的编写: 1、 打开VC+6.0建立基于对话框的 MFC应用程序Test,文件 工程I工作区I其它文档I Win32 Application Win32 Console Application Win32 DynamioLink Library Win32 Static Library FC应用程序向导-步彝1 您要创建的应用程序类型是: L 单文档国 C 多重文档(M) c 基本对话框(Qi P文档/查看体系结构支持 您的资源使用的语言是: | 中文中国 HAPPWZCHS.DLL) 3土 ATL COM AppWizard TlCluster Reso

4、urce Type Wizard TlCustom AppWizard Database Project rDevStudio Add in Wizard ( Extended Stored Proc Wizard xfilSAPI Extension Wizard Makefile tMFC ActiveX ControlWizard 虎 MFC AppWizard (dll) MFC AppWizard (exe 卜 New Database Wizard Tl Utility Project 壬程名称(Ml: test- 位置(CJ: _ |znvc “串口上位机Uest &创建

5、新的工作空间(B) 厂添加到当前工作空何的 r从属于咧: 平台(3: Win32 FC应用程序向导-步馨 2共 4步 您是否希望包含: 厂关于“对话框 r 上下文相关帮助 V 3D外观 您希望包含什么其他支持? r 自动操作凹 丁丁 ActiveX 控件 您希望包含 WOSA支持吗? Windows Sockets (W| 对话框的标题是: |test IFC应用程序向导-步尊 3共 4步 您喜欢的风格是: 6 MFCWI r Windows 资源管理器样式 您希望生成源文件备注吗? 是(Y) 您希望使用 MFC弄吗? C 作为共享的 DLL 厂作为静态的 DLLx* Check Box (?

6、 Rdio Bvttoa C* Rdio BvttoB Edito 9 Control: | Record 、 Microsoft Developer Studio 2、 在项目中插入 MSComm 控件:工程-增加到工程-Components and Controls-双击 Registered ActiveX Controls- 选择 Microsoft Communications Control, version 6.0-Insert , 按 默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。 插入插入(1)工程工程(I)组建康)工具组建康)工具d)窗口窗口 帮助诅)帮助诅)

7、 CWinApp 设置活动工程设置活动工程 插入工程到工作空间插入工程到工作空间隹)隹). .应用程序向导为您创建了以下类: CTestDIg 类名 0: 头文件: CTestApp 执行文件: Source Control 从属性从属性. 设置匿)设置匿) 辱出制作文辱出制作文境文件Alt+F7 ! ! - M te st 新建新建值)值) 卜卜 新建新建文件夹僵)文件夹僵).一一 CTestA iComEonentX and Controls. FC应用程序向导-步哀 4共 4步 增加到工程增加到工程值)值) Components and Controls Gallery 选择要插入到工程

8、的组件 查找范围查找范围(X): | W 皂皂X Cgtmlw 伞伞 匡匡| | Mi cr&soft Anigtion Control, version 5- 0 (S?2) icrasoft Common Dial理理 CaRtrol, version 6. 0 (5T6) fNicroEof t EitaCombo Control, vers ion 6. 0 (OLEEE ) Nicr&soft EataGrid Control &. 0 缶缶理理) )(OLEEB) Microsoft DMaLiwt Control, version 5. 0 (OLEDBD

9、 文件名文件名 俱俱) ): Mi crosoft ComimuiLi cati ons Control, ver si IrtSr t Microsoft Comm Control 6.0 3、删除确认、取消和提示框,添加 电话”、进程、静态文本、按钮、编辑框,拖动添加的 控件,根据喜好布局。曜ablablo orilril函图一一咤序日团叵 * *& &O OIXIXB B囤令卜slsl33 - -ffiffic cl ls s取消取消 Microsoft Communi cations Controij version 6,0 富富Mi cr( 7 Mi err ffil

10、icri Mi err cr建立类向导 MFC ClassWizard-Member Viariable,选择 ClassName 为 CTestDlg 的类,Control ID为MSCOMM1,双击它,为它添加控制变量 m_comm1。 类似的,选择IDC_BUTTON2添加控制变量 m_serial。 (建立类向导也可以右击然后在弹出的快捷菜单里选择建立类向导) Message Maps Member Variables Automat沁打 | AcIrveX Events | Class IMo Type Member Class name: CTeslDlg Z%testMestDl

11、g_h* ZA.*-VsttestDlgxpp Cnntrol IDs: Message Maps Member Variobks Automation | ActiveX Events | Class Info Project: Class name: test H CTeslDIg Z:V*AtesttestDlg,h, Z:VAtes(teslDtgxpip Conlrol IDs: Type Member QbC_ BUTTON1 1DC BUTTON2 CButton m serial IDC_EDIT3 IDC_MSC0MM1 CMSComm m_CG(nm1 IDCPROGRES

12、S1 至此,基本框架已经出来了,编译后运行可以看到如下所示的界面。 (组建-全部组件,然 后组建- 执行) I 区区 | | P =二二 test 区| 污污 开始转换开始转换 上上 I打开串口打开串口j 当前电压值为:当前电压值为: I侨谿簸侨谿簸 打开串口打开串口 6、点击左侧的视图窗口,可以在三种模式下切换,第三个是打开我们的源代码窗口, 第 个是类,第二个是窗体的资源视图。 邑 test.cpp tPfDn 选择File View ,展开test files-Header Files,打开testDlg.h ,在全局变量下添加如下代码,然 后保存: int gllen;/定义整型标量g

13、llen ,用于记录接收数据的个数 CProgressCtrl * pbar; /指向进度条的指针,用于操作进度条 CString strRXDdata; /编辑框显示的文本,记录历次转换值 / Construction public: CTestDlgtCWnC* pParent - NULL); / standard constructor int gllen; 定义整型标量gllen.用于记卷收数据的个数 CPragressCtrl * pbar; 指回避虐条的疵针,用芝捷作进度全 string strRXDdata; 细辑荏显示的戈未*也泰房次藉麟也 / * W H H N D - 1

14、0D TEST DIALOG ): C8utton n serial; 7、 点击 Recourse View ,展开 test recourses-Dialog,双击 IDD_TEST_DIALOG ,编辑我们 的主界面对话框。 双击击 电话”,弹出如下对话框,按确认键: Add Member Functioii |P| Member function name: Cancel Message: OnComm Object ID: IDC_MSCOMM1 VC会进入源码编辑窗口,这个函数是用来处理串口事件的,当 PC串口接收到数据时,会 产生一个数据缓冲区有数据的消息事件, 然后调用执行这个

15、函数。添加如下代码,进行数据 处理,窗口更新等操作: VARIANT variantl;/定义VARIANT型变量,用于存放接收到的数据 COleSafeArray safearray;/ 定义 safearray 型变量 LONG len,k;/定义长整型变量 len,k BYTE rxdata2048;/ 定义 BYTE 型数组 CString stremp1,stremp2;/ 定义两个字符串OnCommMscomml if(m_comm1.GetCommEvent()=2)/ 判断引起 OnComm 时间的原因 (/如果是接收到特定个字节数,则读取接收到的数据 variantl = m

16、_comm1.GetInput();/把接收到的数据存放到 VARIANT型变量里 safearray = variant1;/V ARIANT 型变量转换为 ColeSafeArray 型变量 len = safearray.GetOneDimSize(); for(k=0;klen;k+) ( safearray.GetElement(&k,rxdata+k); / 得到接接收到的数据放到 BYTE 型数组 rxdata 里 for(k=0;klen;k+) ( BYTE bt = (*(unsigned char*)(rxdata+k); / 读取 AD 转换的高字节 if(k%

17、2)=0) if(k+1)6); / 高低字节合并成实际的转换结果,注 意转换结果是左对齐 stremp1.Format(%2.2f,(2.56*temp/1024);/ 计算成实际电压值 SetDlgItemText(IDC_STATIC,(当前电压值为: +stremp1+ V); / 更新静态文本控件 pbar - SetPos(temp);/更新进度条的当前位置 strRXDdata += stremp2;/把新的数据放到全局的字符串里 strRXDdata += stremp1; strRXDdata += Vrn;/字符串加单位 V后换行 SetDlgItemText(IDC_ED

18、IT1,strRXDdata);/ 更新文本控件的显示 uoidl CTrst Dlq:DnDnCoMHscofWil () / TDDDi Add yicur control natirlcatiin handL ia CDdF Dr(*c-0;k(rxdatj k); /j -fl Di oiMiLu?rit ()-?) ff 用于荐放畿收别的裁餐 j Eft 庄工土华窑令ips /定BYT理翼粗 varljirit 1 FH CQimli .EeU npul:(); sifrjrriigi u.iri 判断引悲姑血7间的原因 把蠢收放到 UARlfiHtP .Ji g /。朋 I AtU

19、 型曩* m 】M “ w ru i到的*2据 Mt 顷 联拙 ,携位列mr藉一冷科 r 侦逢 LINK : LNK4073: cannot create map for .ILK file; linking nonincrementally 出现下面错误,请关闭运行的 test.exe后重试。 LINK : fatal error LNK1104: cannot open file Debug/test.exe” 出现下面错误两种错误, 是由于空间编号问题引起的, 当我们添加了编辑框或者 龟话”后再 添加,其编号自动加一,就会出现控件没定义。 Z:vc+ 串口上位机 testtestDlg.

20、cpp(32) : error C2065: IDC_MSCOMM1 : undeclared identifier Z:vc+ 串口上位机 testtestDlg.cpp(139) : error C2065: IDC_EDIT1 : undeclared identifier 解决方法是,在 RecourseView里,打开窗体IDD_TEST_DIALOG ,右击 电话”或者编辑框 等其它出错的控件,右击选择属性,在常规里修改 ID,这里的程序,除 BUTTON有1、2 两个之外,其它都是1 i cr vsitft CoBBuni cati Control 云 常规 General Bu

21、ffers | D: |lDC_MSC0MM1 Q 可见凶 厂组回 r己禁用回 v制表站回 全部组建编译一下, 看看有没有错误,没有错误就可以运行一下, 可以看到界面更原来是 样的。有错误就修改一下,省得弄多了,错在哪里都不知道,查起来麻烦。 8、在源码编辑里,打开 testDlg.cpp文件,进行窗口初始化函数的编写。 找到 BOOL CTestDlg:OnInitDialog()函数, 在 SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here 后面添加如下初始化代码: gllen =

22、0; /记录转换次数全局变量清零 if(! m_comm1.GetPortOpen()/ 判断串口是否已经打开 m_comm1.SetCommPort(1); / 选择串口号 1 m_comm1.SetPortOpen(TRUE); / 打开串口 m_comm1.SetRThreshold(2); /收到两个字节引发 OnComm 事件 m_comm1.SetInputMode(1);/ 输入模式选为二进制 m_comm1.SetSettings(57600,n,8,1); 设置串口参数,波特率 57600,无奇偶校验,1位停止 位,8位数据位 MessageBox(串口初始化完毕,提示);/

23、提示串口成功初始化 else MessageBox(串口被占用,提示);/如果已经打开串口,消息框提醒 pbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/ 获得指向 IDC_PROGRESS1 的指针 pbar - SetRange(0,1023);/ 设置进度条的范围 01023 pbar - SetPos(0);/当前位置为 0 m_serial.SetWindowText(关闭串口 );/按钮显示状态改变 / IODO: Add extrd initiali/ IODO: Add extrd initializdtiam herezdti

24、am here gllen 0; 1F( ? n COMI ,GetPartop*n( ; 1 nputMadfifl); .Sst&pttingsC &oa.ri.SV; HessdgeSox (”串口初弟化完毕”H示”); ?1 MPESJi)eBox(串口袖占用握示); pbjr - (CProgrpCtrl-)EPt lg I t M I DC_PR4ERESS1); pbjr - SrtRnqetV,10?3); pbar - tPtM D; _HH M. .SttWndokffMtr 美用亭口 P; 可以看到,串口的参数等等都在在这里初始化的, 可以根据自己的需要修

25、改的, 具体可以查 看VC+里的详细介绍,看看有哪些参数可以给我们修改来用。 添加后再编译一下,运行后可以看到多了一个串口初始化的提示信息窗口。 至此,我们已经完成了主要的串口操作及界面,剩下的就是两个按钮的操作了。 9、回到资源视图的IDD_TEST_DIALOG 窗口,双击开始转换按钮,给它添加事件,点击 后PC通过串口发送0 xaa出来,给单片机接收。 添加如下代码: CByteArray m_Array; / 定义字节数组 m_Array.RemoveAll(); / 字节数组清空 m_Array.SetSize(1); / 设定维数为 1 m_Array.SetAt(0,0 xaa)

26、; / 给 m_array0赋值 0 m_comm1.SetOutput(COleV ariant(m_Array);/ 由于 SetOutput 函数的参数为 VARIANT 型,必 须强制转换后才能发送 void CTestDlg::0nBuCton1() / IODO: Add your control not iFicat i* * * CBteArra n Array; 定义字节数组 .Renoueftllf ; 字 /会虱清空 n_Array ,SetSize( 1); 设定维数为 1 i* Arry.Setfttf。,跄 2); 绐“_日“对【明斌麓.0 R coRinl .SetOutput (COlUariant (FI Rrra) : Set Out puliSj敦的舞敷出 ,/ N -H H 9 H M- * N N H H M H H H i M H H 4* H 同样地,双击另外一个按钮,给串口操作按钮添加代码, 用于关闭或者打开串口。 添加如下 代码: if(! m_comm1.GetPortOpen()/ 判断串口是否已经打开 C C 目

温馨提示

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

评论

0/150

提交评论