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

📄 monitorrom.cpp

📁 MC6808系列单片机程序下载软件底层,加界面可以使用
💻 CPP
字号:
//实现MonitorROM类;
#include "stdafx.h"
#include "MonitorROM.h"

MonitorROM::MonitorROM()
{
   lSecurityByte =   NULL;
   nBaudRate = NULL;        
   nSrlPortNum = NULL;       
   hCom = NULL; 
   bIsOpen = FALSE;
}



BOOL MonitorROM::OpenCOM(int BRate,int PortNum)//打开一个串口,之后能改变串口和波特率;
{ 

	if(bIsOpen &&(PortNum != nSrlPortNum)){
		if(!CloseHandle(hCom))return FALSE;
        if(!CreateCOM(PortNum))return FALSE;
		nSrlPortNum = PortNum;
	}// 当PortNum != SrlPotrNum 关闭当前串口,打开一个新的串口

	if(bIsOpen &&(nBaudRate != BRate)){
		if(!SetBaudRate(BRate))return FALSE;
        nBaudRate = BRate;
	}//设置新的波特率;

	if(!bIsOpen)
	{
	
        if(!CreateCOM(PortNum))return FALSE;
        if(!SetBaudRate(BRate))return FALSE;
        
		nBaudRate = BRate;
		nSrlPortNum = PortNum;
		bIsOpen = TRUE;
	}// 打开一个串口;
    return TRUE;
}

BOOL MonitorROM::CreateCOM(int PortNum)
{
	
    const char *port;//保存串口号字符,用于打开串口;
    COMMTIMEOUTS timeouts;

	if((PortNum>=1)&&(PortNum<=9)){
		switch(PortNum)
		{
		case 1:
			port = "COM1";
			break;
		case 2:
            port = "COM2";
			break;
		case 3:
			port = "COM3";
			break;
		case 4:
			port = "COM4";
			break;
        case 5:
			port = "COM5";
			break;
		case 6:
            port = "COM6";
			break;
		case 7:
			port = "COM7";
			break;
		case 8:
			port = "COM8";
			break;
        case 9:
			port = "COM9";
			break;
		}
	}
	else return FALSE;


    hCom = CreateFile(port,
                     GENERIC_READ | GENERIC_WRITE,
                     0,    // comm devices must be opened w/exclusive-access
                     NULL, // no security attributes
                     OPEN_EXISTING, // comm devices must use OPEN_EXISTING
                     0,    // not overlapped I/O
                     NULL  // hTemplate must be NULL for comm devices
                     );

  if (hCom == INVALID_HANDLE_VALUE) {
      // Handle the error.
      printf ("CreateFile failed with error %d.\n", GetLastError());
      return FALSE;
    }
  timeouts.ReadIntervalTimeout=NULL;
  timeouts.ReadTotalTimeoutConstant = NULL;
  timeouts.ReadTotalTimeoutMultiplier = NULL;
  timeouts.WriteTotalTimeoutConstant = NULL;
  timeouts.WriteTotalTimeoutMultiplier = NULL;
  SetCommTimeouts(hCom,&timeouts);
  return TRUE;

}


BOOL MonitorROM::SetBaudRate(int BRate)
{
	DCB dcb;
    BOOL fSuccess;

    fSuccess = GetCommState(hCom, &dcb);

    if (!fSuccess) {
      // Handle the error.
      printf ("GetCommState failed with error %d.\n", GetLastError());
      return FALSE;
    }
    dcb.BaudRate = BRate;   // set the baud rate
    dcb.ByteSize = 8;             // data size, xmit, and rcv
    dcb.Parity = NOPARITY;        // no parity bit
    dcb.StopBits = ONESTOPBIT;    // one stop bit
    fSuccess = SetCommState(hCom, &dcb);

    if (!fSuccess) {
      // Handle the error.
      printf ("SetCommState failed with error %d.\n", GetLastError());
      return FALSE;
    }
    return TRUE;
}


BOOL MonitorROM::CloseCOM(void)
{
    BOOL fSuccess;

	fSuccess = CloseHandle(hCom);
    if(!fSuccess)
		return FALSE;
	else{
		bIsOpen = FALSE;
        return TRUE;
	}
}

BOOL MonitorROM::Read(WORD Address, BYTE *Data)
{

    DWORD count = 0;
    BYTE command = READ;
	BYTE tempbuff[2],high,low;
	if(!WriteFile(hCom,&command,1,&count,NULL))
		return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
		return FALSE;
    if(tempbuff[1]!=READ)return FALSE;
   
	low =(BYTE)Address;
    high = (BYTE)(Address>>8);
   
	if(!WriteFile(hCom,&high,1,&count,NULL))
		return FALSE;
	
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))
		return FALSE;
    if(tempbuff[1]!=high)return FALSE;
   
    if(!WriteFile(hCom,&low,1,&count,NULL))
		return FALSE;
	
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))
		return FALSE;
    if(tempbuff[1]!=low)return FALSE;
	
    if(!ReadFile(hCom,Data,1,&count,NULL))
    	return FALSE;
    return TRUE;
}

BOOL MonitorROM::Write(WORD Address,BYTE Data)//写一个字节数据到一个指定地址;
{
    DWORD count = 0;
    BYTE command = WRITE;
	BYTE tempbuff[2],high,low;
	if(!WriteFile(hCom,&command,1,&count,NULL))
		return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
		return FALSE;
    if(tempbuff[1]!=WRITE)return FALSE;
  
	low = (BYTE)Address;
    high = (BYTE)( Address>>8);
   
	if(!WriteFile(hCom,&high,1,&count,NULL))
		return FALSE;
	
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))
		return FALSE;
    if(tempbuff[1]!=high)return FALSE;
   
    if(!WriteFile(hCom,&low,1,&count,NULL))
		return FALSE;
	
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))
		return FALSE;
    if(tempbuff[1]!=low)return FALSE;
	
    if(!WriteFile(hCom,&Data,1,&count,NULL))
    	return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))
		return FALSE;
    if(tempbuff[1]!=Data)return FALSE;
   
	return TRUE;

}

BOOL MonitorROM::IRead(BYTE *Data)//读先前地址的后一个地址字数据;
{ 
	DWORD count = 0;
    BYTE command = IREAD;
	BYTE tempbuff[2];
	if(!WriteFile(hCom,&command,1,&count,NULL)){
		printf("error point 1 ;error number is %d\n",GetLastError());
		return FALSE;
	}
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
    	return FALSE;

    if(tempbuff[1]!=IREAD)
		return FALSE;

   
	if(!ReadFile(hCom,Data,2,&count,NULL))
		return FALSE;
	
	return TRUE;
}


BOOL MonitorROM::IWrite(BYTE Data)//写先前地址的后一个地址数据;
{
    DWORD count = 0;
    BYTE command = IWRITE;
	BYTE tempbuff[2];
	if(!WriteFile(hCom,&command,1,&count,NULL))
		return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
		return FALSE;
    if(tempbuff[1]!=IWRITE)return FALSE;

	if(!WriteFile(hCom,&Data,1,&count,NULL))
		return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
		return FALSE;
    if(tempbuff[1]!=Data)return FALSE;
	return TRUE;
}

BOOL MonitorROM::ReadSP(WORD *SPAddress)//读SP指针地址;
{	
	DWORD count = 0;
    BYTE command = READSP;
	BYTE tempbuff[2];
	if(!WriteFile(hCom,&command,1,&count,NULL))
		return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
		return FALSE;
    if(tempbuff[1]!=READSP)return FALSE;
   
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))
		return FALSE;
	*SPAddress = tempbuff[0];
	*SPAddress = (*SPAddress<<8) | tempbuff[1];
	return TRUE;

}

BOOL MonitorROM::Run(void)//运行用户程序;
{
    DWORD count = 0;
    BYTE command = RUN;
	BYTE tempbuff[2];
	if(!WriteFile(hCom,&command,1,&count,NULL))
		return FALSE;
	if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
		return FALSE;
    if(tempbuff[1]!=RUN)return FALSE;
	
	return TRUE;
}



BOOL MonitorROM::SendSecurityByte(void)
{   
	BYTE byte;
	BYTE tempbuff[2];
	DWORD j=0,count = 0,event=0;
	SetCommMask(hCom,EV_BREAK);
    for(int i=0;i<8;i++){
		byte = (BYTE)(lSecurityByte>>8*i);
        if(!WriteFile(hCom,&byte,1,&count,NULL))
			return FALSE;
	    if(!ReadFile(hCom,tempbuff,2,&count,NULL))//因为是采用线或通信,要读两个字节,第一个字节是先前写,第二个字节才是ECHO;
	    	return FALSE;
        if(tempbuff[1]!=byte)return FALSE;
		
	}
    WaitCommEvent(hCom,&event,NULL);
	PurgeComm(hCom,PURGE_TXCLEAR | PURGE_RXCLEAR);//clear output and input buffer;
	if(event==EV_BREAK)return TRUE;
	else return FALSE;
}


void MonitorROM::SetSecurityByte(DWORD64 SByte)
{
	lSecurityByte = SByte;
}



⌨️ 快捷键说明

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