📄 cmdrs232.cpp
字号:
#include "CmdRs232.h"
#include "StdAfx.h"
HANDLE hCom;
OVERLAPPED osReader = {0};
static rs232Open=FALSE;
BOOL OpenRs232(char cmdOpt[],CString & rspStr)
{
// HANDLE hCommWatchThread ;
if(rs232Open==TRUE)
{
rspStr+="RS232 open succeeds!";
return TRUE;
}
osReader.hEvent= CreateEvent(NULL, TRUE, FALSE, NULL);
hCom =CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE,
0,
/*此项必须为0*/
NULL,
/* no security attrs*/
OPEN_EXISTING,
/*设置产生方式*/
FILE_FLAG_OVERLAPPED,
/*我们准备使用异步通信*/
NULL );
ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功
SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型
SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR );
//清干净输入、输出缓冲区
COMMTIMEOUTS CommTimeOuts={3000,3000,3000,3000,3000} ; //定义超时结构,并填写该结构
SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时
DCB dcb;
GetCommState(hCom, &dcb ) ;
dcb.BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;
SetCommState(hCom, &dcb ) ;
rspStr+="RS232 open succeeds!";
rs232Open=TRUE;
return TRUE;
}
BOOL ReadRs232(char cmdOpt[],CString & rspStr)
{
DWORD dwEvtMask=0 ,i=0;
int dwError=0;
COMSTAT ComStat ;
DWORD dwErrorFlags,dwBytesRead=0;
BOOL fReadStat ;
char *lpBuffer,*lpNewBuf;
lpBuffer=new char[MAX_RS232_RX_BUF+1];
lpNewBuf=lpBuffer;
osReader.Offset = 0;
osReader.OffsetHigh = 0;
//SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
// WaitForSingleObject(osReader.hEvent,INFINITE);
//WaitCommEvent( hCom, &dwEvtMask, /*&osReader*/NULL);
// 等待串口通信事件的发生
//if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR){ // 缓冲区中有数据到达*/
do{
ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
fReadStat= ReadFile(hCom,lpBuffer,min(MAX_RS232_RX_BUF,ComStat.cbInQue),
&dwBytesRead,&osReader); //读数据
if(fReadStat){//The first reading try is ok
//ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
//检测返回的dwEvtMask,知道发生了什么串口事件:
//输入缓冲区有多少数据?ComStat.cbInQue
}else{// we have to wait for overlapped reading
if(GetLastError()==ERROR_IO_PENDING){
// ::Sleep(100);i++;
while(!GetOverlappedResult(hCom,
&osReader,&dwBytesRead,FALSE)){
::Sleep(100);i++;
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue;
else{dwError=-1;break;}
}
}else{//end of overlapped reading
dwError=-1;
}
}
if(dwBytesRead!=0){//already read something
if(lpBuffer[dwBytesRead-1]!=')')
dwError=-1;//we need to read more
else
dwError=0;//ok, find the ending flag
lpBuffer+=dwBytesRead;//move the temp buffer pointer forward
}else{
dwError=-1;//something is wrong, we have to loop and wait
::Sleep(100);i++;
}
}while(dwError==-1||dwBytesRead==0);//end of file reading
dwBytesRead=lpBuffer-lpNewBuf;
if(dwError!=-1){//read succeeds
lpNewBuf[dwBytesRead]='\0';
rspStr+="RS232 read succeeds!\r\n";
rspStr+="Cycle time is ";
char buf[6];
::itoa(i*100,buf,10);
rspStr+=buf;
rspStr+="Ms\r\n";
rspStr+=lpNewBuf;
delete lpNewBuf;
return TRUE;
}
delete lpNewBuf;
rspStr+="RS232 read failed!\r\n";
return FALSE;
}
BOOL WriteRs232(char cmdOpt[],CString & rspStr)
{
DWORD dwBytesToWrite,dwBytesWriten=0,dwBytesDone=0;
BOOL fWriteStat ;
int dwError=0;
//ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
osReader.Offset = 0;
osReader.OffsetHigh = 0;
dwBytesToWrite=::strlen(cmdOpt);
if(dwBytesToWrite > 0) {
fWriteStat= WriteFile(hCom,cmdOpt,dwBytesToWrite,
&dwBytesWriten,&osReader); //读数据
if (!fWriteStat){
if ((dwError=GetLastError()) == ERROR_IO_PENDING){
dwBytesDone+=dwBytesWriten;
while(!(GetOverlappedResult(hCom,
&osReader,&dwBytesWriten,TRUE))){
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{dwBytesDone+=dwBytesWriten;continue;}
else
{dwError=-1;break;}
}
}
}//end of Overlapped writing
if(dwError!=-1&&(dwBytesToWrite==dwBytesDone||dwBytesToWrite==dwBytesWriten)){//read succeeds
rspStr+="RS232 write succeeds!\r\n";
rspStr+=cmdOpt;
::Sleep((dwBytesToWrite*1000)/(9600/8)); //wait for real writing complete
return TRUE;
}
rspStr+="RS232 write failed!\r\n";
return FALSE;
}// end of buffer sending
rspStr+="RS232 write succeeds!\r\n";
rspStr+="Nothing to write!\r\n";
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -