




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 串口编程 串口是计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,因此应用非常广泛。例如在工业自动化中,很多智能采集设备都是采用串口方式和PC机进行通讯。在Windows CE嵌入式电脑中,串口依然是和外部设备进行通讯的重要方式,例如GPS设备。目前很多PDA都集成了蓝牙通讯功能,可以通过设置蓝牙通讯方式为串口方式,来和另外一端蓝牙设备进行通讯。作为一名Windows CE程序编写人员,掌握串口编程知识,将会为日后工作提供极大的便利。 本章主要包括如下内容: · 串口概述 · 串口编程APl函数介绍 · 串口综合示例 ·GPS编程示
2、例101 串口概述 “串行通信”是指外设和计算机间使用两根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。这种通信方式使用的数据线较少,在远距离通信中可以节约通信成本,而且其传输速度也不比并行传输的速度慢。相反的,“并行通信”是指一条信息的各位数据被同时传送。并行通讯的特点是:各数据位同时传送、传送速度快、效率高,但由于有多少数据位就需多少根数据线,因此传送成本较高,比较适用于近距离(相距数米)的通讯。 目前较为常用的串口有9针串口(DB9)和25针串口(DB25),当通信距离较近时(<12m),可以使用电缆线直
3、接连接标准RS232端口(RS422和RS485较远),若通信距离较远,则需附加调制解调器(Modem)。 表101将简要说明DB9常用信号脚定义。表101 DB9常用信号脚说明表 9针串口(DB9) 25针串口(DB25) 针号 功能说明 缩写 针号 功能说明 缩写l数据载波检测DCD 8数据载波检测DCD 2接收数据RXD 3接收数据RXD 3发送数据TXD 2发送数据T)(D 4数据终端准备DTR 20数据终端准备DTR 5信号地GND 7信号地GND续表 9针串口(DB9) 25针串口(DB25) 针号 功能说明 缩写 针号 功能说明 缩写 6 数据设备准备好 DSR 6 数据准备好
4、DSR 7 请求发送 RTS 4 请求发送 RTS 8 清除发送 CTS 5 清除发送 CTS 9 振铃指示 DELL 22 振铃指示 DELL 最简单且常用的接线方式是三线制接法,即地、接收数据和发送数据三脚相连,即只要有接收数据针脚和发送针脚就能实现串口数据传输;对于同一个串口,只要接收脚和发送脚直接用线相连,那么在此串口发送什么数据,该串口就可以接收什么数据。对于两个不同串口(不论是同一台计算机的两个串El或分别是不同计算机的串13),均可以采用如表l02所示的接线方式。表102不同串口接线方式表 9针一9针 25针-25针 9针-25针 2 3 3 2 2 2 3 2 2 3 3 3
5、5 5 7 7 5 7 对于口硬件介 1打 在访肛开串口,有函数打开目码中,将赫 HANDL第10章串口编程353 在此需要说明的是,在CreateFile函数的参数中,共享参数必须设置为0,表示独占方式;安全参数必须设置为NULL值;模板文件参数也必须被设置成NULL。 由于在Windows CE中,不支持重叠IO模式,因此不能在参数dwFlagsAndAttributes中传递FILE FLAG OVERLAPPED。 如果打开串口成功,将返回打开串口的句柄,否则将返回INVALID HANDLE VALUE。 打开串口之后,串口就已经被独占了,因此当不再使用已打开的串口时,应及时关闭串口
6、,此时可以使用CloseHandle函数关闭串口。例如可以使用以下代码来关闭上面打开的串口: BOOL bResult=CloseHandle(hComm); 2配置串口 在使用串口和另外一个设备进行通讯时,一定要先设置串口的参数(波特率、奇偶校验、数据位等),这些参数设置正确与否将直接影响是否能够和串口设备进行通讯。串口参数信息一般由串口设备厂家提供。Windows CE中提供了GetCommState和SetCommState函数,分别用于获取串口的当前参数和设置串口的参数,它们的定义如下: B00L GetCommState(HANDLE hFile,LPDCB IpDCB); BOOl
7、J SetCommState f HANDLE hFile, LPDCB IpDCB)j 这两个函数都包含了相同的参数,其中参数hFile是输入参数,指向已打开的串口句柄;参数IpDCB指向DCB结构的指针,在GetCommState函数中,它属于输出参数,在SetCommState函数中,它属于输入参数。DCB结构完全描述了串口的使用参数,它的定义如下: typedef s DWORD DCI DWORD Ba DWORD fBtruct DCBB1enqthudRate;inary:1DCB结构大小波特率_-进制模式DWORD fParity:1; 进行奇偶校验DWORD fOutxCts
8、Flow:1; 使CTS信号进行输出流量控制DWORD fOutxDsrFlow:1 j 使DSR信号进行输出流量控制DWORD fDtrControl:2; DTR流量控制DWORD fDsrsensitivitv:1; DSR敏感度DWORD fTXContinueOnXoff:bXOFF后是否继续发送DWORD fOutX:1; 使得输出XONXOFF有效DWORD fInX:l;使得输入XONXOFF有效DWORD fErrorChar:1 j 允许奇偶错误替换DWORD fNull:l; 允许删除NULLDWORD fRtsControl:2 j RTS流量控制DWORD fAbor
9、tOnError:1 j出错时是否终止读写操作DWORD fDummy2:17; 保留WORD wReserved; 当前未用,必须置为0WORD XonLim; XON阈值WORD XoffLim; XOFF阈值char EvtChar; j f萼懈导符WORD wReservedl; 保留,未用)DCB;· 成员DCBlength指定了DCB结构大小。· 成员BaudRate指定了串口设备的传输速率。波特率的范围一般是从每秒110位到每 秒256000位。· 成员fBinary必须被设置TRUE,因为在CE中不支持非二进制的串行传输模式。· 成员fP
10、arity表示启用奇偶校验,该值一般被设置TRUE,以便启用奇偶校验。 、· 成员fOutxCtsFlow用于指定CTS(ClearT0Send)信号是否被监视并作为输出流 量控制信号。如果此成员被设置为TRUE并且CTS信号被关闭,则输出被挂起,直 到CTS信号重新发出。· 成员fOutxDsrFlow用于指定DSR(DataSetReady)信号是否监视并作为输出流 量控制信号。若此成员被设置TRUE,并且DSR信号被关闭,则输出被挂起,直到 DSR信号重新发出。· 成员fDtrControl指定DTR(DataTerminalReady)信号作为流量控制,此
11、成员可以 是表l03中列出的值。 表103 fDtrControl成员取值表 值 描述DTRCONTROLDISABLE当串口设备打开时,DTR信号线始终设为禁止DTRCONTROLENABLE当串口打开时,DTR信号线设为使能并始终打开DTRCONTROLHANDSHAKE使DTR支持握手,此时可调用EscapecommFunction函数来释放DTR线上的错误第10章串口编程355输入缓冲区中存有数据的空间达到XoffLim定义的字节数时,XoffChar将被发送;当输入缓冲区中可用的空间达到XonLim定义的字节数时,XonChar被发送。成员fErrorChar指定当收到的字符发生奇偶
12、校验错误时,是否使用ErrorChar成员定义的字符代替。若此成员设为TRUE且fP撕够成员为TRUE,将会发生替换。成员fNull指定null是否被丢弃。若此成员设为TRUE,则接收到的NULL字符被放弃。成员fRtsControl指定RTS(request-to-send)流量控制。若此值为0,则缺省值为RTS CONTROL HANDSHAKE。表l04歹0出了该成员的可用值。表10-4 fRtsControl成员的可用值表 值 描述RTSCONTROLDISABLE当串口设备打开时,RTS线始终为禁止RTSCONTROLENABLE当设备打开时,RTS线始终设为使能并始终打开RTSCO
13、NTROLHANDSHAKE启用RTS握手功能。当输入缓冲区字符小于缓冲区总数的12时,驱动程序使RTS信号为高,超过34时,使RTS信号为低。若RTS握手功能可用,可调用EscapeCommFunction函数释放DTR线上的错误RTSCONTROLTOGGLE指定当发送数据时,RTS信号线为高,缓冲区数据发送完,RTS信号线为低成员fAbortOnError指定当错误发生时,读写操作是否终止。若此成员设置为TRUE,则当错误发生时,所有的读写操作将终止,直到应用程序识别错误并调用ClearCommError函数后,驱动程序才进行更深层次的通讯。成员fDummy2保留,未用。成员wReser
14、ved未用,必须置为0。成员XonLim指定发送XON字符前输入缓冲区允许的最小字节数。成员XoffLim指定发送XOFF字符前输入缓冲区允许的最大字节数。最大允许接收字符数可以用定义的全部输入缓冲区字节数减去此值得到。成员ByteSize指定每字节发送接收的位数。成员Parity指定奇偶校验方法。表l05列出了该成员的可用值。表10-5 Parity成员的可用值表 值 描述EVENRUUTY偶校验MARKpARTTY标记校验NORUUTY无校验ODDBUUTY奇校验SPACEPfUUTY Space· 成员StopBits用于指定停止位的位数。该成员的可用值如表l0-6所示。
15、83; 成员XonChar指定发送接收的XON字符。· 成员XoffChar指定发送接收的XOFF字符。· 成员ErrorChar指定当接收的奇偶校验错误时被代替的接收字符。356 Windows CE嵌入式高级编程及其实例详解(用c+实现)表10-6 StopBits成员可用值表 值 描述ONESTOPBIT 1位停止位1E5STOPBITS 1.5位停止位TWOSTOPBITS 2位停止位· 成员EofChar指定某字符作为数据结束标记。· 成员EvtChar指定某字符作为事件标记。 · 成员wReserved被保留,未用。 在设置串口参数
16、时,最好先用GetCommState函数得到串口的当前参数,然后再修改需要设置的成员。 3读、写串口 正如使用CreateFile函数打开串口一样,开发人员同样可以使用ReadFile和WriteFile函数读取串口数据和向串口中写入数据。关于ReadFile和writeFile函数的介绍,请参考第6章文件编程中的介绍。 这里需要注意的是,由于从串口中读写数据的速度比较慢,因此不要试图在主线程中读写大量数据,这样会阻塞主线程中处理主窗体的消息队列,最好的方法就是用单独的线程来读写数据。在下面的串口综合使用示例中将会介绍ReadFile和WriteFile函数的具体用法。 4异步串口IO 虽然W
17、indows CE中不支持重叠IO操作,但还是可以分别用单独的线程去读写串口,通过多线程来模拟重叠操作。同时Windows CE还提供了WaitCommEvent函数,该函数将阻塞线程,直到预先设置的串口事件中的某一事件发生。在后面的串口综合使用示例中将会介绍WaitCommEvent函数的使用。 在使用串口事件前,还需要了解如下三个函数: BOOL GetCommMask(HANDLE hFile,LPDWORD ipEvtMask); BOOL SetCommMask(HANDLE hFile,DWORD dwEvtMask); BOOLWaitCommEvent(HANDLE hFile
18、,LPDWORD IpEvtMask,LPOVERLAPPED lpOVerlapped); · GetCommMask函数用于得到串口已经设置了的串口事件,参数hFile指定已打开的 串口句柄,参数lpEvtMask用于存取得到串口事件集。 · SetCommMask函数的功能与GetCommMask函数相反,用于设置串口事件集。 · WaitCommEvent函数用于等待预先设置的串口事件中的某一事件发生。参数 lpEvtMask用于存储已经的发生事件;参数lpOverlapped必须被设置NULL,因为在 Windows CE中不支持重叠结构。 上面三个函数
19、中的第2个参数,即串口事件集,它可以是表l07中的某个值或其中组合。表107串口事件表 值 描述EVBREAK检测到中断发生EV CTS CTS改变了状态EV DSR DSR信号改变了状态第10章串口编程357续表 值 描述EV ERR串口驱动程序检测到了错误EV RING检测到振铃EV RLSD RLSD行改变了状态EVRXCHAR接收到了一个字符EVRXFLAG接收到了一个事件字符EVTXEMPTY 。在输出缓冲区中的最后个字符被发生 5设置端口读写超时 在调用ReadFile和WriteFile函数从串口读取数据和写入数据时,Windows CE提供了超时机制,也即是设置了等待它们返回的
20、时间长度。设置串口超时函数SetCommTimeouts的定义如下所示: BOOL SetCommTimeoutS( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)j · 参数llFile指向已经打开的串口句柄。 · 参数lpCommTimeouts指向COMMTIMEOuTS结构,设置新韵超时值。 COMMTIMEOUTS结构定义如下: typedef structCOMMTIMEOUTS DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; DWORD Read
21、TotalTimeoutConstant; DWORD WriteTotalTimeoutMultiplier; DWORD WriteTotalTimeoutConstant; )COMMTIMEOUTS,+LPCOMMTIMEOUTS; 读超时的计算方法有两种,一种超时是ReadIntervalTimeout指定了在接收字符间的最大时间间隔,如果超过了这个时间,ReadFile函数立刻返回;另一种超时是基于要接收的字符数量,ReadTotalTimeoutMultiplier表示平均读一字节的时间上限,ReadTotalTimeoutConstant表示读数据总超时常量。 第二种读数据超时
22、可用如下等式表示: 读数据总超时=ReadTotalTimeoutConstant+(ReadTotalTimeoutMultiplier*要读的字节数) 写超时计算方法与读超时的第2种计算方法相似,WriteTotalTimeoutMultiplier表示平均写一字节的时间上限,WriteTotalTimeoutConstant表示写数据总超时常量,总超时计算方法如下: 写数据总超时=WriteTotalTimeoutConstant+(WriteTotalTimeoutMultiplier*要写的字节数) 对于读数据超时,第一种超时(间隔超时)和第二种超时(总超时)同时有效,当出现任何一种
23、超时时,都将返回。下面是详细的超时值设置: · 有读间隔超时、读总超时和写总超时:将COMMTIMEOUTS结构中的五个成员设置 为相应值。 · 有读总超时和写总超时,但没有读间隔超时:将ReadIntervalTimeout设置为0,将其黔叩一358 windows cE嵌入式高级编程及其实例详解(用c+实现)_一 他字段设置为相应值。 · 不管是否有数据要读取,ReadFile立刻返回:将ReadIntervalTimeout设置成 MAX DWORD,将ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都设
24、置 成0。 · ReadFile没有超时设置,直到有适当的字符数返回或错误发生,该函数才返回:将 ReadIntealTimeout、ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant值都设 置为0。 ·writeFile没有超时设置:将WriteTotalTimeoutMultiplier和WriteTotalTimeout_Constant 都设置成0。 对于串口读写,以上所介绍到的超时操作是至关重要的。读者可以根据实际情况考虑采用何种超时操作。如果从串口读取数据和写入数据都采用超时,最好采用单独的线程负责读取和写入,
25、以使不会阻塞主线程。 Windows CE还提供了SetupComnl函数来设置接收和发送数据的缓冲区的大小。它的定义如下: 。 BOOL SetupComm( HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue); · 参数hFile指定已经打开的串口句柄。 · 参数dwlnQueue和dwOutQueue指定接收和发送缓冲区的大小。 SetupConlm并不推荐使用,因为系统会推荐一个适合的默认值。 6控制串口 Windows CE提供了SetCommBreak函数,用于停止传输字符并将串口置于中断状态,还提供了ClearC0
26、删:llBreak用于重新传输字符。SetCommBreak和ClearCommBreak函数的定义如下: BOOL SetCommBreak( HANDLE hFile); BOOL ClearCommBreak( HANDLE hFile); 以上两个函数都只有唯一的入口参数hFile,表示已打开的串口句柄。 7清空串口缓冲区 Windows cE提供了PurgeComm函数用于清空串口的发送缓冲区和接收缓冲区,PurgeComm函数的定义如下: BOOL PurgeComm( HANDLE hFile, DWORD dwFlags)j · 参数hFile表示打开的串口句柄。 &
27、#183; 参数dwFlags表示操作类型,在Windows CE下该参数有如下两种取值。 >PURGE TXCLEAR:清空发送缓冲区。 >PURGE RXCLEAR:清空接收缓冲区。第10章串口编程359 这两个值可以组合使用,表示同时执行清空发送缓冲区和接收缓冲区的功能。 8清除错误并查询状态 Windows CE还提供了一个非常有用的函数ClearCommError,用于清除驱动程序产生的任何错误状态并返回当前窗口状态,该函数定义如下: BOOL ClearCommError( HANDLE hFile, LPDWORD ipErrors, LPCOMSTAT ipStat
28、); · 参数hFile指向已经打开的串口句柄。 · 参数lpErrors表示发生的错误码,它的值将是表108中的任意一个值或组合。表108 IpErrors参数取值表 错误码 描述CEBREAK硬件检测到了一个中断条件CEFRAME硬件检测到一个帧错误CE l0E硬件通讯时发生一个IO错误CEMODE请求模式未被支持,或者hFile参数无效。如果这个值被指定,它就是仅有的合法错误CEOVERRUN一个字符缓冲区侵占发生,下一个字符被丢失CERXOVER输入缓冲区溢出发生,或者输入缓冲区无空间,或者在收到EndOfFile(EOF)字符之后又收到字符CERXPARITY硬件
29、检测到奇偶校验错误CETXFULL应用程序试图发送一个字符,但是输出缓冲区已满· 参数lpStat指向COMSTAT结构,用于存储当前窗口的状态。COMSTAT结构的定义 如下所示:tvPedef Struct COMSTATDWORD fCtSH01d:1;DWORD fDsrH01d:1;DWORD fRlSdH01d:1;DWORD fXOffH01d:1;DWORD fXoffSent: 1;DWORD fEof:1;DWORD fTxim:1j DWORD fReserved:25;DWORD cbInQue;DWORD cbOutQue;COMSTAT,+LPCOMSTA
30、Tj前5个字段表示串口传输是否因为它的原因而等待。字段fCtsHold表示是否等待CTS信号。字段ff)srHold表示是否等待DSR信号。字段fRlsdHold表示是否等待“接收线路信号检测,也叫载波检测”。字段tXoffHold表示是否等待XOFF字符。字段fXoffSent表示是否因为驱动程序发送XOFF字符而等待。字段fEof表示是否收到串口尾部字符。字段fTxim如果是1,表示队列中的字符是由TransmitCommChar函数写入的而不WriteFile函数。 · 字段cblnQue表示接收缓冲区存储的待读取的字符数。 · 字段cbOutQue表示发送缓冲区中存
31、储的待发送的字符数。 在下面的串口综合示例中,将利用ClearCommError函数来得到串口接收缓冲区待读取的字符数。 103 CE串口综合示例 前一节中介绍了串口编程的基本知识,本节将封装一个Windows CE串口使用类CCESeries。基于此类,可以方便地开发基于串口方面的通讯应用。下面就逐步介绍Windows CE串口综合示例的创建过程。 (1)建立新项目。 使用vS20051vC+1智能设备IMFC智能设备应用程序向导创建一个基于对话框的应用程序SerialSample,编译环境设置为Windows Mobile 6 Professional SDK(ARMV4I),设备选择CH
32、SWindows Mobile 6 Classic Emulator,把窗口字体改成宋体小五号。 (2)新建CCESeries类,用于封装串1:3通讯。 CCESeries类是一个通用c+类,无基类。其类图如图101所示。 图10-1 串口类类图 CCESeties类将提供4个公有方法和一个回调函数接口。这4个公有方法分别为0penPort、closePort、writesyncPort和SetSeriesTimeOuts。其中OpenPort方法用于根据其指定的参数打开串口,并创建读线程来异步接收数据;ClosePort方法与OpenPort方法相对应,用于关闭串口释放相关资源,同时也将关闭
33、读线程;SetSeriesTimeOuts方法用于设置串口读写超时;writeSyncPort方法用于向串口写入数据;至于回调函数mOnSeriesRead,是当读线程检测到串口有可读数据时,通过它来通知用户读取数据。CCESeries类的使用流程如图l02所示。 下面就来介绍CCESeries类的具体实现过程。 1)为CCESeries类添加如下私有变量,用于CCESeries类内部使用,代码如程序清单101所示。 是第10章串口编程361 图102 CCESeries类使用流程图+程序清单l01+private:已打开的串口句柄 。 HANDLE m_hComm; 读线程句柄 HANDLE
34、 m_hReadThread; 读线程ID标识 DWORD m_dwReadThreadID; 读线程退出事件 HANDLE m_hReadCloseEvent; BOOL m bOpened;串口是否打开void+m pOwner j指定父对象指针 +a 2)定义串口接收数据回调函数,该回调函数供外部使用者调用。执行该回调函数时,表示接收到了串口数据,请求做出相应处理。 首先在CCESeries类定义外部定义串口接收数据函数类型,代码如下: 定义串口接收数据函数类型 typedef void(CALLBACK+ONSERIESREAD)(void+pOwner+父对象指针+ ,BYTE*bu
35、f*接收到的缓冲区+ ,DWORD dwBufLen接收到的缓冲区长度+); 接着,为CCESeries类添加一个串口接收数据函数变量,此变量声明为共有,供外部使用。定义如下: public: ONSERIESREAD m onseriesRead;串口读取回调函数 3)实现CCESeries类构造函数和析构函数,在构造函数里将m hComm初始化为无效句睛;在析构函数中,如果检测到串口是打开的,则关闭串口。CCESeries类构造函数和析构函牧的实现如程序清单102所示。 程序清单l02柑 构造函数 CCESeries:CCESeries()初始化内部变量 _m hComm=INVALID
36、HANDLE VALUE;m_OnSeriesRead 2 NULL;m_bOpened 20;析构函数 。CCESeries:一CCESeries() if(m bOpened) 关闭串口 ClosePort(); + 4)为CCESeries类添加串口接收数据线程函数ReadThreadFunc,该线程用于异步接口数据。读者应仔细理解该线程的具体实现过程?该线程通过循环调用WaitCommEvent来检测串口状态,当发现有数据时,调用:ReadFile函数读取数据,并触发给回调函数,实现串口数据的实时异步读取。 ReadThreadF岫c函数被定义成私有静态。定义如下:Private: 串
37、口读线程函数 static DWORD WINAPI ReadThreadFunc(LPVOID iparam);读线程函数的实现如程序清单10-3所示。妥程序清单l0-3+串口读线程函数DWORD CCESeries:ReadThreadFunc(LPVOID iparam)( CCESeries*ceSeries=(CCESeries+)iparam;DWORD eVtMaskjBYTE+readBuf=NULL;读取的字节DWORD actualReadLen=0;实际读取的字节数DWORD wiliReadLen; DWORD dwReadErrors;cOMSTAT cmstate;
38、清空缓冲,并检查串口是否打开ASSERT('ceSeries一>m_hComm!=INVALIDHANDLEV 第10章串口编程 363PurgeComm(ceSeries一>m_hComm,PURGERXCLEAR I PURGETXCLEAR)jSetCommMask(ceSeries一>m hComm,EV RXCHAR l EV CTS l EV DSR)jwhile(TRUE)if(WaitCommEvent(ceSeries一>m hComm,evtMask,0) SetCommMask(ceSeries一>m hComm,EV RXCHAR
39、I EV CTS I EV DSR); 表示串口收到字符if(evtMaskfEVRXCHAR)ClearCommError(ceSeries一>m_hComm,&dwReadErrors,&cmState)jwi l iReadLen=cmStatecbInQue;if(wiliReadLen<=0)continue;分配内存readBuf=new BYTEwilIReadLen;ZeroMemory(readBuf,willReadLen);读取串口数据 ReadFile(ceSeries一>m_hComm,readBuf,willReadLen,&
40、;actualReadLen,0);如果读取的数据大于0if(actualReadLen>0)readBuf,actualReadLen)j触发读取回调函数if(ceSeries->m_OnSeriesRead)黧麓豳薯圈豳ceSeries一>m_OnSeriesRead(ceSeries一>m_pOwner,释放内存delete】readBufjreadBuf=NULLj如果收到读线程退出信号,则退出囊煳霜翻豳圜圈豳黼翩醺黼if(WaitForSingleObject(ceSeries一>mhReadCloseEvent,500)。break;WAIT_OBJE
41、CT_0)_364鳞徽嘲蛹艨Windows CE嵌入式高级编程及其实例详解(用c+实现) return 0; 5)为CCESeries类添加关闭接收数据线程私有函数CloseReadThread。当使用完串口后,便调用这个函数退出串口数据接收线程。该函数的定义如下: private: 关闭读线程 VOid CloseReadThread(); CloseReadThread函数的实现如程序清单l 04所示。 +程序清单l0一4+ 关闭读线程 void CCESeries:CloseReadThread() SetEvent(m hReadCloseEvent); 设置所有事件无效无效 SetC
42、ommMask(m_hComm,0); 清空所有将要读的数据 PurgeComm(mhComm,PURGERXCLEAR); 等待4秒,如果读线程没有退出,则强制退出 if(waitForsingleObject(mhReadThread,4000)=WAITTIMEOUT) TerminateThread(mhReadThread,0); mhReadThread=NULL; 士+ 6)为类CCESeries添加0perff'ort公有方法,供外部调用此方法打开串口。0perff'ort方I将根据指定的参数打开串口,并创建此串口的读线程,以实现串口数据实时异步读操作。Open
43、Port方法定义如下: public: |f瓠歼卑BOOL OpenPort(void+pOwner, UINT portNo=1, UINT baud=9600, UINT parity=NOPARITY, UINT databits=8, UINT stopbits=O );*指向父指针*+串口号+*波特率*奇偶校验+数据位+*停止位*OpenPort方法的实现如程序清单l0-5所示。程户笋清单10一5+*函数介绍:打开串口*入口参数:pPortOwner:使用此串口类的窗体句柄 portN0:串口号嬲嬲啜鬃黪攀蔓譬 baud:波特率 parity:奇偶校验 databits:数据位 st
44、opbits:停止位*出口参数:(无)+返回值:TRUE:成功打开串口;FALSE:打开串口失败fBOOL CCESeries:0penPort(void+pOwner,。 UINT portN0, UINT baud, UINT parity, UINT databitS, UINT stopbits ) DCB commParam; TCHAR szPort15; ASSERT(pOwner!=NULL); m_pOwner=pOwner; 已经打开的话,直接返回 i f(m_hComm!=INVALI DHANDLE_VALUE) return TRUE; ) 、*串口号*波特率*奇偶校
45、验+*数据位*停止位*X 设置串口名 wsprintf(szPort,L”COMd:”,portNo); 打开串口 m hComm=CreateFile( SzPort, GENERICREAD l GENERIC_WRITE, 允许读和写 0, 独占方式(共享模式) NULL, OPENEXISTING, 打开而不是创建(创建方式) 0, NULL )j if(m_hComm=INVALIDHANDLEVALUE) 无效句柄,返回TRACE(一T(”CreateFile返回无效句柄n,·);return FALSE;曩一羹mhComm=INVALI DHANDLEVALUE;ret
46、urn FALSE j设置串口参数commParamBaudRate=baud;commParamfBinary=TRUE;commParamfParity=TRUE;commParamByteSize=databitS;commParamParitY 2 paritY;commParamStopBits=StopbitS;设置波特率设置二进制模式,此处必须设置为TRUE支持奇偶校验数据位,范围:48校验模式停止位commParamfOutxCtsFlow=FALSE; No CTS output flow controlcommParamfOutxDsrFlow=FALSE; No DSR
47、output flow controlcommParamfDtrContr01=DTR CONTROL ENABLE j|f DTR flow contr01 typecommParamfDsrSensitivity=FALSE; DSR sensitivitycommParamfTXContinueOnXoff=TRUE; XOFF continues TxcommParamfOutX=FALSE; NO XONXOFF out flow controlcommParamfInX=FALSE; INo XONXOFF in flow controlcommParamfErrorChar=FA
48、LSEj Disable error replacementcommParamfNull=FALSE; Disable null strippingcommParamfRtsControl=RTS CONTROLENABLEjfRTS flow controlcomParamfAb。rtOnErr。r:FALSE; 当串口发生错误时并不终止串口读写设置串口参数if(!SetCommState(m hComm,&commParam) TRACE(T(”SetCommState error”); 关闭串口 ClOSeHandle(m hComm); m hComm=INVALIDHANDLEVALUE; return FALSE;)1设置串口读写时间COMMTIMEOUTS CommTimeOutS;GetCommTimeouts(mhComm,&CommTimeOuts); 第10章串口编程 367CommTimeOutSReadIntervalTimeoUt=MAX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业病认定与续签劳动合同关系
- 图像处理单元考核试卷
- 玉石的开采历史与地理分布考核试卷
- 放射性金属矿的燃料棒制造与寿命管理考核试卷
- 硅冶炼厂的安全应急预案考核试卷
- 智能消费设备的安全性考量考核试卷
- 网络安全防护在电信行业的运营风险考核试卷
- 棉花加工设备全生命周期成本分析考核试卷
- 竹木资源循环利用与环保技术考核试卷
- 磷肥生产过程中的环保技术发展与应用趋势考核试卷
- 2024年内蒙古师范大学招聘事业编制人员考试真题
- (二模)2025年河南省五市高三第二次联考历史试卷(含答案)
- 飞行员劳动合同模板及条款
- 《劳动项目五:煮鸡蛋》(教案)-2024-2025学年人教版劳动三年级上册
- 第中西艺术时空对话 课件 2024-2025学年岭南美版(2024) 初中美术七年级下册
- 2025-2030检测设备行业行业风险投资发展分析及投资融资策略研究报告
- (三模)广西2025届高中毕业班4月份适应性测试 英语试卷(含答案解析)
- (四调)武汉市2025届高中毕业生四月调研考试 物理试卷(含答案)
- 中级财务会计课件第四章 金融资产学习资料
- 2025年济南市中区九年级中考数学一模考试试题(含答案)
- 中国印楝素市场调查报告
评论
0/150
提交评论