ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:22.67KB ,
资源ID:22657361      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22657361.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(vc Win32 API实现串行通信Word文档下载推荐.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

vc Win32 API实现串行通信Word文档下载推荐.docx

1、WRITE,0,NULL,OPEN?EXISTING,FILE?ATTRIBUTE?NORMAL,NULL)=INVALID?HANDLE?VALUE) return FALSE;/设置超时控制 SetCommTimeouts(hComDev,timeouts);/设置接收缓冲区和输出缓冲区的大小 SetupComm(hComDev,1024,512);/获取缺省的DCB结构的值 GetCommState(hComDev,dcb);/设定波特率为9600 bps dcb.BaudRate=CBR?9600;/设定无奇偶校验 dcb.fParity=NOPARITY;/设定数据位为8 dcb.B

2、yteSize=8;/设定一个停止位 dcb.StopBits=ONESTOPBIT;/监视串口的错误和接收到字符两种事件 SetCommMask(hComDev,EV?ERR|EV?RXCHAR);/设置串行设备控制参数 SetCommState(hComDev,dcb);bOpen=TRUE;/创建人工重设、未发信号的事件 hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”);/创建一个事件监视线程来监视串口事件 AfxBeginThread(CommWatchProc,pParam);在设置串口DCB结构的参数时,不必设置每一个值。首先读出

3、DCB缺省的参数设置,然后只修改必要的参数,其他参数都取缺省值。由于对串口进行的是同步I/O操作,所以除非指定进行监测的事件发生,否则WaitCommEvent()函数不会返回。在串行设备初始化的最后要建立一个单独的监视线程来监视串口事件,以免挂起当前调用线程,其中pParam可以是一个对事件进行处理的窗口类指针。如果要进行异步I/O操作,打开设备句柄时,CreateFile的第6个参数应增加FILE?FLAG?OVERLAPPED 标志。数据发送 数据发送利用WriteFile()函数实现。对于同步I/O操作,它的最后一个参数可为NULL;而对异步I/O操作,它的最后一个参数必需是一个指向O

4、VERLAPPED结构的指针,通过OVERLAPPED结构来获得当前的操作状态。BOOL WriteComm(LPCVOID lpSndBuffer,DWORD dwBytesToWrite) /lpSndBuffer为发送数据缓冲区指针, dwBytesToWrite为将要发送的字节长度 /设备已打开 BOOL bWriteState;/实际发送的字节数 DWORD dwBytesWritten;/设备未打开 if(!bOpen) return FALSE;bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,dwBytesWrit

5、ten,NULL);bWriteState | dwBytesToWrite!=dwBytesWritten) /发送失败 return FALSE;else /发送成功 return TRUE; 数据接收 接收数据的任务由ReadFile函数完成。该函数从串口接收缓冲区中读取数据,读取数据前,先用ClearCommError函数获得接收缓冲区中的字节数。接收数据时,同步和异步读取的差别同发送数据是一样的。DWORD ReadComm(LPVOID lpInBuffer,DWORD dwBytesToRead) /lpInBuffer为接收数据的缓冲区指针, dwBytesToRead为准备读

6、取的数据长度(字节数) /串行设备状态结构 COMSTAT ComStat;DWORD dwBytesRead,dwErrorFlags;bOpen) return 0;/读取串行设备的当前状态 ClearCommError(hComDev,dwErrorFlags,ComStat);/应该读取的数据长度 dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);if(dwBytesRead0) /读取数据 if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,dwBytesRead,NULL) dwBytesRead=0;

7、return dwBytesRead;事件监视线程 事件监视线程对串口事件进行监视,当监视的事件发生时,监视线程可将这个事件发送(SendMessage)或登记(PostMessage)到对事件进行处理的窗口类(由pParam指定)中。UINT CommWatchProc(LPVOID pParam) DWORD dwEventMask=0; /发生的事件;while(bOpen) /等待监视的事件发生 WaitCommEvent(hComDev, dwEventMask,NULL);if (dwEventMask EV?RXCHAR)=EV?RXCHAR) /接收到字符事件后,可以将此消息登

8、记到由pParam有指定的窗口类中进行处理 if(dwEventMask EV?ERR)=EV?ERROR) /发生错误时的处理 SetEvent(hEvent);/发信号,指示监视线程结束 return 0;关闭串行设备 在整个应用程序结束或不再使用串行设备时,应将串行设备关闭,包括取消事件监视,将设备打开标志bOpen置为FALSE以使事件监视线程结束,清除发送/接收缓冲区和关闭设备句柄。void CloseSynComm() bOpen) return;/结束事件监视线程 bOpen=FALSE;SetCommMask(hComDev,0);/取消事件监视,此时监视线程中的WaitCom

9、mEvent将返回 WaitForSingleObject(hEvent,INFINITE);/等待监视线程结束 CloseHandle(hEvent); /关闭事件句柄 /停止发送和接收数据,并清除发送和接收缓冲区 PurgeComm(hComDev,PURGE?TXABORT| PURGE?RXABORT|PURGE?TXCLEAR|PURGE?RXCLEAR);/关闭设备句柄 CloseHandle(hComDev);二、编程步骤1、 启动Visual C+6.0,生成一个基于对话框的的应用程序,将该程序命名为“SerealCom”;2、 按照图一的界面设计对话框,具体设置参见代码部分;

10、3、 使用Class Wizard为对话框的按钮添加鼠标单击消息响应函数;4、 添加代码,编译运行程序。 三、程序代码/#if !defined(_COMM_ACCESS_FUNCTIONS_AND_DATA)#define _COMM_ACCESS_FUNCTIONS_AND_DATA#if _MSC_VER 1000#pragma once#endif / _MSC_VER #define EVENTCHAR 0x0d#define MAXBLOCKLENGTH 59extern BYTE XwCom;extern BYTE sCom15,sCom2MAXBLOCKLENGTH+12;ex

11、tern sCom3MAXBLOCKLENGTH+12;extern BYTE opation;extern short ComNum;#define FC_DTRDSR 0x01#define FC_RTSCTS 0x02#define FC_XONXOFF 0x04#define ASCII_BEL 0x07#define ASCII_BS 0x08#define ASCII_LF 0x0A#define ASCII_CR 0x0D#define ASCII_XON 0x11#define ASCII_XOFF 0x13class CComStatuspublic:HANDLE m_hCo

12、m;BYTE m_bComId;BYTE m_bByteSize;BYTE m_bStopBits;BYTE m_bParity;DWORD m_dwBaudRate;/WORD m_fChEvt;char m_bEvtChar;DWORD m_fBinary;BOOL m_bConnected;BOOL m_fXonXoff;BOOL m_bFlowCtrl;OVERLAPPED m_rdos;OVERLAPPED m_wtos;/functionsCComStatus();CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE b

13、Parity,DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary);BOOL OpenConnection();BOOL CloseConnection();BOOL SetupConnection();BOOL IsConnected();UINT CommWatchProc( LPVOID lpData );BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite);int ReadCommBlock(CComStatus&

14、comDev,LPSTR lpszBlock, int nMaxLength );int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut);#endif/#include stdafx.hcom232.hBYTE XwCom=0x40;BYTE sCom15,sCom2MAXBLOCKLENGTH+12,sCom3MAXBLOCKLENGTH+12;BYTE opation;short ComNum;CComStatus:CComStatus()m_hCom = NULL;m_

15、bComId = (char)ComNum;/COM1m_bByteSize=8;m_bStopBits=ONESTOPBIT;m_bParity=NOPARITY;m_dwBaudRate=9600;m_bEvtChar=EVENTCHAR;m_fBinary=1;m_bConnected = FALSE;m_bFlowCtrl = FC_XONXOFF ;m_fXonXoff = FALSE;CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,DWORD dwBaudRate,/*WORD fChEvt,*/c

16、har bEvtChar,DWORD fBinary)m_bComId = bComId;m_bByteSize=bByteSize;m_bStopBits=bStopBits;m_bParity=bParity;m_dwBaudRate=dwBaudRate;m_bEvtChar=bEvtChar;m_fBinary=fBinary;BOOL CComStatus:OpenConnection()char csCom10;COMMTIMEOUTS CommTimeOuts ;if(m_bComId 4)/从COM1到COM4if(m_hCom)/if already open/OVERLAP

17、PED包含异步I/O信息m_rdos.Offset = 0;m_rdos.OffsetHigh = 0;m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);if(m_rdos.hEvent = NULL)m_wtos.Offset = 0;m_wtos.OffsetHigh = 0;m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);if(m_wtos.hEvent = NULL)CloseHandle(m_rdos.hEvent);wsprintf(csCom,COM%d,m_bComId);m_

18、hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,ILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);if(m_hCom = INVALID_HANDLE_VALUE) /dwError = GetLastError();/ handle error elseSetCommMask( m_hCom, EV_RXCHAR ) ; / get any early notificationsSetupComm( m_hCom, 4096, 4096 )

19、 ; / setup device buffers/ purge any information in the bufferPurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR ) ;/ set up for overlapped I/ODWORD dwTemp = 1000 / (this-m_dwBaudRate / 8);CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;CommTimeOuts.ReadTotalTimeoutMultip

20、lier = 0;/(dwTemp 0) ? dwTemp : 1);CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;/ CBR_9600 is approximately 1byte/ms. For our purposes, allow/ double the expected time per character for a fudge factor.CommTimeOuts.WriteTotalTimeoutMultiplier =2*CBR_9600/this-m_dwBaudRate;/( npTTYInfo ) ;CommTimeOut

21、s.WriteTotalTimeoutConstant = 0;/1000 ;SetCommTimeouts( m_hCom, &CommTimeOuts ) ;SetupConnection()CloseConnection();EscapeCommFunction( m_hCom, SETDTR );m_bConnected = TRUE;return TRUE;CloseConnection()if (NULL = m_hCom)return ( TRUE ) ;/ set connected flag to FALSE/ disable event notification and w

22、ait for thread/ to haltSetCommMask( m_hCom, 0 ) ;EscapeCommFunction( m_hCom, CLRDTR ) ;/ purge any outstanding reads/writes and close device handlePurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;CloseHandle( m_hCom ) ;/ change the selectable items in the menuClose

23、Handle(m_rdos.hEvent);CloseHandle(m_wtos.hEvent);return ( TRUE ) ;SetupConnection()BOOL fRetVal ;BYTE bSet ;DCB dcb ;if(m_hCom = NULL)dcb.DCBlength = sizeof( DCB ) ;GetCommState( m_hCom, &dcb ) ;dcb.BaudRate = this-dcb.ByteSize = this-m_bByteSize;dcb.Parity = this-m_bParity;dcb.StopBits = this-m_bStopBits ;dcb.EvtChar = this-m_bEvtChar ;/ setup hardware flow controlbSet = (BYTE) (m_bFlowCtrl & FC_DTRDSR) != 0) ;dcb.fOutxDsrFlow = bSet ;if (bSet)dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;dcb.fDtrControl = DTR_CONTROL_ENABLE ; FC_RTSCTS) !dcb.fOutxCtsFlow = bSet ;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1