⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdrs232.cpp

📁 自编的串口通信程序
💻 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 + -