📄 monitorrom.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 + -