Win32串口编程入门经典

所需积分/C币:9 2012-09-25 11:24:09 401KB PDF
2
收藏 收藏
举报

Win32串口编程经典文档,让你一天学会Windows系列串口编程
互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 第10章串口编程 在此需要说明的是,在 CreateFile函数的参数中,共享参数必须设置为0,表示独占方式; 安全参数必须设置为NULL值;模板文件参数也必须被设置成NULL 由于在 Windows Ce中,不支持重叠IO模式,因此不能在参数 dw Flags AndAttributes中 传递 FILE FLAG OVERLAPPED 如果打开串口成功,将返回打开串口的句柄,否则将返同 INVALID HANDLE VALUE。 打开串∏之后,串∏就已经被独占了,因此当不再使用已打开的串冂时,应及时关闭串 口,此时可以使用 Close handle函数关闭串口。例如可以使用以下代码来关闭上面打开的串口: Boo- rEsult CloseHandle(comm): 2.配置串口 在使用串口和另外一个设备进行通讯时,一定要先设置串口的参数(波特率、奇偶校验、 数据位等),这些参数设置正桷与否将直接影响是否能够和串口设备进行通讯。串冂参数信息 般由串口设备厂家提供。 Windows ce中提供了 GetComm State和 Setcomm State函数,分别 用于获取串口的当前参数和设置串口的参数,它们的定义如下 Bo二 Getcommstate( handle hE LPDCB IpD SetCommstate HANDLE hIler LPDCB IpDCB) 这两个函数都包含了相同的参数,其中参数 h filc是输入参数,指向已打开的串口句柄; 参数 lpDCB指向DCB结构的指针,在 Getcormm state函数中,它属」输出参数,在 Setcommstate 函数中,它属于输入参数。DCB结构完全描述了串口的使用参数,它的定义如下: typedef struct DCB i DWORD DCBlengt;//DCB结构大小 DWORD3 audRate;//波特率 DWORD fBinary:1;//二进制模式 DWORD f=arity:1;//进行奇偶校验 DWORD fOutxctsF1ow:1;//使Ts信号进行输出流量控制 DWoRD fCutxDsrElow:1;//使ˉsR信号进行输岀流量控制 dWord EDtrContro1:2;//DTR流量搾制 dWoRD fDsrsensi- ivity:1;//DsR敏感度 dWoRD ETXContinueonXoff:1;//XOF后是否继续发送 dWorD foutx:1;/使得输出CN/XOEE有效 dWoRD fInⅩ:1;//使得输入XON/XOFF有效 DW○ RD fErrorchar:1 /允许奇偶错误替换 DWORD ENull: 1 //允许删除NULL dWORD fRtscontro1:2;//RTS流量控制 dWoRD FAborton三rror:1;//出错时是否终止读写操作 DWORD fDummy2: 17 //保留 WORD REserved;//当前未用,必须置为0 WORD XOILLI;//XN阈值 Word olim;//X○EF阈值 互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 BY些EBy-cs-zc //字符位数,4~8 BYTE Parity /奇偶校验位,0-4分别为rC、cdd、even、mark、 sPace BY"上 stopBits; //停止位,0、1、2分别为 char XonChar //xoN字符 char Xoffchari //XOFE字符 //奇偶错误替换字符 char eofchar //结束字符 char eschar //事件字符 WORD w3cscrvcdl; //保留,未用 1 DCB 成员 DCBlength指定了DCB结构大小 成员 BaudRate指定了串口设备的传输速率。波特率的范围一般是从每秒110位到每 秒256000位 成员「 Binary必须被设置TRUE,因为在CE中不支持非二进制的串行传输模式 成员們 arity表示启用奇偶校验,该值一般被设置TRUE,以便启用奇偶校验。 ●成员 foutx cts flow用于指定CIS( Clear-Io-Send)信号是否被监视并作为输出流 量控制信号。如果此成员被设置为TRUE并且CTS信号被关闭,则输岀被挂起,直 到CTS信号重新发出。 成员 Outx DsrFlow用」指定DSR(Dala-set- Ready)信号是否监视并作为输出流 量控制信号。若此成员被设冒TRUE,并且DSR信号被关闭,则输出被挂起,直到 DSR信号重新发出。 ●成员 fDtrControl指定DTR(Data- Terminal- Ready)信号作为流量控制,此成员可以 是表10-3中列出的值 表10-3 fDtr Contro成员取值表 值 描述 DTR CONTROL DISABLE 当串口设备打开时,DTR信号线始终设为禁止 DTR CONTROL ENABLE 当串口打川时,DTR信号线设为使能并始终打川 使DTR支持握手,此时可调用 Escape CommFunction函 DTR CONTROL HANDSHAKE 数来释放DIR线上的错误 成员 fDsr Sensitivity指定申口通讯设备对DSR信号状态是否敏感。若此成员被设置 TRUE,除非DSR信号线上的电平为高,否则接收到的字节将破忽略 成员红 XContinueonXof'指定当输入缓冲区满目收到 Xoffchar字符时,传输是否终 止。若此成员被设置为TRU,那么输入缓冲区的字节数小于 Xoftlin定义的字节数 时传输将继续,发送完ⅹof℃har字节后将停止接收字节。如果此成员被设为 FALSE, 那么只有到输入缓冲区的字节数在 Xinlin定义的字节数内,且驱动程序发送过 Ⅹ on Char字符以恢复接收过程时,传输才会继续。 成员fOuX指定在发送期间是否使用ⅹ ONXOFF流量控制。若此成员被设置TRUE, 则当接收到Ⅹ oftchar字符时将停止发送,直到收到 Xon cha字符时开发发送。 成员finⅹ指定接收期间是否使用ⅹON/XOFF流量控制。若此成员设为TRUE,则 互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 第10章串口编程 输入缓冲区中存有数据的空间达到 Xoftli定义的字节数时,Xof℃har将被发送; 当输入缓冲区中可用的空间达到 Xinlin定义的字节数时, Xon char被发送 成员 fErrorChar指定当收到的字符发生奇偶校验错误时,是否使用 ErrorChar成员定 义的字符代替。若此成员设为TRUE且ariv成员为TRUE,将会发生替换 成员fNul指定null是否被丢弃。若此成员设为TRU,则接收到的NULL字符被放弃。 成员 fRts control指定RTS( request-to-send)沇量控制。若此值为0,则缺省值为 RTS CONTROL HANDSHAKE。表10-4列出了该成员的可用值。 表10-4 fRts Contro成员的可用值表 值 描述 RTS CONTROL DISABLE 当串口设备打开时,RTS线始终为禁止 RTS CONTROL ENABLE当设备打开时,RIS线始终设为使能并始终打开 启用RTS握于功能。当输入缓冲区字符小于缓冲区总数的12时, RTS CONTROL HANDSHAKE动程序使RT信号为高,超过3/4时,使RTS信号为低,若RS握手 功能可用,可调用 Escape CofuNction函数释放DTR线上的错误 指定当发送数据时,RTS信号线为高,缓冲区数据发送完,RTS信号 RTS CONTROL TOGGLE 线为低 ●成员 faborton error指定当错误发生时,读写操作是否终止。若此成员设置为TRUE, 则当错误发生时,所有的读写操作将终止,直到应用程序识别错误并调用 ClearComm Error凶数后,驱动程序才进行更深层次的通讯。 成员 dUmmy2保留,未用 成员 rEserved未用,必须置为0。 成员 Xonlim指定发送XON字符前输入缓冲区允许的最小字节数 ●成员 Xofflim指定发送XOFF字符前输入缓冲区允许的最大字节数。最大允许接收 宇符数可以用定义的全部输入缓冲区字节数减去此值得到 成员 ByteSize指定每字节发送接收的位数 成员 Parity指定奇偶校验方法。表10-5列出了该成员的可用值。 表10-5Part成员的可用值表 值 描述 EVENPARITY 偶校骏 MARKPARITY 标记校驷 NOPARITY 无校验 ODDPARITY 奇校验 SPACEPARITY Space 成员 StopBits用于指定停止位的位数。该成员的可用值如表106所示。 ●成员ⅹ on char指定发送接收的XON字符 成员 Xoffchar指定发送接收的XOFF字符。 ●成员 Error char指定当接收的奇偶校验错误时被代替的接收字符。 互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 表10-6 StopBits成员可用值表 值 描述 ONESTOPBIT 1位停十位 ONESSTOPBITS 1.5位停止位 TWOSTOPBITS 2位停止位 成员 Eofchar指定某字符作为数据结束标记。 成员 Evtchar指定某字符作为事件标记。 成员 rEserved被保留,未用 在设置串口参数时,最好先用 GctComm Statc函数得到串口的当前参数,然后再修改需要 设置的成员。 读、写串 正如使用 Createfile函数打开串凵一样,开发人员同样可以使用 ReadFile和 Writefile函 数读取串口数据和向串口中写入数据。关」 ReadFile和 Write file函数的介绍,请参考第6章 文件编程中的介绍 这里需要注意的是,由于从串∏中读写数据的速度比较慢,因此不要试图在主线程中读 写大量数据,这样会阻塞主线程中处理主窗体的消息队列,最好的方法就是用单独的线程来读 写数据。在下面的串口综合使用示例中将会介绍 Readfile和 Write file函数的具体用法 4.异步串口IO 虽然 Windows ce中不支持重叠IO操作,但还是可以分别用单独的线稈去读写串口,通 过多线程来模拟重叠操作。同时 Windows ce还提供了 WaitCommEvent函数,该函数将阻塞 线程,直到预先设冒的串口事件中的某一事件发生。在后面的串口综合使用示例中将会介绍 WaitcommEvent函数的使用。 在使用串冂事件前,还需要了解如下三个函数: BOO- GetCommMas k(HANDle hFile, LPDWoRd lpEvtMas k) BOo- SctcommMas k(handle hfilc, dword dwEvtMask) BOO-WaitConmmEvent(HANDLE hFile, L= DWORD IpEvtMask, LPOVERLAPPED lpOverlapped)i GetcommMask函数用于得到串∏已经设置了的串∏事件,参数 hFile指定已打开的 串口句柄,参数 IpEvtMask用于存取得到串口事件集。 SetCommMask函数的功能与 GetCommMask函数相反,用于设置串口事件集。 WailComm Event函数用」等待预先设置的串口事件中的某一事件发生。参数 EvtMask用于存储已经的发事件;参数 ovErlapped必须被设置NULL,因为在 Windows ce中不支持重叠结构。 上面三个函数中的第2个参数,即串口事件集,它可以是表10-7中的某个值或其中组合。 表10-7串口事件表 值 描述 EV BREAK 检测到中断发生 EV CTS CTS改变了状态 EV DSR DSR信号改变了状态 互动出版网 China-pub.com 专业图书网上第一专营店 www.china-pub.com 独家提供样章 第10章串口编程 续表 值 描述 EV ERR 串凵驱动程序检测到了错误 EV RING 检测到振铃 EV RLSD RLSD行改变了状态 EV RXCHAR 接收到了一个字符 EV RXFLAG 接收到了一个事件字符 EV TXEMPTY 在输出缓冲区中的最后一个字符被发生 设置端口读写超时 在调用 ReadFile和 Writefile函数从串口读取数据和写入数据时, Windows ce提供了超时 机制,也即是设置了等待它们返回的时间长度。设置串口超时函数 SetcommTimeouts的定义 如下所示 BOo- Sctcomm'Timcouts( HANDLE hFile LPCCMMTIMEOUTS lpCommTimccuts) ●参数 hfile指向已经打开的串口句柄。 参数 lpCommTimeouts指向 COMMTIMEOUTS结构,设置新的超时值 COMMTIMEOUTS结构定义如下: typedef struct COMMTIMEOUTS t DWORD ReadIntervalTimecut: DWORD ReadTotalTimeoutMultiplier dWoRD eadtotaltimeoutConstant DWORD WriteTotalTimeoutMultiplier DWORD Writefotaltimeo cOnstant 1 CCMMTIMEOUTS, *LPCOMMTIMECUTS 读超时的计算方法有两种,一种超时是 ReadInlervaltimeout指定了在接收字符间的最大 时间间隔,如果超过了这个时间, Readfile函数立刻返回:另一种超时是基于要接收的字符数 量, Read Total TimeoutMultiplier表示平均读一字节的时间上限, Read Totallimeoutconstant表 小读数据总超时常量 第二种读数据超时可用如下等式表示 读数据总超时- ReadTotalTimeoutconstant+( Read TotalTimeoutmultiplier*要读的字节数) 写超时计算方法与读超时的第2种计算方法相似, Write TotalTimeoutMultiplier表示平均写 字节的时间上限, WriteTotallimeoutconstant表示写数据总超时常量,总超时计算方法如下: 写数据总超时= Write totaltimeoutconstant-( Write TotalTimeoutMultiplier*要写的字节数) 对于读数据超时,第一和超时(间隔超时)和第二种超时(总超时)同时有效,当出现 任何·种超忖时,都将返回。下面是详细的超时值设置: 有读间隔超时、读总超时和写总超时:将 COMMTIMEOUTS结构中的五个成员设置 为相应值 ●有读总超时和写总超时,但没有读间隔超时:将 Readlntervaltimeoul设置为O,将其 互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 他字段设置为相应值。 不管是否有数据要读取, Readfile立刻返回:将 ReadIntervaITimeout设置成 MAX DWORD,将 ReadTotalTimeoutMultiplier和 ReadTotalTimeout Constant都设置 成 Readfile没有超时设置,直到有适当的字符数返冋或错误发生,该函数才返回:将 ReadIntervalTimeout、 ReadTotalTimeoutMultiplier和 ReadTotalTimeoutconstant值都设 胃为0。 WriteFile没有超时设置:将 Write TotaITimeoutMultiplier和 Write Total Timeout-Constant 都设置成0。 对于串口读写,以上所介绍到的超时操作是至关重要的。读者可以根据实际情况考虑采 用何种超吋操作。如果从串∏读取数据和写入数据都采用超吋,最好采用单独的线程负责读取 和写入,以使不会阻寒主线程 Windows ce还提供了 Setup Comm函数来设置接收和发送数据的缓汁区的大小。它的定 义如下: BOO二 Seturcomm( HANDLE hEller DWORD dwInQueue dWORD dvOutcueue)i 参数 hFile指定已经打开的串口句板 参数 dwlnQueue和 dwOutQueue指定接收和发送缓冲区的大小。 Setup Comm并不推荐使用,因为系统会推荐一个适合的默认值。 6.控制串口 Windows ce提供了 SelComm break跞数,用」停止传输宇符并将串∏置」中断状态,还 提供了 ClearComm Break用于重新传输字符。 SetcommBreak和 Clear CommBreak函数的定义 如下 B0o二 Setcommbreak( HANDLE hFile) BOO- ClearComnBreak( IIANDLE hFile) 以上两个函数都只有唯一的入口参数hF,表示已打开的串口句柄。 7.清空串口缓冲区 Windows ce提供了 Purge Comm函数用于清空串口的发送缓冲区和接收缓冲区, Purge Comm函数的定义如下 BoO- Purge Comm hANdle hFile dWORd flAgs)i 参数hFe表示打开的串口句柄。 参数 dw Flags表示操作类型,在 Windows ce下该参数有如下两种取值。 PURGE TXCLEAR:清空发送缓冲区 PURGE RXCLEAR:清空接收缓冲区 互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 第10章串口编程 这两个值可以组合使用,表示同吋执行清空发送缓冲区和接收缓冲区的功能。 8.清除错误并查询状态 Windows ce还提供了一个非常有用的函数 ClearComm Error,用于清除驱动程序产生的任 何错误状态并返回当前窗口状态,该函数定义如卜 BOO- ClearCommError( LPDWORD ERRors, LPCCMSTAT⊥ pstat) 参数 hFile指向已绎打开的串口句柄。 参数 ErRors表示发生的错误码,它的值将是表10-8中的任意一个值或组合 表10-8 IpErrors参数取值表 错误码 描述 CE BREAK 硬件检测到了一个中断条件 CE FRAME 硬件检测到一个帧错误 CE IOE 硬件通认时发生一个IO错误 CE MODE 请求樸式未被支持,或者 hFile参数无效。如果这个值被指定,它 就是仪有的合法错误 CE OVERRUN 一个字符缓冲区侵占发生,下一个字符被丢失 CE RXOVER 输入缓冲区溢出发生,或者输入缓冲区尢空间,或者在收到End- Of-File(EOF)字符之后又收到字符 CE RXPARITY 使件检測到奇偶校验错误 CE TXFULL 应用稈序试图发送一个字符,但是输出缓冲区已满 参数 lpStat指向 COMSTAT结构,用于存储当前窗口的状态。 COMSTAT结构的定义 如卜所示 typedef struct COMSTAT I DWORD fCtsHold 1 DW○ RD EDSrho1d:1 DWORD fRlsdHold 1 DWoRD fⅩcfHo1d:1 DWoRD fcf=scnt dword eCf: 1 DWORD f里xim:1 DWoRD fR∈ served:25; DWORD CoInQuei DWORD coOut quei }COⅣSTAT,* LPCOMSTAT 前5个字段表示串口传输是否因为它的原因而等待 字段 fCtshold表示是否等待CTIS信号。 宇段 IDsrHold表示是否等待DSR信号 字段 frlsdhold表示是否等待“接收线路信号检测,也叫载波检测”。 互动出版网 www.china-pub.com China-pub.com 专业图书网上第一专营店 独家提供样章 字段 fXofthold衣示是否等待XOFF字符。 字段foen表示是否因为驱动程序发送XOFF字符而等待。 字段of表示是否收到串口尾部字符。 宇段mxim如果是1,表示队列中的字符是由 TransmilComm char函数写入的而不是 Writefile函数 字段 ciNqUe表示接收缓冲区存储的待读取的字行数 字段 cbOutQue表示发送缓冲区中存储的待发送的字符数。 在下面的串口综合示例中,将利用 ClearComm Error函数来得到串口接收缓冲区待读取的 字符数。 103CE串口综合示例 前一节中介绍了串口编程的基本知识,本节将封装一个 Windows ce串口使用类 CCESeries基」此类,可以方使地廾发基」串口方面的通讯应用。卜面就逐步介绍 Windows ce 串口综合示例的创建过程。 (1)建立新项目 使用ⅤS2005VC++智能设备MFC智能设备应用程序向导创建一个基于对话框的应用程 序 ScriaISamplc,编译环境设置为 Windows mobilc6 Professional sdk(ARMV4I,设备选择CHS Windows mobile6 Classic emulator,把窗∏字体改成宋体小五号。 (2)新建 CCESeries类,用于封装串口通讯。 CCESeries类是一个通用C++类,无基类。其类图如图10-1所示。 CCEScrics m-OnseriesRead ONSERIESREAD +OpenPore +CloscPorto + WriteSyncPortO +SctscricsTimcoutso 图10-1串口类类图 CCESeries类将提供4个公有方法和个回调函数接∏这4个公有方法分别为 OpenPort Closeport、 Write SyncPort和 SetSeriesTime Outs。其中 OpenPort方法用于根据其指定的参数打 开串口,并创建读线程来异步接收数据; Closeport方法与 Penpont与法相对应,用于关闭串 口释放相关资源,同时乜将关闭读线程; Set series timeouts方法用于设置串口读写超时; WritcSyncPort方法用于向串口写入数据;至于回调函数 m on Scricsrcad,是当读线程检测到 串∏有可读数据时,通过它来通知用户读取数据。 CCESeries类的使用流程如图10-2所示。 下面就来介绍 ESERies类的具体实现过程。 1)为 CCESeries类添力如下私有变量,用于 CCESeries类内部使用,代码如程序清单10-1 所示

...展开详情
试读 48P Win32串口编程入门经典
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚钱or赚积分
最新推荐
Win32串口编程入门经典 9积分/C币 立即下载
1/48
Win32串口编程入门经典第1页
Win32串口编程入门经典第2页
Win32串口编程入门经典第3页
Win32串口编程入门经典第4页
Win32串口编程入门经典第5页
Win32串口编程入门经典第6页
Win32串口编程入门经典第7页
Win32串口编程入门经典第8页
Win32串口编程入门经典第9页
Win32串口编程入门经典第10页

试读结束, 可继续读5页

9积分/C币 立即下载