大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 一种调用Win95 API实现串行通信的查询方法

一种调用Win95 API实现串行通信的查询方法

时间: 2021-07-31 作者:daque

     纲要 在win9第5中学,串行通讯的体制对立windows 3.x已作了矫正和规范化。正文贯串一个范例从挪用api接口的观点,简直阐明了一种用大略的串口查问法来实行串行通讯的思绪。 要害词 api、串行通讯、visual basic、多线程、win95 visual basic是一个windows体例下时髦的运用步调开拓平台。其简单的界面安排使步调员能俭朴洪量功夫,并把最大的精神会合在运用步调中心代码的编写上。vb4暂时已变成win95体例下一种最高效精巧的合流开拓东西之一,而挪用api运用步调接口则恰是对vb4功效的强有力夸大,它使得vb4不妨径直遏制和处置pc硬件资源,而不用依附于ms-dos体例效劳。不妨说,恰是借助于api使得vb即能湮没大局部windows编制程序的难点,同声又供给了运用windows情况的精巧性。 所以在串行通讯中运用挪用api接口的本领是实行在vb市直接遏制串行口硬件的简单可行的处置计划。 一、对于win95的多线程及32位api的刻画 微软于95年推出的win95操纵体例是对其旧本子windows本能的一次所有提高。它率先提出并实行了运用步调多线程的编制程序思维,这是win95体例辨别于其余体例最明显和最要害的特性之一。过程是运用步调的实行范例,而线程则是过程里面实行的路途,从基础上说,线程是可由体例安排的一个最大略的代码单位,每个线程有本人的一组cpu存放器和仓库。win95为每个独力的线程安置少许cpu功夫,操纵体例以轮转办法向线程供给功夫片,如许每个线程从表面上看就象都在同声运转一律。一个多线程的运用步调本质上在其里面实行了多工作扩充,为代码付与了并行实行的个性。 多线程运用步调的重要上风即是不妨用尽管少的功夫对用户的诉求作出相应。多线程并不代办代码会运转得更快,精确地说,它只是表示着运用步调不妨更好地运用体例资源(安排体制、外存和物理摆设)。进而能创造一个特殊精巧的运用步调,它能随时接受用户输出,并获得合意的功效。 所以为了在32位的win95体例中创造更赶快、真实和兴盛的代码,多线程本领是必需控制的要害本领之一。 api(即运用编制程序接口)是附带在win95里面的一个极端要害的构成局部。win95的32位api主假如一系列很搀杂的因变量、动静的汇合。它不妨看作是win95体例为在其下运转的百般开拓体例供给的盛开式通用工能巩固接口。它使编制程序职员不妨更简单地用各别典型的谈话体例出运转在win95体例上的运用步调。 与windows 3.x的16位api比拟,附带在win9第5中学的win32 api是api品质最明显的一次提高。它正渐渐变成运用普遍的一种目的平台。win32 api囊括了1000多个api挪用,加上api附带的几百种windows恒量、动静和数据典型构造,运用户具有了一系列用来win95编制程序的搀杂的而又灵验的东西。 api接口是对vb功效的最要害的夸大。简直一切用vb的规范功效不许处置的题目都不妨用挪用api接口因变量的本领来处置。api接口挪用不只给vb供给了洪量可夸大的功效强劲的因变量。更为要害的是,它供给了一种最真实地夸大vb功效的思绪和本领。更加在少许径直和硬件交互的初级操纵中,挪用api接口因变量常常是独一的可行方法。 总之,挪用api接口并贯串多线程的编制程序本领已成了win95情况下最时髦的一种高档本领。大普遍运用步调的代码都不得不波及到这个高档专题。 二、win95串行通讯的处事机理 常用的dos体例主假如处事在相应阻碍办法。pc机串行通讯步调大多运用其bios块的int14h阻碍,以查问串口的办法实行异步串行通讯。 与dos相应阻碍的处事办法各别,windows是一个事变启动的,并与摆设无干的多用户操纵体例。同声windows遏止运用步调径直和硬件交互,步调员只能经过windows供给的各类启动步调来处置硬件。在这种情景下,windows体例充任了运用步调与硬件之间的中介人。 windows体例因变量即包括了通讯扶助阻碍功效。win95体例为每个通讯摆设开拓了用户设置的输出输入缓冲区(即读/写缓冲区),数据出入通讯口均由体例后盾来实行。运用步调只需实行对输出输入缓冲区操纵就不妨了。本质进程是每接受一个字符就爆发一个初级硬件阻碍,win95体例中的串行启动步调就博得了遏制权,并将接受到的字符放入输出数据缓冲区。而后将遏制权返还正在运转的运用步调。即使输出缓冲区数据已满,串行启动步调用暂时设置的流遏制体制报告发送方遏止发送数据。部队中的数据按“进步先出”的步骤处置。 windows 3.x供给了comm.drv启动步调以扶助串行通讯,而win95已对那些串行通讯的规范因变量作了矫正和规范化,并把对串口的扶助与基础输出输入启动步调集变成一体。win95像对文献操纵一律来实行对串口的操纵,两者运用沟通的翻开、封闭及读写因变量。 16位的api只供给了16个与通讯关系的因变量。与那些16位的通讯因变量比拟,win95供给的通讯因变量更为充分,功效更为宏大。 在win95体例中,串行口和串行通讯启动步调是经过一个数据构造举行摆设的,这个数据构造被称为摆设遏制块( device control block ),简称dcb。win95的dcb比windows 3.x的dcb更搀杂,对数据构造的设置更完备。 底下是win9第5中学摆设遏制块数据构造的设置: type dcb ’在win95 api中有精细设置,可从vb4的api text viewer中获得 dcblength as long baudrate as long fbinary as long fparity as long …… evtchar as byte end type win95为获得通信端口的状况供给了要害的getcommstate因变量。因变量把端口的摆设消息装入一个摆设遏制块dcb,进而赢得端口的摆设情景。 另一个要害的comstat构造则常常被用来刻画串口暂时的状况。其设置如次: type comstat ’在win95 api中有精细设置,可从vb4的api text viewer中获得 fctshold as long fdsrhold as long …… cbinque as long cboutque as long end type 常常可按以次四步实行串行通讯: (1) 按和议的树立初始化并翻开串行口,如许做即是报告windows本运用步调须要这个串口, 并封闭其余运用步调使它们不许运用此串口。 (2) 摆设这个串行口。 (3) 在串口上往复地传输数据,并在传输进程中举行校验。 (4) 不须要此串口时,封闭串口。即开释串口以供其它运用步调运用。 在这四个办法中,重要的步调代码会合在第(3)步。 三、vb串口查问法的实行本领 (1)串口查问法的机理 vb的串口查问法是一种重要处事在查问办法下的实行本领。当通讯步调处事在“查问”办法时,不妨不商量win95的过程和线程的题目。仅在串口罕见据时,去读串口缓冲区就不妨了。这种本领下决定串口读取的机会、拉手和议及软硬件纠错的实行是步调员应商量的重要题目。 因为这种本领重要处事在查问办法。步调员必需实行十分一局部通讯状况的检验和测定处事,很多详细(以至囊括通讯进程中的字符属性的变换)也必需经过步调代码实行。所以比拟较通讯控件本领而言,这种查问本领对通讯两边和议的依附性更加大。两边通讯和议的商定对步调实行的难易水平感化很大。 犯得着提防的一点是,此本领下和议的商定必需满意以次前提:即甲方发送时,乙方必需在甲方发送举措之进步入轮回接受状况,直到接受到字符后经过对串口读取因变量readfile归来值的确定跳出轮回状况。 同声,普遍为了不使体例因轮回等候接受而加入“死轮回”状况,不妨报酬树立读取串口的轮回度数,普遍1000~10000次即可。 vb4是一种极为精巧的高档谈话,所以在这种本领下不妨简单地引入汇编谈话的思想,运用其goto转向语句简单地遏制步调的过程。特殊精巧简单。 (2)与通讯线程法的比拟 通讯线程法经过在运用步调的干线程外再创造一个通讯线程来监督通讯摆设,其最大便宜是步调对接受数据具备自决察觉本领。一旦通讯线程查问到数据已发送给串口上,线程自意向运用步调发送一个数据接受到的动静,运用步调可用该动静来读取通讯摆设传来的数据。而且运用通讯线程还不占用cpu功夫。如许体例本质上具备了同声遏制多个通讯摆设(如modem)的本领。 通讯线程法在c++的开拓体例顶用得较多,这与c++的特性和上风出色关系。 因为vb自己的特性,创造通讯线程的本领对vb而言,实行上有十分的难度。并且如许做,也无异于丧失vb的简片面便性而去将就步调的搀杂性,很不财经。串口查问法简单地引入了汇编谈话的少许思想,实行了最精简的步调代码。它不确定是最完备,但对普遍vb步调员来说,这种本领真实到达了简化思绪和贬低难度的手段。所以实行大略。 四、串口查问法的步调范例 现商定甲方是pc机,乙方是单片机体例(如电卡电度表体例的读卡器)。通讯方法树立为2400波特率,8位数据位,1位遏止位,无奇偶校验。 以次是甲方(pc机)的几个子因变量的步调范例。 private function opentheport(cport as string,cbaud as string,cparity as string,cdata as string,tstops as string)as boolean dim lresult as long dim lhandle as long dim dcb_comm as dcb dim cdcbconfig as string lhandle = createfile(cport,generic_read or generic_write,0&,0&,open_existing,0&,0&) if lhandle = -1 then ’翻开串口波折 opentheport = false msgbox “串口大概正被其余运用步调占用!” lresult = closehandle(lhandle) ’先封闭串口后再翻开 if lresult = 0 then opentheport exit function end if end if cdcbconfig.band = 2400 ’树立dcb cdcbconfig.parity = none cdcbconfig.data = 8 cdcbconfig.stop = 1 lresult = buildcommdcb(cdcbconfig,dcb_comm) ’按用户设定摆设一个dcb构造 if lresult = 0 then opentheport = false msgbox “没辙创造dcb摆设遏制块” exit function end if lresult = setcommstate(lhandle,dcb_comm) ’本质树立一个串口的dcb if lresult = 0 then opentheport = false msgbox “没辙创造dcb摆设遏制块” exit function end if opentheport = true end function private sub sendhand ( ) ’发送拉手旗号的子进程 dim nchars as long static readbuff as string * 1 static writebuff as string * 1 dim lpdcb as dcb dim lret as long dim lhandle as long dim lpoverlapped as overlapped dim rnum as integer msgbox “请把电卡读卡器插在串口2上!”,48,“提醒窗口” lhandle = opentheport(comm1,2400,none,8,1) lret = purgecomm( lhandle,1 ) ’清输入缓冲区 lret = purgecomm( lhandle,0 ) ’清输出缓冲区 lret = getcommstate ( lhandle,lpdcb ) ’赢得通信口的状况 shand: writebuff$ = chr$(&h8f) lret = writefile ( lhandle,writebuff$,1,nchars,lpoverlapped ) ’送拉手旗号入串口缓冲区 if lret <= 0 then msgbox “发送操纵堕落,电卡拉手旗号未发送胜利”, 16 goto shand ’不可功则重发 else goto qtest end if goto shand qtest: readbuff$ =“ ” ’废除缓冲区为空 do while lhandle ’轮回查问串口 rnum = 0 ’树立读串口度数的南针为0 readagain: lret = readfile( lhandle,readbuff$,1,nchars,lpoverlapped ) if lret < 0 then msgbox “读取应答旗号时堕落”, 16 end if if lret = 0 then if rnum > 1000 then ’只读1000次串口,免得堕入死轮回 msgbox "电卡没有插接好或电卡没有接在串口上!" goto closep end if rnum = rnum + 1 goto readagain end if if hex$(asc(readbuff)) <> hex$(&hff) then goto shand ’回送码不精确则归来连接发送拉手旗号 else label1.caption = “拉手旗号是:”+hex$(asc(readbuff$)) msgbox “拉手旗号精确,已精确联机” goto closep end if loop closep: lret = closehandle( lhandle ) if lret = 0 then msgbox “串行通信口封闭胜利”,48,“提醒窗口” end if end sub 这边,要提防的是:当pc机与单片机体例通讯时,单片机数据保存区( ram )内的数据是十六进制,在旗号线上传输的是十六进制数的ascii码的二进制情势;而windows体例下运用的是ansi码,ansi码仅在前126个与ascii码沟通。即在win95下接受到的是十六进制数的ascii码的字符串,可先变换为ansi码后再在win95下恢复为十六进制数。 简直如次:code$ = hex$( asc ( readbuff$ ) ) 其余,因为32位api因变量参数的数据典型的变革,一切整形参数都被换为长整型(long)以扶助32位的处置,这一点在树立归来值更加如许。 同声,那些api因变量、典型及恒量在挪用之前,必需先证明再运用。 五、中断语 由上看来,挪用api接口的vb串口查问法具备实行简单、难度低、代码精简的超过便宜。很符合普遍vb步调员在编写通讯步调时运用。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.