VC++6.0实现串口

上传人:guoxi****anyue 文档编号:145851028 上传时间:2022-08-30 格式:DOCX 页数:50 大小:747.05KB
收藏 版权申诉 举报 下载
VC++6.0实现串口_第1页
第1页 / 共50页
VC++6.0实现串口_第2页
第2页 / 共50页
VC++6.0实现串口_第3页
第3页 / 共50页
资源描述:

《VC++6.0实现串口》由会员分享,可在线阅读,更多相关《VC++6.0实现串口(50页珍藏版)》请在装配图网上搜索。

1、第6章VisualC+串口通信程序设计典型实例利用VisualC+开发串口通信程序既可以使用MSCoinin控件也可以调用WindowsAPI函数。不过,只要MSCoinin可以被选用,它几乎总是我们推荐的选择。在本章提供的串口通信程序设计中,PC与单片机、PC与智能仪表、PC与PLC、PC与GSM短信模块等串口通信任务的实现均采用MSCoinin控件。6.1 PC与PC串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信屮只需3根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。本设计通过两台PC串口三线连接,介绍了利用API函数和MSCoinin控件设计

2、串口通信程序的方法,包括字符与文件的发送与接收。6.1.1 PC与PC串口通信程序设计目的设计目的有以下两个方面。(1) 掌握PC与PC串口通信的线路连接方法。(2) 利用VisualC+API函数和MSConmi控件实现PC与PC串口通信的程序设计方法。6.1.2 PC与PC串口通信程序设计用软、硬件本设计用到的硬件和软件清单见表6-1o表6-1设计用软、硬件序号名称数量1PC或IPC12串口通信线(三线制)13VisualC+6.016.13PC与PC串口通信程序硬件线路第6章VisualC卄串口通信程序设计典型实例线路说明:在计算机通电前,如图61所示,将两台PC通过串口线连接起来:PC

3、中A串口COM1端口的TXD与PC中E串口COM1端口的RXD相连;PC中A串口COM1端口的RXD与PC中B串口COM1端口的TXD相连;PC中A串口COM1端口的GND与PC中B串口COM1端口的GND相连。6.1.4PC与PC串口通信程序设计任务利用VisualC+API函数和MSConmi控件编写程序实现PC与PC串口通信。(1)两台计算机互发字符并自动接收,如一台计算机输入字符串“Pleaseetumabcl23”,执行“发送字符”命令,另一台计算机若收到,就输入字符串“nbcl23”,执行“发送字符”命令,信息返回到第一组的计算机。实际上就是编写一个简单的双机聊天程序。(2)将文本

4、文件或二进制文件通过串口从一台计算机传送到另一台计算机。图6-1PC与PC串口通信线路-217-6.1.5任务实现6.1.5.1利用API函数实现字符发送与接收1. 建立工程(1)启动VisualC+6.0,执行“文件”菜单中的“新建”命令,显示新建对话框,选择uMFCAppWizard(exe)n工程类型,输入需要创建工程的名称“pc_pc_api”和目录。(2)按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。(3)单击“完成”,将会弹出一个关于新工程信息的对话框。单击“确定”按钮。这样MFC向导便自动生成了一个名称为pc_pc_api的工程。2. 资源创建(1)应用

5、程序中添加了一个对话框资源IDD_PC_PC_API_DIALOG,打开属性对话框,将对话框标题改为“PC与PC串口通信API”。(2)删除对话框中原来的Static文本,用面板为对话框添加如表62所示的控件,并按照图62所示放置。表62对话框的控件类型、ID及相关属性控件类型ID号标题属性功能静态文本默认显示接收字符区默认标签静态文本默认输入发送字符区默认标签编辑框IDC_ieceiveHorizontalscioll(V)显示接收字符区Mutilme(J)编辑框IDC_sendHorizontalscioll(V)显示发送字符区Mutilme(V)按钮IDOK发送默认发送字符命令按钮IDC

6、ANCEL退出程序默认关闭程序命令(3)添加成员变量,在“查看”菜单屮或在对话框上单击鼠标右键,打开“ClassWizard对话框中的“MemberVariables标签,选中所需的控件ID号,双击鼠标左键或单击AddVariables按钮,依次为表63中所列控件增加成员变量。表6-3成员变量控件ID号变量类型变量名IDCieceiveCStfiiigmstiReceiveIDCsendCStiiiigmstfSend(4)切换到ClassWizard的MessageMaps标签页或在对话框屮双击每一个按钮,为发送”、“退出”按钮分别添加ON_BN_CLICKED消息响应函数OnOK(),On

7、Cancel()o3. 程序代码设计窗体模块程序如下:(1)在pc_pc_apiDlg.cpp文件的开始处,增加全局变量、消息和线程函数,代码如下:constCM_RECEWE=WM_USER+100;自定义一个消息OVERLAPPEDtOverLaped=0;线程函数使用的OVERLAPPED结构OVERLAPPEDwOveiLaped=0;/写操作使用的OVERLAPPED结构OVERLAPPEDrOverLaped=0;读操作使用的OVERLAPPED结构BOOLIsFun=True;/线程是否运行BOOLIsStop=False;数据是否发送完毕DWORDTlueadFunction(

8、LPVOIDpPaiam)t线程函数DWORDdwEvtMask,dwResult;tOveiLaped.liEvent=CieateEvent(NULL,Tine,False,NULL);创建一个事件while(IsFun)WaitComiiiEvent(CPc_pc_apiDlg*)AfxGetMaiiiWndO)-hCom,&dwEvtMask,&tOveiLaped);/等待窗口事件dwResult=WaitFoiSingleObject(tOverLaped.liEvent,100);如果事件没有信号,延时0.1sswitch(dwResult)caseWAIT_OBJECT_0:事

9、件对象有信号switch(dwEvtMask)caseEV_RXCHAR:接收到数据if(IsStop)发送停止IsStop=False;发送消息,由消息处理函数接收数据:PostMessage(AfxGetMamWnd()-m_liWnd,CM_RECEIVE,O,(LPARAM)EV_RXCHAR);break;break;retuni0;(2) 在BEGIN_MESSAGE_MAP消息映射代码中,添加自定义消息映射,代码如下:BEGIN_MESSAGE_MAP(CPc_pc_apiDlg,CDialog)/AFX_MSG_MAP(CPc_pc_apiDlg)ON_WM_SYSCOMMAN

10、DQON_WM_PAINT()ON_MESSAGE(CM_RECEIVE,OnRecieveData)/添加自定义消息ON_WM_QUERYDRAGICON0/AFX_MSG_MAPEND_MESSAGE_MAP()(3) 设置初始化函数OiihutDialogO,添加代码实现对话框串口通信的初始化工作,如下:BOOLCPc_pcDlg:OnIiiitDialog()-/vc自动生成的代码/TODO:AddextrainitializationhereCSeriesPoitO;retuniTine;/returnTineunlessyousetthefocustoacontrol(4) 实现发

11、送按钮、退出按钮相应的消息响应函数OnOK(),OnCancel()o代码如下:voidCPc_pc_apiDlg:OnOK()/TODO:AddextravalidationhereUpdateData(Tme);DWORDres;DWORDfactdata=0;wOveiLaped.liEvent=CreateEvent(NULL,Tme,False,NULL);仓U建一个事件对象IsStop=False;if(WnteFile(hCom,m_stiSend,m_stiSeiid.GetLengtli(),&factdata,&wOveiLaped)/开始发送数据IsStop=True;e

12、lseres=WaitForSiiigleObject(wOveiLaped.liEvent,5000);延时5秒,等待数据发送if(WAIT_OBJECT_0=res)如果事件处于有信号状态,表示发送完成IsStop=Tme;elseIsStop=False;Sleep(500);延时500毫秒voidCPc_pc_apiDlg:OnCancelO/TODO:AddextracleanuphereCloseHandle(liCom);CDialog:OiiCaiicel();(5) 为了实现API函数配置串口并打开串口,在pc_pc_apiDlg.cpp中增加成员函数,具体代码如下:void

13、CPc_pc_apiDlg:CSeriesPoit()/配置并打开串口liCom=CieateFile(”COMl”,打开串口1GENERIC_READ|GENERIC_WRITE,允许读和写操作0,独占方式NULL,OPEN_EXISTING,/打开一个存在的串口FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,异步方式打开NULL);if(hCom=INVALID_HANDLE_VALUE)MessageBox(端口打开失败.);letuin;SetupConmi(liConi,1024,1024);/设置发送和接收缓冲区大小/设置串口信息DCBdeb;

14、GetConiniState(hCom,&dcb);dcb.BaudRate=9600;dcb.fBinaiy=True;dcb.fPaiity=Tnie;dcb.BvteSize=8;dcb.Parity=ODDPARITY;dcb.StopBits=ONESTOPBIT;if(!SetConimState(hCom,&dcb)MessageBox(”掩码设置失败提示”);letuin;if(?SetConmiMask(liCom,EV_RXCHAR|EV_TXEMPTY)MessageBox(”掩码设置失败提示”);letuin;DWORDparam;hlluead=CieateTlHea

15、d(NULL,0,(LPTHREAD_START_ROUTINE)TliieadFunctioii,&paiani50,&dwTliieadID);if(hTluead=INVALID_HANDLE_VALUE)MessageBox(线程创建失败提示”,64);letuin;IsFun=Tine;(6) 为了实现API函数自定义消息处理,用于接收消息,在pc_pc_apiDlg.cpp中增加成员函数,具体代码如下:自定义消息处理函数,用于接收消息voidCPc_pc_apiDlg:OnRecieveData(WTARAMwPaiam,LPARAMIPaiam)DWORDres,factbyte

16、;meniset(DataBuffei,0,1024);初始化数据缓冲区COMSTATist;CleaiConmiEnoi(liConi,&】es,&rst);/清空串口错误标志,记录当前通信状态1OveiLaped.hEvent=CreateEvent(NULL,Tine,False,NULL);创建一个事件对象if(ReadFile(hCom,DataBuffer,rst.cbhiQue,&fhctbyte,&iOveiLaped)读取数据到缓冲区中DataBufferrst.cbInQue=0;IsStop=False;elseres=WaitForSmgleObject(rOveiLa

17、ped.liEvent,5000);IsStop=False;m_stiReceive+=DataBuffef;UpdateData(false);4. 编译运行程序程序设计、调试完毕,执行菜单中的“启动”命令或单击工具栏中的“启动”快捷按钮,运行程序。(1)首先在程序窗体中发送字符区输入要发送的字符,单击“发送数据”按钮,发送区的字符串通过COM1口发送出去。(2)另一台计算机发送数据,本计算机自动读入并显示在接收数据区中。程序运行界面如图63所示。图6-3程序运行界面6.1.5.2利用MSComm控件实现文件发送与接收1. 建立工程(1)启动VisualC+6.0,执行“文件”菜单中的“新

18、建”命令,显示新建对话框,选择uMFCAppWizard(exe)工程类型,输入需要创建工程的名称“pc_pc”和目录。(2)按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。(3)单击“完成”按钮,将会弹出一个关于新工程信息的对话框,如图64所示。单击“确定”按钮。这样MFC向导便自动生成了一个名称为pjpc的工程。图6-4新建工程信息2. 资源创建(1)应用程序中添加了一个对话框资源IDD_pc_pc_DIALOG,打开属性对话框,将对话框标题改为“基于MFC的串口通信”。(2)为了实现计算机与计算机的串口通信,添加MScoimn控件。选择“工程”菜单中的添加匸程”卜

19、的“ComponentsandControlsn选项,在弹出的对话框中双击“RegisteredActiveXControls项,选择MicrosoftCommunicationsControl,version6.0”项,单击Insert”按钮,在弹出的对话框中单击“OK”按钮,再在弹出的对话框中单击“结束”按钮关闭对话框,所选择的控件就会出现在“控件面板”中,然后将其添加到对话框中相应位置。(3)删除对话框中原来的Static文本,用面板为对话框添加如表64所示的控件,并按照图65所示放置。表64对话框的控件类型、ID及相关属性控件类型ID号标题属性功能静态文本默认显示接受字符区默认标签静态

20、文本默认输入发送字符区默认标签编辑框IDC_ieceiveHoiizontalscioll(V)显示接受字符区Mutiliiie(J)编辑框IDC_sendHoiizontalscioll(V)显示发送字符区Mutiliiie(J)Wantretuni(V)MSConmiIDC_MSCOMM1在程序中设置默认串口参数设置按钮IDOK发送默认发送字符命令按钮IDC_BUTTON1保存发送字符默认保存发送字符命令按钮IDC_BUTTON2选择发送文件默认选择发送文件命令按钮IDCANCEL退出程序默认关闭程序命令图6-5程序界面(4)添加成员变量,在“查看”菜单屮或在对话框上单击鼠标右键,打开“C

21、lassWizard对话框中的“MemberVariables标签,选屮所需的控件ID号,双击鼠标左键或单击AddVariables按钮,依次为表65中所列控件增加成员变量。表6-5成员变量控件ID号变量类型变量名IDCMSCOMM1CMSConunmctrlConmiIDCieceiveCStriiigmstrReceiveIDCsendCStriiigmstrSendIDCsendCEditmctrlSend(5) 切换到ClassWizard的MessageMaps标签页或在对话框屮双击每一个按钮,为“发送”,“退出”按钮分别添加ON_BN_CLICKED消息响应函数OnOK(),OnC

22、ancel()o(6) 在对话框屮双击MSComxn控件,为MSComin控件添加OnComm消息响应函数OnOnComiiiMscoimn1()。3. 函数代码实现(1) 在pc_pcDlg.cpp文件的开始处,增加全局变量,代码如下:CStnngstiDu-FUe;/保存文件路径的变量(2) 在pc_pcDlg.cpp文件中,设置初始化函数OnlnitDialogO,添加代码实现对话框各控件的初始化工作,如下:BOOLCPc_pcDlg:OnInitDialog()-/vc自动生成的代码选择COM1输入方式为二进制方式设置输入缓冲区大小/TODO:Addextrainitializatio

23、nherem_ctrlConmi.SetConmiPoit(1);m_ctiiConun.SetInputMode(1);m_ctilConiin.SetInBufferSize(1024);ni_ctrlConuii.SetOutBufferSize(512);设置输出缓冲区大小,波特率9600,无校验,8个数据位,1个停止位m_ctrlConmi.SetSettings(u9600,n,8Jn);打开串口参数1表示每当串口接收缓冲区中有多于或等于1个字符时将if(!m_ctilConuii.GetPortOpen0)m_ctilConun.SetPoitOpen(Tnie);m_ctiiC

24、onun.SetRTlueshold(1);设置当前接收区数据长度为0先预读缓冲区以清除残留数据引发一个接收数据的OnConmi事件m_ctiiConiin.SetlnputLen(O);m_ctiiConun.GetliiputQ;fetuniTrue;/letumTmeunlessyousetthefocustoacontrol(3) 实现保存发送字符按钮、选择发送文件按钮、发送按钮、退出按钮相应的消息响应函数OnOK(),OnCancel()o代码如下:voidCPc_pcDlg:OiiButtonl()/保存发送字符/TODO:Addyourcontrolnotificationhan

25、dlercodehereUpdateData(tnie);if(m_stiSend!=HH)CFileDialogdlg(fhlse伫xF;_TCshi】jutxt3NULLJText(*txt)Ftxt|AllFiles(*.*)|*.*|n,NULL);dlg.m_ofii.lpstiTitle=_T(n请选择保存路径);if(dlg.DoModal()=IDOK)stiDiiFile=dlg.GetPathNameO;CFilefile(strDirFile,CFile:modeCreate|CFile:modeReadWrite|CFile:shareExclusive);file.W

26、nte(m_stfSendjn_stiSend.GetLengtli();UpdateData(tme);file.CloseO;elseMessageBox(n请输入您要发送的字符串!”,”保存为文件”);m_ctrlSend.SetFocus();voidCPc_pcDlg:OiiButton2()/选择发送文件/TODO:AddyourcontrolnotificationhandlercodehereCStiingstrf;strf=uTxtFiles(*.txt)|*.txt;CFileDialogdlg(Tnie,NULL,NULL,OFN_EXPLORER|OFN_HIDEREA

27、DONLY|OFN_ENABLESIZING|OFN_FILEMUSTEXIST,stif);dlg.m_ofii.lStmctSize=sizeof(OPENFILENAME);if(dlg.DoModal()=IDOK)stiDiiFile=dlg.GetPathName();elsereturn;UpdateData(false);CFilefile(stiDiiFile5CFile:modeReadWrite|CFile:shaieExclusive);UpdateData(tnie);file.SeekToEiid();unsignedlongfileLengtli=file.Get

28、Length();char*fileBuff;fileBuff=newchaifileLength;file.SeekToBeginQ;if(file.Read(fileBuff,fileLengtli)1)/如果读的文件长度小于1,则退出file.Close();return;elsefileBufffileLength=O,;mstiSend=fileBuff;file.Close();UpdateData(false);voidCPc_pcDlg:OnOKQ发送按钮/TODO:AddextravalidationhereUpdateData(Tme);读取编辑框内容m_ctilConun

29、.SetOutput(COleVariant(m_strSend);发送数据voidCPc_pcDlg:OnCancel()退出按钮/TODO:Addextracleanupherem_ctrlConun.SetPortOpen(0);CDialog:OnCaiicelQ;(4) 实现MSCoimn控件相应的消息响应函数OnOnCommMscomml()。代码如卜:voidCPc_pcDlg:OnOnConuiiMsconmil()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTvaiiant_inp;COleSafeAiiaysaf

30、eauay_iiip;LONGleak;BYTEixdata2048;设置BYTE数组事件值为2表示接收缓冲区内有字符读缓冲区/VARIANT型变量转换为ColeSafeAiiay型变量得到有效数据长度CStiiiigstilemp;if(m_ctilConun.GetConmiEvent()=2)variant_inp=m_ctilConmi.Gethiput();safeaiTay_inp=ranant_iiip;len=safeaiTay_mp.GetOneDimSize();fbr(k=O;klen;k+)safeaiTay_mp.GetElement(&k4xdata+k);/转换为

31、BYTE型数组fbi(k=O;klen;k+)/将数组转换为Cstnng型变量BYTEbt=*(cliar*)(rxdata+k);/字符型strtemp.Fonnat(%c,bt);/将字符送入临时变量stitemp存放m_stiReceive+=stilemp;加入接收编辑框对应字符串UpdateData(False);更新编辑框内容4. 编译运行程序设计、调试完毕,执行菜单中的“启动”命令或单击工具栏中的快捷按钮“启动”,运行程序。(1)在程序窗体中的发送区输入要发送的字符,单击“保存发送字符”按钮,发送区的字符串保存到指定文件中;单击“选择发送文件”按钮,打开指定文件并将其中的字符显示

32、到发送字符区。(2)单击“发送”按钮,发送字符区的数据发送到连线的计算机中并显示在其接收字符区中。程序运行界面如图66所示。图6-6程序运行界面6.1.5.3利用MSComm控件实现字符发送与接收1. 建立工程(1)启动VisualC+6.0,单击“文件”菜单中的“新建”命令,显示新建对话框,选择“MFCAppWizard(exe)”工程类型,输入需要创建工程的名称“pc_pc”和目录。(2)按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。(3)单击“完成”按钮,将会弹出一个关于新工程信息的对话框。单击“确定”按钮,这样MFC向导便自动生成了一个名称为“pjpc”的工程

33、。2. 资源创建(1)应用程序中添加了一个对话框资源IDD_pc_pc_DIALOG,打开属性对话框,将对话框标题改为“基于MFC的串口通信”。(2)为了实现计算机与计算机的串口通信,添加MSconun控件。选择“工程”菜单中的添加匸程卜的“ComponentsandControlsn选项,在弹出的对话框中双击“RegisteredActiveXControls项,选择uMicrosoftCommunicationsControl,version6.0v项,单击Insert”按钮,在弹出的对话框中单击“OK”按钮,再在弹岀的对话框中单击“结朿”按钮关闭对话框,所选择的控件就会出现在“控件面板”

34、中,然后将其添加到对话框中相应位置。(3)删除对话框中原来的Static文本,用面板为对话框添加如表66所示的控件,并按照图67所示放置。图6-7程序界面表66对话框的控件类型、ID及相关属性控件类型ID号标题属性功能静态文本默认显示接收字符区默认标签静态文本默认输入发送字符区默认标签编辑框IDC_ieceiveHoiizontalscioll(V)显示接收字符区Mutilme(V)编辑框IDC_sendHoiizontalscioll(V)显示发送字符区Mutilme(V)MSConunIDC_MSCOMM1在程序中设置默认串口参数设置按钮IDOK发送默认发送字符命令按钮IDCANCEL退出

35、程序默认关闭程序命令(4) 添加成员变量,在“查看”菜单中或在对话框上单击鼠标右键,打开“ClassWizard对话框中的“MemberVariables标签,选中所需的控件ID号,双击鼠标左键或单击AddVariables按钮,依次为表6-7中所列控件增加成员变量。表6-7成员变量控件ID号变量类型变量名IDCMSCOMM1CMSConunmctrlCominIDCieceiveCStriiigmstrReceiveIDCsendCStriiigmstrSend(5) 切换到ClassWizard的MessageMaps标签页或在对话框中双击每一个按钮,为“发送”、“退出”按钮分别添加ON_

36、BN_CLICKED消息响应函数OnOK(),OnCancel()o(6) 在对话框屮双击MSConun控件,为MSConun控件添加OnComm消息响应函数OnOnCoimiiMscoinin1()。3. 函数代码实现(1) 在pc_pcDlg.cpp文件中,设置初始化函数OnlnitDkilogO,添加代码实现对话框各控件的初始化工作,如下:BOOLCPc_pcDlg:OnInitDialog()-/vc自动生成的代码/TODO:Addextrainitializationherem_ctilConun.SetConniiPort(1);m_ctiiConun.SetInputMode(1

37、);选择COMI输入方式为二进制方式m_ctrlConmi.SetInBuffeiSize(1024);设置输入缓冲区大小设置输出缓冲区大小,波特率9600,无校验,8个数据位,1个停止位m_ctrlConmi.SetOutBuffefSize(512);m_ctrlConmi.SetSettings(u9600,n,8,1H);if(!m_ctilComin.GetPoilOpen0)m_ctrlConmi.SetPoilOpen(Tiiie);打开串口参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_ctilConuii.SetRTlueshold

38、(1);m_ctrlConmi.SetInputLen(0);/设置当前接收区数据长度为0m_ctrlComin.GetbiputO;先预读缓冲区以清除残留数据retuinTme;/letuinTrueunlessyousetthefocustoacontrol(2) 实现发送按钮、退出按钮相应的消息响应函数OnOK(),OnCancel()o代码如下:voidCPc_pcDlg:OnOKQ发送按钮/TODO:Addextravalidationhere退出按钮voidCPc_pcDlg:OnCaiicel()/TODO:Addextracleanupherem_ctiiConun.SetPo

39、itOpen(O);CDialog:OnCancelQ;(3)实现MSCoiiun控件相应的消息响应函数OnOnCommMscomml()。代码如卜:voidCPc_pcDlg:OnOnConuiiMsconmil()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTvaiiant_inp;COleSafeAiiaysafeaiTay_iiip;LONGlen,k;BYTEixdata2048;设置BYTE数组CStiiiigstrtemp;if(m_ctilConmi.GetConuiiEvent()=2)事件值为2表示接收缓冲区内有

40、字符读缓冲区/VARIANT型变量转换为ColeSafeAiiay型变量得到有效数据长度variant_iiip=m_ctilConiiii.Gethiput();safeaiTay_inp=raiiaiit_iiip;len=safeanay_uip.GetOneDimSizeO;fbi(k=0;klen;k+)safeanay_uip.GetElement(&k、rxdata+k);fbi(k=O;kOiiButtonl().OiiButton2()o代码如下:voidCMc_mcDlg:OnOK()/TODO:AddextravalidationhereUpdateData(Tnie);

41、m_ctiiConmi2SetOutput(COleVaiiant(m_strcomldata);voidCMc_mcDlg:OnOkl()/发送/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(Tnie);m_ctiiConunl.SetOutput(COleVaiiant(m_strconi2data);voidCMc_mcDlg:OiiButton1()/TODO:Addyourcontrolnotificationhandlercodeherem_strcom1data=HH;UpdateData(false);void

42、CMc_mcDlg:OiiButton2()发送读取编辑框内容发送数据读取编辑框内容发送数据清空更新编辑框内容清空/TODO:Addyourcontrolnotificationhandlercodeherem_sticoni2data=MH;更新编辑框内容UpdateData(false);(3) 实现两个MSConun控件相应的消息响应函数OnOiiCommMscommlO,OnOnConmiMscominl(),代码如卜:voidCMc_mcDlg:OnOnConuiiMsconiiiil(J/TODO:AddyourcontrolnotificationhandlercodehereV

43、ARIANTvariaiit_inp;COleSafeAiiaysafeaiTay_iiip;LONGlen,k;BYTEixdata2048;CStiiiigstrtemp;if(m_ctrlConmil.GetConmiEvent()=2)设置BYTE数组事件值为2表示接收缓冲区内有字符vanant_iiip=m_ctilConuiil.GetIiiputO;读缓冲区safeaiTay_inp=raiiaiit_iiip;/VARIANT型变量转换为ColeSafeAnay型变量len=safeanay_uip.GetOneDimSize();得到有效数据长度fbi(k=O;kieii;k

44、+)safeanay_uip.GetElement(&k、rxdata十k);/转换为BYTE型数组fbi(k=O;kieii;k+)/将数组转换为Cstimg型变量BYTEbt=*(chai*)(ixdata+k);stnemp.Fonnat(,l%ctbt);m_strcom2data+=stitemp;UpdateData(False);voidCMc_mcDlg:OnOnConuiiMsconmi2()/字符型/将字符送入临时变量smenip存放/加入接收编辑框对应字符串更新编辑框内容COleSafeAiiaysafeaiTay_iiip;LONGlen,k;BYTEixdata204

45、8;CStiiiigstrtemp;if(m_ctrlConmi2GetConmiEvent()=2)variant_iiip=m_ctflConuii2GetlnputQ;safeaiTay_inp=raiiant_iiip;len=safeaiTay_uip.GetOneDimSize();fbi(k=O;kieii;k+)safeaiTay_uip.GetElement(&kxdata+k);fbi(k=O;kVisualC+程序设计方法。6.2.2 PC与单片机串口通信程序设计用软、硬件本设计用到的硬件和软件清单见表6-8o表68设计用软、硬件序号名称数量1PC12单片机实验板(AT8

46、9C51.MAX232等)13串口通信线(3线制)14VisualC+6.016.2.3 PC与单片机串口通信程序硬件线路线路说明:如图612所示,数据通信的硬件上采用3线制,将单片机和PC串口的3个引脚(RXD、TXD、GND)分别连在一起,即将PC和单片机的发送数据线TXD与接收数据RXD交叉连接,两者的地线GND直接相连,而其他信号线(如握手信号线)均不用,采用软件握手的方式,这样既可以实现预定的任务又可以简化电路设计。但由于单片机的TTL逻辑电平和RS-232C的电气特性完全不同,RS-232C的逻辑0电平规定为+3V+15V之间,逻辑1电平为3V15V之间,因此在将PC和单片机的RX

47、D和TXD交叉连接时必须进行电平转换,这里使用的是MAX232电平转换芯片。单片机系统有LED显示器模块、继电器输出模块、蜂鸣器模块等。图6-12PC与单片机串口通信线路6.2.4设计任务利用KeilC51VisualC+编写程序实现PC与单片机串口通信。1 设计任务1PC通过串行口将数字00,01,02,03.,FF(十六进制)发送给单片机,单片机收到后回传这个数字,PC接收到回传数据后显示出来,若发送的数据和接收到的数据相等,则串行通信正确,否则有错误。启始符是数字00,结束符是数字FF。2 设计任务2(1) 测试通信状态。先在文本框中输入字符串“Hello”,单击“测试”按钮,将字符串“

48、Hello”发送到单片机,若PC与单片机通信正常,在PC程序的文本框中显示字符串“OK!”,否则显示字符串“ERROR!”。(2) 循环计数。单击“开始”按钮,文本框中数字从0开始累加,0、1、2、3,并将此数发送到单片机的显示器上显示;当累加到10时,回到0重新开始累加,依次循环;任何时候,单击“停止”按钮,PC程序中和单片机显示器都停止累加,再单击“开始”按钮,接着停下的数继续累加。(3) 控制指示灯。在单片机继电器接线端子的两个通道上分别接上两个指示灯,在PC程序界面上选择指示灯号,如1号灯,单击界面中的“打开”按钮,单片机上1号灯亮,同时蜂鸣器响;单击界面中的“关闭”按钮,1号灯灭,蜂

49、鸣器停止响;同样控制2号灯的亮灭(蜂鸣器同时动作)。6.2.5任务实现第6章VisiuilC卄串口通信程序设计典型实例单片机和PC通信,在程序设计上涉及如下两个部分的内容。一是单片机的C51程序;二是PC的串口通信程序和界面的编制。-221-6.2.5.1利用KeilC51实现单片机与PC串口通信任务1OOOOOO6.2.5.2利用VisualC+实现PC与单片机串口通信任务11. 建立工程(1)启动VisualC+6.0,执行“文件”菜单中的“新建”命令,显示新建对话框,选择uMFCAppWizard(exe)n工程类型,输入需要创建工程的名称“dpj”和目录。(2)按照弹出的应用向导对话框

50、依次填写,第1步选择基于对话框,其他均采用默认。(3)单击“完成”按钮,将会弹出一个关于新工程信息的对话框。单击“确定”按钮,这样MFC向导便自动生成了一个名称为“dpj”的工程。2. 资源创建(1)应用程序中添加了一个对话框资源IDD_DPJ_DIALOG,打开属性对话框,将对话框标题改为“PC与单片机串口通信”。图6-14程序界面(2)为了实现PC与单片机串口通信,添加MScoiwn控件。选择“工程”菜单中的“添加工程”下的ComponentsandControls”选项,在弹出的对话框屮双击“RegisteredActiveXControls”项,选择uMicrosoftCommunicationsControl,version6.0n工页,单击“Insert”按钮,在弹出的对话框中单击“OK”按钮,再在弹岀的对话框中单击“结朿”按钮关闭对话框,所选择的控件就会出现在“控件面板”中,然后添加到对话框中相应位置。(3)删除对话框中原来控件,用面板为对话框添加如表69所示的控件,并按照图614所示放置。表6-9对话框的控件类型、ID及相关属性控件类型ID号标题

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!