2023年7月18日发(作者:)
MFC串⼝操作(异步⽅式)源码这是我在⼀个后台系统摘抄出来的,在此基础上完成了⼀个独⽴的PPI读写程序(⾮DLL或控件⽅式)//*************************************************************************//**模 块 名://**说 明:YFSoft 版权所有2005 - 2006(C)//**创 建 ⼈:叶帆//**⽇ 期:2006年4⽉4⽇//**修 改 ⼈://**⽇ 期://**描 述:串⼝操作//**版 本:V1.0//*************************************************************************#include "stdafx.h"#include "yfcom.h"//串⼝句柄HANDLE m_COM_Handle;//两个信号全局变量(串⼝操作⽤)OVERLAPPED m_OverlappedRead, m_OverlappedWrite;//*************************************************************************//函 数 名:OpenCom//输 ⼊:long lngPort, 串⼝号// char *cfgMessage, 配置信息,形如"9600,e,8,1"// long lngInSize, 接收缓冲区⼤⼩// long lngOutSize 发送缓冲区⼤⼩//输 出:long//功能描述:打开串⼝//全局变量://调⽤模块://作 者:叶帆//⽇ 期:2006年4⽉4⽇//修 改 ⼈://⽇ 期://版 本://*************************************************************************long OpenCom(long lngPort,char *cfgMessage,long lngInSize,long lngOutSize){ try { char szMsg[255]; DCB dcb;
//打开端⼝ if (lngPort>9) sprintf( szMsg, ".//COM%d", lngPort ); else sprintf( szMsg, "COM%d", lngPort ); //⽤异步⽅式读写串⼝ m_COM_Handle = CreateFile(szMsg, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED , NULL );
if( m_COM_Handle == NULL ) return( 2 ); //清空异步读写参数 memset(&(m_OverlappedRead), 0, sizeof (OVERLAPPED)); memset(&(m_OverlappedWrite), 0, sizeof (OVERLAPPED));
//设置dcb块 gth = sizeof( DCB ); //长度 GetCommState(m_COM_Handle , &dcb );
//波特率,奇偶校验,数据位,停⽌位 如:9600,n,8,1 sprintf(szMsg,"COM%d:%s", lngPort,cfgMessage); BuildCommDCB(szMsg,&dcb); //------------------------------
y=TRUE; //⼆进制⽅式
tsFlow=FALSE; //不⽤CTS检测发送流控制 srFlow=FALSE; //不⽤DSR检测发送流控制 ntrol=DTR_CONTROL_DISABLE; //禁⽌DTR流量控制 nsitivity=FALSE; //对DTR信号线不敏感 tinueOnXoff=TRUE; //检测接收缓冲区 =FALSE; //不做发送字符控制 =FALSE; //不做接收控制 Char=FALSE; //是否⽤指定字符替换校验错的字符 =FALSE; //保留NULL字符 ntrol=RTS_CONTROL_ENABLE; //允许RTS流量控制 OnError=FALSE; //发送错误后,继续进⾏下⾯的读写操作 2=0; //保留 ved=0; //没有使⽤,必须为0 =0; //指定在XOFF字符发送之前接收到缓冲区中可允许的最⼩字节数 m=0; //指定在XOFF字符发送之前缓冲区中可允许的最⼩可⽤字节数 r=0; //发送和接收的XON字符
ar=0; //发送和接收的XOFF字符 har=0; //代替接收到奇偶校验错误的字符
r=0; //⽤来表⽰数据的结束 r=0; //事件字符,接收到此字符时,会产⽣⼀个事件 ved1=0; //没有使⽤ //te =9600; //波特率 //=0; //奇偶校验
//ze=8; //数据位 //ts=0; //停⽌位 //------------------------------
if(==0 ) // 0-4=None,Odd,Even,Mark,Space { y=FALSE; //奇偶校验⽆效 } else { y=TRUE; //奇偶校验有效 }
sprintf(szMsg,"COM%d:%d,%d,%d,%d (InSize:%ld,OutSize:%ld)",lngPort,te,,ze,ts,lngInSize,lngOutSize);
//读写超时设置 COMMTIMEOUTS CommTimeOuts; //西门⼦参数 tervalTimeout =0; //字符允许间隔ms 该参数如果为最⼤值,会使readfile命令⽴即返回
talTimeoutMultiplier =0; //总的超时时间(对单个字节)
talTimeoutConstant = 2500; //多余的超时时间ms
otalTimeoutMultiplier =0; //总的超时时间(对单个字节)
otalTimeoutConstant = 2500; //多余的超时时间
SetCommTimeouts( m_COM_Handle, &CommTimeOuts );
//获取信号句柄 m_ = CreateEvent(NULL, TRUE, FALSE, NULL); m_ = CreateEvent(NULL, TRUE, FALSE, NULL);
if( !SetCommState( m_COM_Handle, &dcb ) || //判断设置参数是否成功 !SetupComm( m_COM_Handle, lngInSize, lngOutSize ) || //设置输⼊和输出缓冲区是否成功 m_==NULL || m_==NULL)
{
DWORD dwError = GetLastError(); //获取最后的错误信息 if( m_ != NULL ) CloseHandle( m_ ); if( m_ != NULL ) CloseHandle( m_ ); CloseHandle( m_COM_Handle ); m_COM_Handle=NULL; return dwError; }
return( 0 ); } catch(...) { return -1; }
}//*************************************************************************//函 数 名:CloseCom//输 ⼊://输 出:long//功能描述:关闭串⼝//全局变量://调⽤模块://作 者:叶帆//⽇ 期:2006年4⽉4⽇//修 改 ⼈://⽇ 期://版 本://*************************************************************************long CloseCom(){ try { if(m_COM_Handle == NULL ) return( 1 ); SetCommMask(m_COM_Handle ,NULL); SetEvent(m_); SetEvent(m_); if( m_ != NULL ) CloseHandle( m_ ); if( m_ != NULL ) CloseHandle( m_ ); if (CloseHandle( m_COM_Handle )==FALSE)return (2); m_COM_Handle = NULL; } catch(...) { return (3); } return( 0 );}//*************************************************************************//函 数 名:SendData//输 ⼊:BYTE *bytBuffer, 数据// long lngSize 个数//输 出:long//功能描述:发送数据//全局变量://调⽤模块://作 者:叶帆//⽇ 期:2006年4⽉4⽇//修 改 ⼈://⽇ 期://版 本://*************************************************************************long SendData(BYTE *bytBuffer, long lngSize ){ try { if( m_COM_Handle == NULL ) return( -1 );
DWORD dwBytesWritten=lngSize; BOOL bWriteStat; COMSTAT ComStat; DWORD dwErrorFlags;
ClearCommError(m_COM_Handle,&dwErrorFlags,&ComStat); bWriteStat=WriteFile(m_COM_Handle, bytBuffer, lngSize, &dwBytesWritten, &(m_OverlappedWrite)); if(!bWriteStat) { if(GetLastError()==ERROR_IO_PENDING) { GetOverlappedResult(m_COM_Handle,&(m_OverlappedWrite),&dwBytesWritten,TRUE); //等待直到发送完毕 } else { dwBytesWritten=0; } } return (long)dwBytesWritten; } catch(...) { return -1; }}//*************************************************************************//函 数 名:AcceptData//输 ⼊:BYTE *bytBuffer, 数据// long lngSize 个数//输 出:long//功能描述:读取数据//全局变量://调⽤模块://作 者:叶帆//⽇ 期:2006年4⽉4⽇//修 改 ⼈://⽇ 期://版 本://*************************************************************************long AcceptData(BYTE *bytBuffer, long lngSize ){
try {
if( m_COM_Handle == NULL ) return( -1 );
DWORD lngBytesRead=lngSize; BOOL fReadStat; DWORD dwRes=0; //读数据 fReadStat=ReadFile(m_COM_Handle,bytBuffer,lngSize,&lngBytesRead,&(m_OverlappedRead));
//Sleep(1); if( !fReadStat ) { if( GetLastError() == ERROR_IO_PENDING ) //重叠 I/O 操作在进⾏中
{ dwRes=WaitForSingleObject(m_,1000); //等待,直到超时 switch(dwRes) { case WAIT_OBJECT_0: //读完成
if(GetOverlappedResult(m_COM_Handle,&(m_OverlappedRead),&lngBytesRead,FALSE)==0) { //错误 return -2; }
break; case WAIT_TIMEOUT: //超时 return -1; break; default: //WaitForSingleObject 错误 break; } } } return lngBytesRead;
} catch(...) { return -1; }}//*************************************************************************//函 数 名:ClearAcceptBuffer//输 ⼊://输 出:long//功能描述:清除接收缓冲区//全局变量://调⽤模块://作 者:叶帆//⽇ 期:2006年4⽉4⽇//修 改 ⼈://⽇ 期://版 本://*************************************************************************long ClearAcceptBuffer(){ try { if(m_COM_Handle == NULL ) return( -1 ); PurgeComm(m_COM_Handle,PURGE_RXABORT | PURGE_RXCLEAR); // } catch(...) { return(1); } return(0);}//*************************************************************************//函 数 名:ClearSendBuffer//输 ⼊://输 出:long//功能描述:清除发送缓冲区//全局变量://调⽤模块://作 者:叶帆//⽇ 期:2006年4⽉4⽇//修 改 ⼈://⽇ 期://版 本://*************************************************************************long ClearSendBuffer(){ try { if(m_COM_Handle == NULL ) return( -1 ); PurgeComm(m_COM_Handle,PURGE_TXABORT | PURGE_TXCLEAR); // } catch(...) { return (1); } return(0);}
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689609609a270333.html
评论列表(0条)