📄 serial.cpp
字号:
// Serial.cpp: implementation of the Serial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GlobalVar.h"
#include "Serial.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//调试ucosii时发现一串口程序居然能软件产生串口中断,不知这是不是真实存在的
//keil c中支持这种软件中断,开中断情况下TI=1居然能强制处理器发生串口中断
//教科书上我没有发现有这种方式,为了兼容期间本模拟器加入这种中断方式,但是其他中断是否有此特性?
//////////////////////////////////////////////////////////////////////
Serial::Serial()
{
}
Serial::~Serial()
{
}
void Serial::SetSBUStxd(SerialBus *pBUS)
{
psbustxd=pBUS;
psbustxd->SetInObj(this);
}
void Serial::SetSBUSrxd(SerialBus *pBUS)
{
psbusrxd=pBUS;
psbusrxd->SetOutObj((MyObject *)this);
//MyObject::Serial_Char_Event_CallBack('a');
}
int Serial::Serial_Char_Event_CallBack(char ch)
{
if(RecvComplete)
{
chbuf=ch;
RecvComplete=0;
RICLOCKEVENTPOS.CLOCK_POS=Cycle;
pKMsg->CallBackAfterRelativeClock(RI_Clock_HOOKFun,&(RICLOCKEVENTPOS));
}
else
{
chbuf=ch;
RecvComplete=0;
RICLOCKEVENTPOS.CLOCK_POS=Cycle;
pKMsg->CallBackAfterRelativeClock(RI_Clock_HOOKFun,&(RICLOCKEVENTPOS));//为了实现不会丢失数据的川口,暂时先这样吧
return -1;
}
//if(var8051[VarNum]->PS->psbustxd==NULL)
//{
// return ;
//}
//var8051[VarNum]->PS->psbustxd->SendChar(var8051[VarNum]->PS->SBUFW);
//AfxMessageBox("int Serial::Serial_Char_Event_CallBack(char ch)");
return 1;
}
void TI_HOOKFun(BYTE VarNum,int mode,BYTE data)//由于串口中断可软件控制,所以增加这种软件中断的方法
{
//var8051[VarNum]->IPC->SetSRIRQflag(TI,1);
//var8051[VarNum]->KMsg->CancelCallBackByClocknum(var8051[VarNum]->PS->TIHOOK_Clock_BackFunNum,TIHOOK_Clock_HOOKFun);
//因该延迟多少呢?var8051[VarNum]->PS->Cycle?还是1?
// var8051[VarNum]->PS->TIHOOK_Clock_BackFun=var8051[VarNum]->KMsg->CallBackAfterRelativeClock(1,TIHOOK_Clock_HOOKFun);
// var8051[VarNum]->PS->TIHOOK_Clock_BackFunNum=var8051[VarNum]->KMsg->GetCurrentClockpos()+1;
if(data&0x2)
{
var8051[VarNum]->PS->TICLOCKEVENTPOS.CLOCK_POS=1;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIHOOK_Clock_HOOKFun,&(var8051[VarNum]->PS->TICLOCKEVENTPOS));
}
}
void TIHOOK_Clock_HOOKFun(BYTE VarNum,unsigned short Clocknum)
{
var8051[VarNum]->IPC->Setinterrupt(RITI);
// var8051[VarNum]->PS->SendComplete=1;
// var8051[VarNum]->inst->ClockHookFun[var8051[VarNum]->KMsg->Clockpos]=0;
}
void RIHOOK_Clock_HOOKFun(BYTE VarNum,unsigned short Clocknum)
{
var8051[VarNum]->IPC->Setinterrupt(RITI);
// var8051[VarNum]->PS->SendComplete=1;
// var8051[VarNum]->inst->ClockHookFun[var8051[VarNum]->KMsg->Clockpos]=0;
}
void RI_HOOKFun(BYTE VarNum,int mode,BYTE data)
{
if(data&0x1)
{
var8051[VarNum]->PS->RICLOCKEVENTPOS.CLOCK_POS=1;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(RIHOOK_Clock_HOOKFun,&(var8051[VarNum]->PS->RICLOCKEVENTPOS));
}
}
void Serial_SCON_Write_HOOK(BYTE VarNum,int mode,BYTE data)
{
switch(data&0x3)
{
case 1:
RI_HOOKFun(VarNum,mode,data);
break;
case 2:
TI_HOOKFun(VarNum,mode,data);
break;
case 3:
RI_HOOKFun(VarNum,mode,data);
TI_HOOKFun(VarNum,mode,data);
break;
default: break;
}
}
void TI_Clock_HOOKFun(BYTE VarNum,unsigned short Clocknum)
{
var8051[VarNum]->IPC->SetSRIRQflag(TI,1);
var8051[VarNum]->IPC->Setinterrupt(RITI);
var8051[VarNum]->PS->SendComplete=1;
/* if(var8051[VarNum]->PS->bufpos<(var8051[VarNum]->PS->databuf1+65551))
{
*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
var8051[VarNum]->PS->bufpos++;
}*/
/* if(var8051[VarNum]->PS->SBUFW>0x80&&var8051[VarNum]->PS->CFlag==0)
{
var8051[VarNum]->PS->CFlag=1;
*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
var8051[VarNum]->PS->bufpos++;
if(var8051[VarNum]->PS->SBUFW=='\n'||var8051[VarNum]->PS->bufpos>(var8051[VarNum]->PS->databuf1+64));
{
*var8051[VarNum]->PS->bufpos=0x00;
var8051[VarNum]->PS->psbus->SendString((TCHAR *)var8051[VarNum]->PS->databuf1);
var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->databuf1;
}
}
else
{
if(var8051[VarNum]->PS->CFlag==1)
{
*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
var8051[VarNum]->PS->bufpos++;
if(var8051[VarNum]->PS->SBUFW=='\n'||var8051[VarNum]->PS->bufpos>(var8051[VarNum]->PS->databuf1+64));
{
*var8051[VarNum]->PS->bufpos=0x00;
var8051[VarNum]->PS->psbus->SendString((TCHAR *)var8051[VarNum]->PS->databuf1);
var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->databuf1;
}
var8051[VarNum]->PS->CFlag=0;
}
var8051[VarNum]->PS->psbus->SendChar(var8051[VarNum]->PS->SBUFW);
}*/
/* *var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
var8051[VarNum]->PS->bufpos++;
if(var8051[VarNum]->PS->SBUFW=='\n')//||var8051[VarNum]->PS->bufpos>(var8051[VarNum]->PS->databuf1+64))
{
*var8051[VarNum]->PS->bufpos=0x00;
if(var8051[VarNum]->PS->bufpos==var8051[VarNum]->PS->databuf1)
{
return ;
}
var8051[VarNum]->PS->psbustxd->SendString((TCHAR *)var8051[VarNum]->PS->databuf1);
var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->databuf1;
}*/
// var8051[VarNum]->inst->ClockHookFun[var8051[VarNum]->KMsg->Clockpos]=0;
//return;
}
void RI_Clock_HOOKFun(BYTE VarNum,unsigned short Clocknum)
{
var8051[VarNum]->PS->SBUFR=var8051[VarNum]->PS->chbuf;
var8051[VarNum]->IPC->SetSRIRQflag(RI,1);
var8051[VarNum]->IPC->Setinterrupt(RITI);
var8051[VarNum]->PS->RecvComplete=1;
}
void Serial_SBUF_Read_HOOK(BYTE VarNum,int mode,BYTE data)
{
var8051[VarNum]->mem->SetidataMemBytef(SBUF,var8051[VarNum]->PS->SBUFR);
}
void Serial_SBUF_Write_HOOK(BYTE VarNum,int mode,BYTE data)
{
if(var8051[VarNum]->PS->SendComplete)
{
var8051[VarNum]->PS->SBUFW=data;
var8051[VarNum]->PS->SendComplete=0;
var8051[VarNum]->PS->TICLOCKEVENTPOS.CLOCK_POS=var8051[VarNum]->PS->Cycle;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TI_Clock_HOOKFun,&(var8051[VarNum]->PS->TICLOCKEVENTPOS));
if(var8051[VarNum]->PS->psbustxd==NULL)
{
return ;
}
var8051[VarNum]->PS->psbustxd->SendChar(data);
}
}
int Serial::init()
{
SBUFR=0;
SBUFW=0;
Cycle=20;
psbustxd=NULL;
psbusrxd=NULL;
CFlag=0;
Baudrate=19200;
bufpos=databuf1;
SendComplete=1;
RecvComplete=1;
TICLOCKEVENTPOS.CLOCK_POS=0;
TICLOCKEVENTPOS.EVENT_QUEUE_POS=0;
RICLOCKEVENTPOS.CLOCK_POS=0;
RICLOCKEVENTPOS.EVENT_QUEUE_POS=0;
#if OS!=1
memset(databuf1,0,65536*64);
memset(databuf2,0,65536);
#endif
#if OS==1
ZeroMemory(databuf1,65536*64*sizeof(unsigned char));
ZeroMemory(databuf1,65536*sizeof(unsigned char));
#endif
pKMsg->SetupMemHook(SBUF,IdataSpace,Read,Serial_SBUF_Read_HOOK);
pKMsg->SetupMemHook(SBUF,IdataSpace,Write,Serial_SBUF_Write_HOOK);
/* pKMsg->SetupMemHook(SCON,IdataSpace,Write,Serial_SCON_Write_HOOK);
//下面两个HOOK到底能不能加呢??????????
pKMsg->SetupMemHook(SCON_RI,BitSpace,Write,RI_HOOKFun);
pKMsg->SetupMemHook(SCON_TI,BitSpace,Write,TI_HOOKFun);
pKMsg->SetupMemHook(SCON_RB8,BitSpace,Write,Serial_SCON_Write_HOOK);
pKMsg->SetupMemHook(SCON_TB8,BitSpace,Write,Serial_SCON_Write_HOOK);
pKMsg->SetupMemHook(SCON_REN,BitSpace,Write,Serial_SCON_Write_HOOK);
pKMsg->SetupMemHook(SCON_SM2,BitSpace,Write,Serial_SCON_Write_HOOK);
pKMsg->SetupMemHook(SCON_SM1,BitSpace,Write,Serial_SCON_Write_HOOK);
pKMsg->SetupMemHook(SCON_SM0,BitSpace,Write,Serial_SCON_Write_HOOK);*/
//pKMsg->SetupMemHook(SCON_RI,BitSpace,Write,Serial_SCON_Write_HOOK);
return 1;
}
//MyObject
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -