📄 hdlc_st30.c
字号:
mData_Reg=0;
mHdlc_LoopCounter=3; /*地址计数器*/
mBit_Counter=0x1; /*地址位*/
mTask_ID++;
break;
case 1: /*接收地址*/
if(f_HDLCStat){
mData_Reg|=mBit_Counter;
}
mHdlc_LoopCounter--;
mBit_Counter<<=1;
if(mHdlc_LoopCounter==0)
{
if(mData_Reg==HDLCADDR){
mBit_Counter=0x1; /*地址位*/
mData_Reg=0;
mHdlc_LoopCounter=5;
mTask_ID++;
}
else {
TR0=0;
EX0=1;
mTask_ID=0; /*重新开始*/
}
}
break;
case 2: /*命令 0ccccxxx0*/
if(f_HDLCStat){
mData_Reg|=mBit_Counter;
}
mHdlc_LoopCounter--;
mBit_Counter<<=1;
if(mHdlc_LoopCounter==0)
{
mHDLC_Cmd=mData_Reg; /*0ccccxxx0 <-*/
mData_Reg=0;
if(mHDLC_Cmd>0xf){
TR0=0;
EX0=1;
mTask_ID=0;
}
else
{
mBit_Counter=0x1; /*地址位*/
mHdlc_LoopCounter=8;
mTask_ID++; /*命令效验和接收*/
}
}
break;
case 3: /*效验和*/
if(f_HDLCStat){
mData_Reg|=mBit_Counter;
}
mHdlc_LoopCounter--;
mBit_Counter<<=1;
if(mHdlc_LoopCounter==0)
{
if(Con_Crc[HDLCADDR+mHDLC_Cmd]==mData_Reg){
HDLC_ReciStat=COMMAND;
LEDOUT=~LEDOUT;
}
TR0=0;
EX0=1;
mTask_ID=0;
}
break;
/******************************************************************************
发送命令
*******************************************************************************/
case 5: /*发送HDLC_HEADHIGH个1*/
mHdlc_LoopCounter=HDLC_HEADHIGH; /*准备*/
mTask_ID++;
break;
case 6:
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0)
{
HDLCOUT=0;
mHdlc_LoopCounter=3;
mData_Reg=HDLCADDR;
mTask_ID++;
}
break;
case 7: /*发送地址*/
if(mData_Reg&1)HDLCOUT=1;
else HDLCOUT=0;
mData_Reg>>=1;
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0)
{
mHdlc_LoopCounter=5;
mData_Reg=mHDLC_Cmd;
mTask_ID++;
}
break;
case 8: /*发送命令*/
if(mData_Reg&1)HDLCOUT=1;
else HDLCOUT=0;
mData_Reg>>=1;
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0)
{
mHdlc_LoopCounter=8;
mData_Reg=Con_Crc[mHDLC_Cmd+mHDLC_Addr];
mTask_ID++;
}
break;
case 9: /*发送效验和*/
if(mData_Reg&1)HDLCOUT=1;
else HDLCOUT=0;
mData_Reg>>=1;
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0){
f_SendBusy=0;
TR0=0;
EX0=1;
mTask_ID=0; /*接收方式*/
INMODE();
}
break;
/*******************************************************************************
发送数据
*******************************************************************************/
case 10: /*发送HDLC_HEADHIGH个1*/
HDLCOUT=1;
mHdlc_LoopCounter=HDLC_HEADHIGH; /*准备*/
mTask_ID++;
break;
case 11:
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0)
{
HDLCOUT=0;
mHdlc_LoopCounter=3;
mData_Reg=HDLCADDR;
mTask_ID++;
}
break;
case 12: /*发送地址*/
if(mData_Reg&1)HDLCOUT=1;
else HDLCOUT=0;
mData_Reg>>=1;
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0)
{
mHdlc_LoopCounter=5;
mData_Reg=mHDLC_Cmd;
mTask_ID++;
}
break;
case 13: /*发送命令0*/
if(mData_Reg&1)HDLCOUT=1;
else HDLCOUT=0;
mData_Reg>>=1;
mHdlc_LoopCounter--;
if(mHdlc_LoopCounter==0)
{
mData_Reg=Send_Buf[0];
mByte_Counter=0;
mBit_Counter=1;
mTask_ID++;
}
break;
case 14: /*发送数据 */
if(mData_Reg&1)HDLCOUT=1;
else HDLCOUT=0;
mData_Reg>>=1;
mBit_Counter<<=1;
if(mBit_Counter==0){
mBit_Counter=1;
mByte_Counter++;
mData_Reg=Send_Buf[mByte_Counter];
}
if(mByte_Counter==SendByte_Counter)
{
if(mBit_Counter==SendBit_Counter)
{
f_SendBusy=0;
TR0=0;
EX0=1;
mTask_ID=0; /*接收方式*/
INMODE();
}
}
break;
default:
TR0=0;
EX0=1;
mTask_ID=0;
INMODE();
break;
}
}
/*******************************************************************************
HDLC初始化
*******************************************************************************/
void HDLC_Init(void)
{
INMODE(); /*输出方式*/
mTask_ID=0; /*停止*/
}
/***************************************************************************
检查接收的命令情况
***************************************************************************/
void ReciCmd_CheckState()
{
if(HDLC_ReciStat==COMMAND){
HDLC_ReciStat=NONE; /* */
return;
EX0=0;
switch(mHDLC_Cmd&0x7){
case CMD_DATA:
if(mHDLC_Cmd&0x8){
f_SendBufFlow=1;
mHDLC_Cmd&=0xf7;
return;
}
if(SENSORSTAT){
if(f_SendBufFlow){
OUTMODE();
HDLC_ReciStat=NONE;
f_SendBufFlow=0;
f_SendBusy=1;
mTask_ID=10; /*数据发送*/
TR0=1;
}
}
else {
mHDLC_Cmd=CMD_OUTLINE;
OUTMODE();
HDLC_ReciStat=NONE;
f_SendBusy=1;
mTask_ID=5; /*命令发送*/
TR0=1;
}
break;
case 1:
HDLC_ReciStat=NONE;
break;
case 2:
HDLC_ReciStat=NONE;
break;
default:
HDLC_ReciStat=NONE;
break;
}
}
}
main()
{
IP=0x3;
Timer0_Init();
Timer1_Init();
ExtInt0_Init();
HDLC_Init();
Task_Init();
EA=1;
while(1)
{
AD_CheckState();
Tran_ADToSend();
ReciCmd_CheckState();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -