

免费预览已结束,剩余37页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
* 实践教学*兰州理工大学计算机与通信学院2015年秋季学期计算机通信课程设计题 目:基于windows api编程的串行异步通信程序设计 专业班级: 姓 名: 学 号: 指导教师: 王惠琴 成 绩: 摘 要 本文系统介绍了visual c+实现异步串行通信的基本原理及过程,讲述了用windows函数库api函数实现和c运行时的实现方法,利用vc+6.0 来做用户界面,根据所需可以自己设计界面布局,设备的数据设置和id设置,我们可以将主要工作集中在串口编程方面,结合串口通信的机理和同步技术,最终实现串口异步通信功能。关键词:串口通信;异步i/o; visual c+应用 目录 前 言2一串口简单介绍31.1 rs-232简介31.2串口通信参数41.3数据校验方法41.4串口通信原理与特点41.5串口通信的传输方式5二串行通信中主要的技术问题52.1调用win32api通信函数52.2 数据的传输6三 串行异步通信系统设计63.1系统需求分析63.2系统分析73.3系统设计7总结12附录:14 前 言 visual c+是建立在window array5和window nt 32位程序上的可视化编程环境,对于控制系统的可视化开发提供了极大的便利,但是对于计算机控制系统中数据采集、控制,用visual c+实现的介绍却很少。基于此,介绍visual c+在测控系统应用中的基本原理及应用,其中异步串行通信是关键。其基本构成是:(单片机系统)完成信号检测、a/d转换和简单的控制功能,通过系统总线(如rs-232c)与上位机(pc机)相连,进行监测、控制,形成主从式结构。 串口通信是计算机与其他设备进行数据通信时经常使用的方法之一,他具有实现简单,使用灵活方便,数据传输可靠等优点,因而在工业控制、数据采集和实时监控系统中得到广泛应用本文的串口通信软件的开发没有使用任何串口通信的第三方封装控件,全部使用windows api函数对串口进行操作和配置,而且使用了多线程技术和异步i/0操作,提高了串口通信的效率和程序的灵活性。 一串口简单介绍1.1 rs-232简介 在rs-232标准中,字符是以一序列的位元串来一个接一个的串列(serial)方式最常用的编码格式是异步起停asynchronous start-stop格式,它使用一个起始位元后面紧跟7或8 个数据位元(bit),这个可能是奇偶位元,然后是两个停止位元。所以发送一个字符至少需要10位元,带来的一个好的效果是使全部的传输速率,发送信号的速率以10划分。一个最平常的代替异步起停方式的是使用高级数据链路控制协议(hdlc)。 在rs-232标准中定义了逻辑一和逻辑零电压级数,以及标准的传输速率和连接器类型。信号大小在正的和负的315v之间。rs-232规定接近零的电平是无效的,逻辑一规定为负电平,有效负电平的信号状态称为传号marking,它的功能意义为off,逻辑零规定为正电平,有效正电平的信号状态称为空号spacing,它的功能意义为on。根据设备供电电源的不同,5、10、12和15这样的电平都是可能的。在txd和rxd上:逻辑1(mark)=-3v-15v,逻辑0(space)=+315v,在rts、cts、dsr、dtr和dcd等控制线上: 信号有效(接通,on状态,正电压)+3v+15v 信号无效(断开,off状态,负电压)=-3v-15 mark和space是从电传打字机中来的术语。电传打字机原始的通信是一个简单的中断直流电路模式,类似与圆转盘电话拨号的中的信号。marking状态是指电路是断开的,spacing状态就是指电路是接通的。一个space就表明有一个字符要开始发送了,相应的停止的时候,停止位就是marking。当线路中断的时候,电传打字机不打印任何有效字符,周期性的连续收到全零信号。在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯.rs232的逻辑电平与ttl以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的ttl器件连接,必须在eia-rs-232c与ttl电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。目前较为广泛地使用集成电路转换器件,如mc1488、sn75150芯片可完成ttl电平到eia电平的转换,而mc1489、sn75154可实现eia电平到ttl电平的转换。max232芯片可完成ttleia双向电平转换。1.2串口通信参数 1波特率:表示每秒钟传输的速率。这个值与距离正好成反比。速率越大它通信的距离就越短。 2数据位:衡量实际通信数据位的参数。一般标准的值为5位、7位和8位,这取决于通信协议。我们一般用数据包来表示通信的情况。 3停止位:单个数据包的最后一位。数据在传输时两端设备都会存在一点点不同步。所以停止位在用来表示数据传输结束时,它还能提供校正时间同步机会。停止位数据越多,不同时钟同步容忍度越大,相对传输的数率就越慢。 4基偶校验:串口通信中一种简单的校验方式,它分为基、偶、高和低。1.3数据校验方法串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符e,其d7到d0各位为:0100,0101=45h由于干扰,可能使码元变由0变为1,或则由1变为0,这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,叫“检错”。发现错误后,如何消除错误,叫“纠错”。 最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇偶校验位。可采用奇校验或偶校验。奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:1 0110,010,10 0110,0001第一位为奇校验位,其余各位为d7到d0位。偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:1 0100,01010 0,1000001第一位为偶校验位,其余各位为d7到d0位。 奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简1.4串口通信原理与特点 串行端口是cpu与串行设备间的编码转换器,当cpu经过串行端口发数据时,字节数据列队成串行位,串行端口接收数据时,串行位转换成字节数据.所以必须安装相应的驱动程序. 串行通信有成本低的特点,而且可以在现有的电话网络上进行传输,家庭通过电话线上网即是这种方式.只要配置一个相应的通信接口,如:modem.1.5串口通信的传输方式 单工:只能从一头传输到另一头,如只能从a向b传或者b向a传,如看电视,只允许电视台向电视发数据,不允许电视向电视台发数据.在单工传输方式上一般采用两个通信,一个通道传输数据,一个通道传输控制信号. 半双工:允许互传信息,但是不能同时进行,如对讲机,a说话时,b不能说话,b说话时a不能说话. 全双工:允许双同时通信,如讲电话. 异步传输:按字节为单位传输,异步传输方式也叫起止方式,在被传输的字节前后加起止位,起止位无信号时处于高电平,接收方检测到低电平信号表示开始接收,收到停止信号表示传输完成.物理连接建立后,需要使用一种机制使对方正确解释发送的数据,发送方安位发出数据后,接收方如何识别这些数据,并如何正确组装成正确的字节.这就需要同步技术.数据同步技术一般解决如下问题:确定发送数据起始时间,发送数据的传输速率, 发送数据所需的时间,发送时间间隔 同步传输:以数据块为单位传输,在块的前后加一个特殊字节表示起止,传输效率高,线路利用率高,设备负担也大.单,仍得到了广泛使用。 二串行通信中主要的技术问题2.1调用win32api通信函数 直接调用windowsapi函数,可以清楚地理解串口通信的机制,根据需要灵活地配置串口的各种参数和属性,而且直接调用低层api函数,通信效率比较高,但付出的代价就是程序较复杂,编程周期长,适合于大型通信程序及通讯质量要求较高的场合。 在32位的windows系统中,串口通信是作为文件处理的,串口操作一般为打开、关闭、读取、写入等操作,相应的windowsapi函数如下:(1)createfile()函数:实现串口的初始化并打开串口,返回串口句柄资源以供后续进程调用。(2)closefile()函数:关闭串口,串口是非共享资源,应用程序以独占方式使用,通信结束应立即关闭。(3)readfile()函数:从串口输入缓冲区读取数据流。(4)writefile()函数:向串口输出缓冲区发送数据。(5)getcommstate()函数:获取串口的当前配置。(6)setcommstate()函数:重新分配串口资源的各个参数。 由于windowsapi函数大部分是用c或c+编写,所以在visualbasic6.0中调用windowsapi函数之前必须先在模块级代码上用declare语句对所调用的函数和用到的数据结构进行声明,具体的函数声明及数据结构请参考朱友芹编新编windowsapi参考大全。 2.2 数据的传输 串行通信中主要有两个技术问题,一个是数据传送、另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。数据转换是指数据的串并行转换。具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行数据转换为并行数据。 三 串行异步通信系统设计3.1系统需求分析一.确定基本功能 1.自动寻找串口,并自动添加到下拉框中共选择; 2.有波特率、数据位、停止位、校验位的选择设置; 3.串口打开控制按钮; 4.发送、清除按钮; 5.接收是自动实现的; 6.有定时自动发送功能; 7.有传送文件功能; 8.有状态栏显示,指示串口状态,设置参数和发送接收显示。二一般编制串行通信程序分以下几个部分:打开串行端口:打开通信资源,设置通信参数、设置通信事件、创建读、写事件、进入等待串口消息循环。读取串行端口信息:当串口发生ev_rxchar(接收到字符并放入了输入缓冲区)消息后读取串口、数据传输错误处理、字符串处理如回车符、空格并相应转化成数据,如果模拟量还要进行数据检验等功能。写串行端口信息:将要发送的信息写入串口,相应进行错误处理。断开串行端口连接:关闭事件,清除通信事件,丢弃通信资源并关闭。3.2系统分析 (1)编程思想:因为串口通信部分代码我可能用在以后的单片机上位机上,因此考虑单独形成cpp和h文件,定义为comm.cpp和comm.h。在comm.cpp中编写串口创建、打开、关闭以及用于自动接收的代码,同时加入进制转换或显示的函数,这些在comm.h文件中申明,在主对话框中包含comm.h即可。 (2)串口编程的基本流程图: 关闭串口 打开串口数据接收发送资源配置参数3.3系统设计1.创建项目 file - new - projects选择mfc appwizard(exe),项目名称commassist 图1 新建工程图2.创建界面 idr_mainframe原为mfc提供的图标,这里我直接改成自己的,生成exe后将会显示这个图标。在打开按钮旁边加入自绘的打开和关闭图标:先加入工具条中的picture,然后选中右键看属性,并如图将image选为默认的idi_icon_close。如下图 图2 创建界面图下面对各个按钮及编辑框id和标题的设置进行描述 : 图2 按钮id及标题设置 图3 按键标题及id设置右键串口对应的combo box,id设置为idc_comlist,type设置为drop list右键波特率对应的combo box,id设置为idc_baud右键数据位对应的combo box,id设置为idc_bdata右键停止位对应的combo box,id设置为idc_bstop右键校验位对应的combo box,id设置为idc_cal,type及sort同上。 接收edit框id设置为idc_edit_rx。 发送edit框id设置为idc_edit_tx。 自动发送时间间隔的edit框id设置为idc_edit_timer。 选择文件后面的edit框id设置为idc_edit_filepath。 接收区的十六进制显示的check box复选框id设置为idc_check_hexrx。 发送区的十六进制发送的check box复选框id设置为idc_check_hextx。按钮“打开串口”id设置为idc_comcontrol。按钮“清空显示区”id设置为idc_btn_clrrx。按钮“手动发送”id设置为idc_btn_handsend。按钮“清空发送区”id设置为idc_btn_clrtx。按钮“自动发送”id设置为idc_btn_autosend。按钮“选择文件”id设置为idc_btn_selctfile。按钮“发送文件”id设置为idc_btn_sendfile。3.程序编写 1.打开串口 在对串行口进行所有的操作之前,首先要将其打开。串行口的打开可以使用createfile函数,createfile函数将返回一个句柄,在随后与该串行口相关的各种操作中使用。与文件操作相同,在利用createfile打开串行口时,也可以将串行口指定为“读访问权限”、“写访问权限”或“读写访问权限”。双击“打开串口”按钮编辑代码如下: 图4 打开串口程序编写(2)串口的状态读取和属性设置 对串口进行设置:windows系统利用setcommstate函数修改串行口的当前参数配置。 getcommstate函数的第一个参数hfile是由createfile函数返回指向已打开串行口的句柄。第二个参数指向设备控制块dcb。如果函数调用成功,则返回值为非0;若函数调用失败,则返回值为0。当应用程序仅仅需要修改一部分串行口的配置值时,可以通过getcommstate函数获得当前的dcb结构,然后更改参数,再调用setcommstate函数设置修改过的dcb来配置串行口。清空接收和发送缓冲区:在进行串口所有的发送和接收数据操作之前,最好使用purgecomm函数将串行口发送缓冲区和接收缓冲区中的数据清楚干净。“清空显示区”和“清空发送区”的编码: 图5“清空显示区”和“清空发送区”的编码图3.行数据的发送和接收与普通的文件操作相同,在对串行口进行操作时,通常利用readfile函数读取串行口收到的数据,利用writefile将需要发送的数据写如串行口。 串行数据的发送利用writefile函数可以向串行口写入数据。writefile函数原型如下:bool writefile(handle hfilelpviod lpbufferdword nnumberofbytestowritelpdword lpnumberofbyteswrittenlpoverlapped lpoverlapped); 其中参数hfile指向已经打开的串行口句柄;lpbuffer指向一个发送数据缓冲区;nnumberofbytestoread指定要从串行设备中发送的字节数;lpnumberofbytesread指明实际从串行口中发送的字节数;lpoverlapped指向一个overlapped结构变量,该结构变量中包含一个同步事件。 串行数据的接收利用readfile函数可以读取将串行口接收到的数据。readfile函数原型如下:bool readfile(handle hfilelpviod lpbufferdword nnumberofbytestoreadlpdword lpnumberofbytesreadlpoverlapped lpoverlapped);其中参数hfile指向已经打开的串行口句柄;lpbuffer指向一个读取数据缓冲区;nnumberofbytestoread指定要从串行设备中读取的字节数;lpnumberofbytesread指明实际从串行口中读出的字节数;lpoverlapped指向一个overlapped结构变量,该结构变量中包含一个同步事件。 通常如果调用成功,readfile返回非0值;否则返回值为0。但是对于接收操作在后台进行的串口来说,返回值为0不一定说明函数调用失败。此时可以调用getlasterror函数获取进一步的信息。如果getlasterror返回值为error_io_pending,则说明该读取串口的操作仍然处于后台等待状态,而非一个真正意义上的错误。4.关闭串行口 在用完串行口后通常要将其关闭。如果忘记关闭,该串口会始终处于打开状态,其它的应用程序就不能打开或使用它。首先要添加onclose函数:在onclose函数里编写代码: 图6 添加close函数编辑close函数代码: 图7关闭串口函数 总结通过本次课设,在老师的耐心指导和同学的相互探讨下,我了解到了很多有意义的东西,一方面,不但对vc6.0系统的开发过程有了自己的操作体会,而且对vc6.0编程有了更深入的理解与练习;更重要的是,通过自己动手完成了开发操作的过程,对自己大学所学的c语言和所学的通信串口连接基础知识有了更深刻的理解,并且做到了充分的实践练习,培养了自己对本门课程极大地学习热情和学习兴趣,同时也培养了自己在学习过程中独立思考的习惯。另一方面,我通过阅读文献和所学的书籍,对基于windowsapi异步串行通信等各种过程有了一定的了解,通过对串口连接仿真模型的设计,我不仅对同步,异步传输有了更多的熟悉和了解,还知道了如何用软件编程来实现串口的连接。 在这长达三周的课设时间里,我深刻体会到,学习不仅仅是要记住老师要求的知识点,还应该不断地扩展自己的知识面,更重要的是,要理解知识点所包含的含义,这样才能更好的应运与实践中。同时,在老师的身上我学得到很多实用的知识,在此表示感谢! 参考文献 1 李鹏.计算机通信技术及其程序设计.西安: 西安电子科技大学出版社,1999.6 2(美)史蒂芬(stevens,a.), 林丽闽译.标准c+宝典m.北京:电子工业出版社,2001 3 杨永田.计算机通信. 哈尔滨:哈尔滨工程大学出版社,20024 韩毅刚.计算机通信技术. 北京市:北京航空航天大学出版社,20075 王莉,阳春华.基于vc+的串口通信设计及其应用j.控制工程,2004 6 龚建伟,熊光明.visual c+/turbo c串口通信编程实践m.电子工业出版社.2004 7 潘新民.计算机通信技术(第2版)m. 北京市;电子工业出版社,2006.8 8(美)jan axelson.串行端口大全m.北京市;中国电力出版社,2001附录: comm.h编写如下: #ifndef comm_h #define comm_h #define wm_foundcomm wm_user + 1 /自定义消息wm_foundcomm,收到该消息表示串口已经找到 #define wm_readcomm wm_user + 2 /自定义消息wm_readcomm,收到该消息缓冲区有数据,可以读取 extern void findcomm(); /申明为外部函数 extern void opencomm(int nbaud, int ndata, int nstop, int ncal); extern void closecomm(); extern uint threadfunc(lpvoid pparam); /申明全局线程处理函数 extern cstring displaycstring2hex(cstring data, bool blank_allow); extern cstring displayhex2cstring(cstring data); extern int converthexc2string(cstring str, cbytearray &senddata); extern bool comisok; /申明为外部变量 extern handle hcom; extern cstring strcomname; #endif cwinthread* preceivethread; void showstatus(); int m_inttxcnt; int m_intrxcnt; bool m_bautosend; dword readcomm();在commassistdlg.cpp中 加入头文件comm.h #include comm.h cstring strin; cstring strout; cstring m_strfile; 变量初始化如 / ccommassistdlg dialog ccommassistdlg:ccommassistdlg(cwnd* pparent /*=null*/) : cdialog(ccommassistdlg:idd, pparent) afx_data_init(ccommassistdlg) m_strtimer = _t(); m_strfilepath = _t(); m_strout = _t(); m_strstatus = _t(); m_check_hexrx = false; m_check_hextx = false; /afx_data_init / note that loadicon does not require a subsequent destroyicon in win32 m_hicon = afxgetapp()-loadicon(idr_mainframe); /下面就是自己添加的变量初始化 m_strtimer = 1000; m_strfilepath = 请选择要发送的文件; m_inttxcnt = 0; m_intrxcnt = 0; m_bautosend = 0; strin = ; strout = ; 在oninitdialog函数中添加代码如下 / todo: add extra initialization here m_comcontrol.setforecolor(rgb(255,0,0); findcomm(); /调用自动找串口函数 m_comlist.setcursel(0); /设置串口号下拉框默认值为第一个 m_baud.setcursel(6); /设置波特率下拉框默认值为9600 m_bdata.setcursel(3); /设置数据位下拉框默认值为8位 m_bstop.setcursel(0); /设置停止位下拉框默认值为1 m_cal.setcursel(0); /设置校验位下拉框默认值为none无 getdlgitem(idc_btn_handsend)-enablewindow(false); /设置手动发送按钮不可用 getdlgitem(idc_btn_autosend)-enablewindow(false); /设置自动发送按钮不可用 getdlgitem(idc_edit_timer)-enablewindow(false); /设置发送间隔按钮不可用 getdlgitem(idc_btn_selctfile)-enablewindow(false); /设置选择文件按钮不可用 getdlgitem(idc_btn_sendfile)-enablewindow(false); /设置发送文件按钮不可用 showstatus(); /下面语句用于解决程序运行后初始化edit框内容被默认自动选中状态 /返回值需更改为false getfocus(); /获取焦点 setfocus(); /设置焦点 m_ceditstatus.setsel(-1,-1,false); /设置 / postmessage(em_setsel,-1,0); return false; / return true unless you set the focus to a control 用classwizard添加windowproc函数来处理自定义消息 /功能:处理自定义消息= lresult ccommassistdlg:windowproc(uint message, wparam wparam, lparam lparam) / todo: add your specialized code here and/or call the base class switch(message) case wm_foundcomm : /已找到串口,串口号以字符串形式由wparam传递 m_comlist.addstring(lpctstr)wparam); /用addstring添加一个字符串即com号到m_comlist列表框中 break; case wm_readcomm : /读串口消息 readcomm(); break; return cdialog:windowproc(message, wparam, lparam); 双击“打开串口”按钮编辑代码如下: void ccommassistdlg:oncomcontrol() / todo: add your control notification handler code here int nbaud,ndata,nstop,ncal,ntemp; cstring stemp,sitemp; /波特率下拉框设置= ntemp=m_baud.getcursel(); switch(ntemp) case 6: nbaud = cbr_9600; break; /数据位下拉框设置= ntemp=m_bdata.getcursel();switch(ntemp) case 0:ndata = 5; break; case 1:ndata = 6; break;case 2:ndata = 7; break; case 3:ndata = 8; break;/停止位下拉框设置= ntemp=m_bstop.getcursel(); switch(ntemp) case 0: nstop = onestopbit; break; case 1:nstop = one5stopbits; break;case 2: nstop = twostopbits; break;/校验位下拉框设置= ntemp=m_cal.getcursel(); switch(ntemp) case 0: ncal = noparity; break; case 1: ncal = oddparity; break; case 2: ncal = evenparity; break; case 3: ncal = markparity; break; case 4: ncal = spaceparity; break; int commnum_buf; commnum_buf = m_comlist.getcursel(); if(commnum_buf m_hinstance, makeintresource(idi_icon_open), image_icon, getsystemmetrics(sm_cxicon), getsystemmetrics(sm_cxicon),0);/显示打开icon m_comlist.enablewindow(false); /设置串口号下拉框不可用 m_baud.enablewindow(false); /设置波特率下拉框不可用 m_bdata.enablewindow(false); /设置数据位下拉框不可用 m_bstop.enablewindow(false); /设置停止位下拉框不可用m_cal.enablewindow(false); /设置校验位下拉框不可用 getdlgitem(idc_btn_handsend)- enablewindow(true); /设置手动发送按钮不可用 getdlgitem(idc_btn_autosend)- enablewindow(true); /设置自动发送按钮可用 getdlgitem(idc_edit_timer) - enablewindow(true); /设置发送间隔按钮可用 getdlgitem(idc_btn_selctfile)-enablewindow(true); /设置选择文件按钮可用 getdlgitem(idc_btn_sendfile)- enablewindow(true); /设置发送文件按钮可用 return; else closecomm(); /调用关闭串口函数closecomm() / terminatethread(preceivethread,0); showstatus(); m_comcontrol.settext(打开串口); m_comcontrol.setforecolor(rgb(255,0,0); m_ctrlicon.seticon(hicon)loadimage(afxgetapp()-m_hinstance, makeintresource(idi_icon_close), image_icon, getsystemmetrics(sm_cxicon), getsystemmetrics(sm_cxicon), 0); /显示关闭icon m_comlist.enablewindow(true); /设置串口号下拉框可用 m_baud.enablewindow(true);/设置波特率下拉框可用 m_bdata.enablewindow(true); /设置数据位下拉框可用m_bstop.enablewindow(true); /设置停止位下拉框可用 m_cal.enablewindow(true); /设置校验位下拉框可用 getdlgitem(idc_btn_handsend)- enablewindow(false); /设置手动发送按钮不可用 getdlgitem(idc_btn_autosend)- enablewindow(false); /设置自动发送按钮不可用 getdlgitem(idc_edit_timer) - enablewindow(false); /设置发送间隔按钮不可用 getdlgitem(idc_btn_selctfile)-enablewindow(false); /设置选择文件按钮不可用 getdlgitem(idc_btn_sendfile)- enablewindow(false); /设置发送文件按钮不可用 return; 添加读串口函数,代码如下: dword ccommassistdlg:readcomm() cstring strtemp; overlapped m_osread; memset(&m_osread,0,sizeof(overlapped); m_osread.hevent=createevent(null,true,false,null); char lpinbuffer1024; dword dwbytesread=1024; boolbreadstatus; breadstatus=readfile(hcom,lpinbuffer,dwbytesread,&dwbytesread,&m_osread); if(!breadstatus) /如果readfile函数返回false if(getlasterror()=error_io_pending) /getlasterror()函数返回error_io_pending,表明串口正在进行读操作 waitforsingleobject(m_osread.hevent,2000);/使用waitforsingleobject函数等待,直到读操作完成或延时已达到2000ms /当串口读操作进行完毕后,m_osread的hevent事件会变为有信号 purgecomm(hcom, purge_txabort|purge_rxabort|purge_txclear|purge_rxclear); return dwbytesread; return 0; lpinbufferdwbytesread = null; strtemp = lpinbuffer; m_intrxcnt += strtemp.getlength(); /接收到字节数统计 / getdlgitemtext(idc_edit_rx,strin); strin += strtemp; oncheckhexrx(); showstatus(); return 1; 添加onclose函数 void ccommassistdlg:onclose() / todo: add your message handler code here and/or call default terminatethread(preceivethread,0);/程序退出时,关闭串口监听线程 waitforsingleobject(preceivethread,infinite); cdialog:onclose(); 双击“手动发送”按钮,编辑代码如下: uint ccommassistdlg:onbtnhandsend() / todo: add your control notification handler code here if(comisok = false) messagebox(请先打开串口,提示,mb_iconinformation); return 0; bool bwritestat; updatedata(true); cstring str,stemp; dword dwbyteswritten=1024; overlapped m_oswrite; memset(&m_oswrite,0,sizeof(overlapped); m_oswrite.hevent=createevent(null,true,false,null);comstat comstat; dword dwerrorflags; /dwbyteswritten=oncheckhextx(); getdlgitem(idc_edit_tx)- getwindowtext(strout); if(m_check_hextx) int i,n; cstring strtemp; cbytearray hexdata; /getdlgitem(idc_edit_tx)-getwindowtext(strout);dwbyteswritten= converthexc2string(strout,hexdata);n=hexdata.getsize();for(i=0;i getwindowtext(str); setdlgitemtext(idc_edit_tx,); stemp = displayhex2cstring(str); dwbyteswritten = str.getlength(); setdlgitemtext(idc_edit_tx,strout); updatedata(); if(dwbyteswritten=0) messagebox(请在发送区内输入要发送的内容,提示,mb_iconinformation); return 0; m_inttxcnt+=dwbyt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人才日活动策划方案模板
- 东莞入企咨询方案
- 传媒艺考活动策划方案
- 水产养殖行业技术规范总结
- 软件著作权转让协议
- 2025结构工程师检测卷(历年真题)附答案详解
- 2025国家统一法律职业资格考试考试真题及答案
- 中考语文小说阅读赏练-梁晓声小说(含解析)
- 诚信与谎言话题作文(13篇)
- 2025计算机一级考前冲刺练习试题及完整答案详解(夺冠系列)
- 2025-2026学年地质版(2024)小学体育与健康二年级(全一册)教学设计(附目录P173)
- 茶百道培训课件
- 2025至2030年中国制药装备行业市场全景分析及投资前景展望报告
- 2025北京京剧院招聘工作人员10人考试备考题库及答案解析
- 检修现场管理培训课件
- 2025年食品安全人员在线考试试题及答案
- 多重耐药菌感染患者的护理LP
- 信息网络安全考题「附答案」
- 2025年度国务院国资委干部教育培训中心招聘(2人)笔试备考试题及答案详解(历年真题)
- 2025司法协理员考试模拟题及答案
- 消防设备设施操作讲解培训课件P
评论
0/150
提交评论