Cserialort编程步骤_第1页
Cserialort编程步骤_第2页
Cserialort编程步骤_第3页
Cserialort编程步骤_第4页
Cserialort编程步骤_第5页
免费预览已结束,剩余5页可下载查看

付费下载

下载本文档

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

文档简介

1、简单而强大的多线程串口编程工具Oser i a I Port类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)老有人觉得MSC沁通讯控件很上,更有人大声疾呼:忘了它吧.确实U我们对出口編程有了一宦的了解 后.应该用API函数写一个属于自己的串口程序.由于编程者对程序了解对程序修改自如。但我一直没 有停止过用MSCcmm通讯控件,那么简飛的东西对付简笊的任务完全可以.但'”1我们需要在程序中用多 个串口.而且还要做很多复杂的处理,那么嚴好不用MSComm通讯控件,如果这时你还不愿恿自己編写底 层.就川这个类:CserialPort类.这是Remon Spekrei jse写的一个串

2、口类, 地址在:http:/codeguru, earthweb, com, network/serialport, shtml类作者Remcn Spekreijse已作了一个基于对话框的同时检测4个串口示例的程序.在上浙的网址和我主 贞的串口源码下栽贞也可以找到。我在这儿主喪介绍如何将这个类应用到VC中基于文档的程序中0为r 加深对串口数据处理的r解.我们利用这个类解决如下问题:问题:串口 2 (COM2)毎隔1秒向串口 l(CONl)发送的NEMA格式的报文:串头为$串尾为*中间为一个XXKK 的整数(比如2315,不足4位则前血以0代替代)最后是hh校验.规定hh为XXXX 个数的半BY

3、TE 校验机用后加上回牟<CR>与换行<LF>整个数据包为$xxxx*hh<CR><LF>o串口 1收到上述报文后校验正确后,将发來的数据显示在视窗中.并记下发來的正确帧数和错渓帧数. 若正确.还向串口 2发送Y串口 2收到Y后将收到的Y的讣数:示在视窗中。测试方法:将三线制串口线联接上同一台计算机的两个串口.編好程序后就可测试0如果没有两个申口的微机.自己 改改程序。好了 你可以先下载源程序:scporttest, zip (大小:49KB. VC6. WIX9X, 2000. SerialPort. h SerialPort. cpp是两个类

4、文件)編程步9h 1.建立程序:建立一个基于丈档的MFC应用程序SCPortTest,所有步骤保持缺省状态。2.添加类文件:将 SerialPort. h SerialPort. cpp 两个类文件复制到工程文件夹中.用 Project-Add to Project-Files 命令将上述两个文件加入工程。并在SCPort Test View, h中将头文件SerialPort, h说明:Sinclude *SerialPort, h*。S人丄增加昭口消恩响应函数:OnCommunication(ttPARAM ch, LPARAM port)首托在SCPortTestView, h中添加串口

5、字符接收消息WM-COMM-RXCHAR (串口接收缓冲区内有一个字符)的 响应函数声明:/AFX_MSG(CSCPortTestView)afx_m£g LONG OnCommunicat ion(WPARAM ch, LPARAM port):/7)AFX_MSG然后在SCPortTestView, cpp文件中进行tfM_COMM_RXCHAR消息映射sBEGIX_MESSAG£_1!AP (CSCPort Test View, CView)/ (AFX_MSG_MAP(CSCPortTestView)ON-MESSAGE(WM-COMM_RXCHAR OnCommu

6、nication),/AFX_MSG_MAP£XD_MESSAGE_MAP<)接着在SCPortTestView. cpp中加入函数的实现:LONG CSCPortTestView:OnCommunication(HTARAM ch, LPARAM port)注总:由于这个串口类加入工程后没有自动的消息映射机制 w此上述步骤均需要于工添加4初始化串口在视创建时初始化串口,首先利用ClassWizardr按下图生成OnInitialCpdateO函数。5/8Messoge Maps | Member Voriablcs | Automation | ActiveX Events

7、| Class Info |Gloss name:V cSCPnnTesiVtewProject:L ISCPnnTesiAdd Class. CA»ASCPortTcsIVicw.lb C:UASCPoriTcstVicwxppObject IDs:ID APT AOOUTID_APP_FXIT lU-ED 匚 CORT id"editZcut ID EDIT.PASTE ID EDIT UNDOOnEndPrinting OnEndPrinlPrcvicwOnFinalRelease1OnInitialUpdateOnNotify OnPrcparcDC OnPrepa

8、rePrintlngJMessages:gdd huncficnDelele FunctionEdit CodeVVVVVMember tunctionG:OnDrawOnEndPrintingOnPieparePHniIngPreCrcaleWlndowDescription: Called after the first view is attached to a documentOKCancel接肴在SerialPort. h文件中说明我们在程序中耍川到的全周变保两个弗口接收数据:char ni_chChecksum: 用于COSH的枝验和讣算CString ni_strRXhhCOMl

9、: 用于成 CONI 接收的半 BYTE 校验字节 hh CString m_strRXDataCOMl; COH1 接收数据CString ni_strRXDataC0M2; /COM2 接收数据m_nRXErrorCOMl; /COHi接收数据错俣帧数 m_nRXErrorC0M2; COM2接收数据错俣帧数 m_nRXCounterCOMl: /COMl接收数据错i灵帧数 ni_nRXCounterC0M2; /COM2 接收数据错 i吴帧数 CStringUIXTUIXTUIXTUINT再在 SerialPort, h 文件中说明串 口类对仪:CSera 订 Port m_ComPor

10、t 2; (public )。 w为要初始化2个串口,所以这里川r数组。下面是初始化串口 1和串口 2:void CSCPwtTestView:OninitialCpdate()CView:Oninit ialUpdate 0;TODO: Add your specialized code here and/or call the base class ni_chChecksum=O; /校验和SO m_nRXErrorC0Ml=0: /COM接收数据错決帧数g 0 m_nRXErrorC0M2=0: /CO也接收数据错i吴桢数置0 m_nRXCounterC0Ml=0; /COMl 接收数据

11、错误帧数gO m_nRXCounterC0M2=0; /COM2 接收数据错误帧数g 0 m_strRXhhCOML Empty 0 ; /清空半 BYTE 校验 hh 心储变SforCint i=0;i<2;i+) if <m_CcmPortCi. InitPort (this, i+1, 9600/X', 8.1. EV_RXFLAG £V_RXCHAR. 512) /portnr=l (2), baud=960, parity=' X*, databits=& stopsbits=l./dwCommEvents=EV_RXCHAR EV_RX

12、FLAG, nBufferSi2e=512 m_ComPort i. StartMcnitoringO ; /启动串口监视线程SetTimerd, lOOO.NlW; /i殳S定时器.1 秒后发送数据elseCString str;str. Format (*COM%d没有发现.或被其它设备占用",1);AfxMessageBox (str);5利用Classffizard按下图生成CSCPortTestView的时间消息O_T1MER响应函数:MeGcage MapsEiojcd:(SCPortTcstCSCPortTcsWicwCAKSCPorlTcstVicw.lb CX.SC

13、PortTc5tVicwxppObject IDs:!D_APP_ADOUT ID_APP_EXIT IDlFDlflCOPY ID EDIT CUT ID_FDIT_PASTE ID EDir UNDOClass name:2Add Class.妙 d FoncllcnMessages:Delete FunctionMember funettone:VVVWM-SETCUHSOK WM 二SETFOCUS V/M_SHOWWINDOW WM 二SIZETCARD I |WMjScROLLEdit CodeOnDriwOnEndPrIntIngOntnttialUpdateOnPrepareP

14、rintingZLdMember Variables Automation ActiveX Events Clacc InfoDescription:Indicates timeout Inleival for a timer has eidpsedOKCancelvoid CSCPortTestViev: :0nTimer CtlXT nIDEvent) / TODO: Add your message handler code here and or call default int randdata=rand()%9000: /产生 9000 以内的随机数CString strSendD

15、ata;strSendData, Format(*%01d", randdata);SendString (strSendData, 2); /弗口 2 发送数掘: CView: :0nTinier (nIDEvent);上面用到的SendStringO nS按如下方式生成j在ClassView中单击歐标右键.在环境菜社中选择Add Member Function:9 / 8UNFunction Type: IvoidOKCancelFunction Declaration:|SendS'(nngCString int PortAccess=1护 PublicC Protec

16、tedr Private厂 Static厂 VirtualvoidCSCPoi订estView:SendString(CStringint Port)charchecksum=O, cr=CR, lf=LF;cl, c2;forCint i=0: i<str, GetLengthO ; if) checksum = checksum'stri; c2=checksum & OxOf; cl=<(checksum if (cl < 10) cl*= ' 0* ; else cl = if c2 < 10) c2=' o' else

17、c2 *= CString strl: strl=' S'ni_CciiiPort uPortl, WriteToPort (LPCTSTR) strl);char» 4) & OxOf);'A* - 10;'A* - 10;请注总上而函数中是如何生成校验码的要切记的是发送的枝验码生成方式和对方接收的校验检测方式嬰 i致。6 在 OnCommunication(WPARAM ch, LPARAM port)函数中进行数据处理说明:WPARAM、LPARAM类型是多态数据类型(polymorphic data type)-在WIX32 为32位支

18、持多 种数抑:啖型根据需耍自动适应,这样程序有很强的适应性。在此我们可以分别理解为char和integer类 型数撫°每Y串口接收缓冲区内有一个字符时.就会产生一个WM-COMM-RXCHAR消息触发OnCommuni cat ion函数. 这时我们就可以在函数中进行数据处理.所以这个消息就是整个程序的"发动机下面是根据木文嚴初提出的间题写出的处理函数:LONG CSCPortTestView:0nCommunication(WPARAM ch, LPARAM port) static mt count 1=0, count2=0, count3=0;static char

19、 cl, c2: static int flag; CString strCheck=*;if(port=2> /. C0M2 接收到数据CString strtenip= (char) ch: if (strtenip=*Y*) m_nRXCoun t erCCB12 +;CString strtemp;strtemp. Format (*CCB12: NO. %06d* ni_nRXCounterC0M2);CDC* pDC=GetDCO: /准备数据显示pDC->TextOut (10, 50» strtemp) ;/显示接收到的数据 Released (pI>

20、;C);if(port=l> /COMl 接收到数据m strRXDataCOMl+= (char)ch;switch(ch)case ':ni_chChecksum=O; flag=0;/开始 i I算 Checksumflag=2; c2=in_chChecksum if (cl < 10) cl代 if <c2 < 10) c2代break; case ' *':OsOf; cl=(m_chChecksum » 4) & OxOf);P ; else cl 代'A' - 10;> o' ; e

21、lse c2 代'A' - 10;break;case CR: break;case LF: ni_strRXDataCOMl, Empty (); break;default: m_strRXhhCOMl += ch; /得到收到的校验值hh if(flag=l) strCheck = strCheck-cHc2: /il算得到的校验ffthh if(strCheck!=m_strRXhhCOMl) /如果校验有错m_strRXDataCOMl, Empty t);m_nRXErrorCOMl+: /串口 1 错 i吴帧数加 1 else ni_nRXCounterCOMl*H-;if (m_strRXDataCOML Left <!)="$*)

温馨提示

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

评论

0/150

提交评论