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

📄 omt.cpp

📁 通信行业软件:该软件实现了与西门子移动交换机的串口通信,模拟了厂家自带的OMTV和BCT_BMML终端软件,克服了原配软件不能每日生成LOG和定制任务的缺陷.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                          GetOverlappedResult(CommPort, &osWrite, &WriteLen, TRUE);
					  }
          
				  }
                  else
				  {
                      TransmitCommChar(CommPort, SHAKE);
                      Sleep(500);
                      WriteLen = 0;
                      memset(OutBuf, 0, sizeof(OutBuf));
                      strcpy(OutBuf,EditLineStr);
                      AppendEditOut(EditLineStr) ;
					  AppendEditOut("\r\n") ;
					  SendMessage(hwndEditLine, EM_SETSEL, 0, -1);
					  SendMessage (hwndListBoxHis, LB_INSERTSTRING, 0, (LPARAM)EditLineStr) ;
                      strcat(OutBuf, "\x3");
                      PurgeComm(CommPort, PURGE_TXCLEAR);
                      WriteFile(CommPort, OutBuf, strlen(OutBuf), &WriteLen, &osWrite);

                      if(GetLastError() == ERROR_IO_PENDING)
					  {
                          GetOverlappedResult(CommPort, &osWrite, &WriteLen, TRUE);
					  }
          
                  }
        
                  emCommState = Comm_Idle ;
                  SetWindowText(hwndStatus, "Command send completed!\r\n") ;
				  if(FileOpened)
					  fprintf(LogFile,"%s\n", EditLineStr);
			  }

		  }
		  else
		  {
			  MessageBox(hwnd, "Comm port has not been connected!", "Notice", NULL) ;
		  }
	 }
          //SendMessage (GetParent (hwnd), WM_COMMAND, 
          //             MAKELONG (1, LBN_DBLCLK), (LPARAM) hwnd) ;
     //end:     
     return CallWindowProc (OldList, hwnd, message, wParam, lParam) ;
}

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, 
                            WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {
     case WM_INITDIALOG :
          return TRUE ;
          
     case WM_COMMAND :
          switch (LOWORD (wParam))
          {
          case IDOK :
			   EndDialog (hDlg, 0) ;
               return TRUE ;
          }
          break ;
     }
     return FALSE ;
}

AskConfirmation (HWND hwnd)
{
    return MessageBox ( hwnd, TEXT ("Really want to close OMT?"),
                        szAppName, MB_YESNO | MB_ICONQUESTION) ;
}

void GenerateDate()             //根据日期生成log文件字符串保存在szTimeBuf中
{
    time(&tTime) ;
	tmTime = localtime( &tTime ) ;
	memset(szTimeBuf, 0, 13) ;
    strftime( szTimeBuf, 13, "%Y%m%d", tmTime ) ;
}

BOOL OpenComm()
{
    if( (CommPort = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 
		                        FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, 0))
		== INVALID_HANDLE_VALUE)
    {
        AppendEditOut("Open comm error:\r\n") ;
		//emCommState = Comm_Error ;
		return false;
    }

    if (GetCommState(CommPort, &CommDCB) == FALSE)
    {
        AppendEditOut("Read DCB error:\r\n");
        return false;
    }

    OldCommDCB = CommDCB;
    CommDCB.BaudRate = 9600;
    CommDCB.Parity = 2;
    CommDCB.ByteSize = 7;
    CommDCB.StopBits = 0;
    CommDCB.XonChar = 17;
    CommDCB.XoffChar = 19;
    CommDCB.XonLim = 64;
    CommDCB.XoffLim = 64;
    CommDCB.fErrorChar = 0;
    CommDCB.fNull = 0;
    CommDCB.fRtsControl = 01;
    CommDCB.fDtrControl = 01;
    CommDCB.fDsrSensitivity = 0;
    CommDCB.fOutX = 1;
    CommDCB.fInX = 1;
    CommDCB.fErrorChar = 0;
    CommDCB.fNull = 0;
    CommDCB.fAbortOnError = 0;
    CommDCB.fDummy2 = 17;
    CommDCB.wReserved1 = 0;
    //CommDCB.fTXContinueOnXoff=0;
    CommDCB.fOutxCtsFlow = 0;
    CommDCB.fOutxDsrFlow = 0;
    //CommDCB.wReserved1=1;

    if( SetCommState(CommPort, &CommDCB) == FALSE)
    {
        AppendEditOut("Set DCB error:\r\n");
        return false ;
    }

	MyBufLen.InLen  = 10*1024;
    MyBufLen.OutLen = 10*1024;
    
    if( SetupComm(CommPort, MyBufLen.InLen, MyBufLen.OutLen)
		== FALSE)
    {
        AppendEditOut("串口缓冲区长度设置出错\r\n");
        return false ;
    }

    if( GetCommTimeouts(CommPort, &CommTimeouts) == FALSE )
    {
        AppendEditOut("获取时长设置出错\r\n");
        return false ;
    }

    OldCommTimeouts = CommTimeouts;
    CommTimeouts.ReadIntervalTimeout = 5 ;  //-1;
    CommTimeouts.ReadTotalTimeoutMultiplier = 5 ;   //0;
    CommTimeouts.ReadTotalTimeoutConstant = 50 ;   //0;
    //CommTimeouts.WriteTotalTimeoutMultiplier = 0;
    //CommTimeouts.WriteTotalTimeoutConstant = 10000;
    
    if( SetCommTimeouts(CommPort, &CommTimeouts) == FALSE )
    {
        AppendEditOut("时长设置出错\r\n");
        return false ;
    }

	emCommState = Comm_Idle ;
	JobEnd = TRUE ;
	return true ;
}

void CloseComm()
{
    SetCommTimeouts(CommPort, &OldCommTimeouts);
    SetCommState(CommPort, &OldCommDCB);
      
    if (CloseHandle(CommPort))
	{
        emCommState = Comm_Close;
	}
}

void AppendEditOut(char * tmpstr)
{
    EditLen = GetWindowTextLength(hwndEditOut);
    SendMessage(hwndEditOut, EM_SETSEL, EditLen, -1);
    SendMessage(hwndEditOut, EM_REPLACESEL, 0, (LPARAM)tmpstr);
    //SendMessage(hwndEditOut, EM_REPLACESEL, 0, (LPARAM)"\r\n");
}

void SetReadEvent()
{
    long EvWait;
    if (CommPort == 0) return;
        EvWait=EV_RXCHAR+EV_RXFLAG+EV_CTS+EV_DSR+EV_RLSD+EV_BREAK+EV_TXEMPTY+EV_ERR;
    if (!SetCommMask(CommPort, EvWait))
        AppendEditOut("读线程事件设置出错");
}

BOOL ReadData()
{
	memset(szInBuf,0,sizeof(szInBuf));
	dwReadLen=0;
	
	if( ClearCommError(CommPort, &dwError, &CommStat) == FALSE)
	{	
		AppendEditOut("Read data error!") ;
		return FALSE ;	
	}
	
	if( (dwReadLen=CommStat.cbInQue) ==0 )
	{
		return TRUE;
	}

	if( ReadFile(CommPort,szInBuf, CommStat.cbInQue, &dwReadLen, NULL) == FALSE)
	{	
		AppendEditOut("Read data error1!") ;
		return FALSE ;	
	}
	
	FormatInBuf();
	return TRUE;
}

void FormatInBuf()
{
	for(ULONG i=0; i<dwReadLen; i++)
	{
		if(szInBuf[i] == 0)
		    szInBuf[i]=0x20;
		else
		    szInBuf[i]=toupper(szInBuf[i]);
	}
}

void ReadThread( void *dummy )
{
	time_t tStartReadTime;

	memset(szSave,0,sizeof(szSave));
	dwSaveLen=0;
	time(&tStartReadTime);
	
	while(1)
	{
		if(ReadTerminated)
			break ;
		Sleep(5);          //read interval
		if( ReadData() )
		{
			if(dwReadLen>0)
			{
			
                emCommState = Comm_Reading ;
                JobEnd = FALSE ;
                SetWindowText(hwndStatus, "Reading data...") ;
          
                if ( strstr(szInBuf, "\x6\x5\x3") != NULL) //交换机过一段时间会发确认消息来保持连接
                {
                  TransmitCommChar(CommPort, BELL);
                  memset(OutBuf, 0, sizeof(OutBuf));
                  strcpy(OutBuf, "\x15");
                  strcat(OutBuf, "000");
                  strcat(OutBuf, "\x3");
                  //PurgeComm(CommPort,PURGE_TXCLEAR);
                  //WriteFile(CommPort,OutBuf,5,&WriteLen,&osWrite);
                  WriteFile(CommPort, OutBuf, strlen(OutBuf), &WriteLen, &osWrite);
                  JobEnd = true;
                }			
			
				memcpy(&szSave[dwSaveLen],szInBuf,dwReadLen);  //or strcat(szSave, zsInBuf);
				dwSaveLen += dwReadLen;
				if ( strstr(inbuff, "\x3") !=NULL) //振铃通知交换机继续传送
				{
				    TransmitCommChar(CommPort, BELL);
				    
                    if (strstr(szSave, "END JOB") != NULL)
                    {
                        JobEnd = true;
                        //OneCmdEnd = true;
                    }
            
                    if (strstr(szSave, "END TEXT JOB") != NULL)
                    {
                        JobEnd = true;
                    }
            
                    if (strstr(szSave, "SESSION REJECTED") != NULL)
                    {
                        JobEnd = true;
                    }
            
                    if (strstr(szSave, "INTERRUPTION TEXT JOB") != NULL)
                    {
                        JobEnd = true;
                    }				    
				}
				
				AppendEditOut(szSave) ;
				if(FileOpened)
				    fprintf(LogFile,"%s", szSave);
				memset(szSave,0,sizeof(szSave));
				dwSaveLen = 0 ;
				emCommState = Comm_Idle ;
				
			}
			else
			{
				Sleep(20);         //Wait msc
				//if( time(NULL) - tStartReadTime>timeout )
				//	return FALSE;
			}
		}
		else
		{
		    //if( time(NULL) - tStartReadTime>timeout )
		    
		    break ;
		}
	}
	
    AppendEditOut("Read thread terminate!\r\n") ;
	_endthread() ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -