📄 comm.c
字号:
#include "global.h"
unsigned char xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
unsigned char xdata *inTxBuf,*outTxBuf, *inRxBuf,*outRxBuf;//收发缓冲区读写指针
//inRxBuf指向收的收,outRxBuf指向收缓冲区的读。
bit TIflag=1;//Note:It must be 1.
/******************************************************************************
** 函数: UART0_Init()
** 入参:
** 返回:
** 说明:
** UART0_Init
** Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
******************************************************************************/
void UART0_Init (void)
{
SCON0 = 0x50; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
Buff_Init();
}
/******************************************************************************
** 函数: Buff_Init (void)
** 入参:
** 返回:
** 说明:
******************************************************************************/
void Buff_Init (void)
{
inTxBuf=TxBuf;outTxBuf=TxBuf;
inRxBuf=RxBuf;outRxBuf=RxBuf;
EA=1;ES0=1;
}
/******************************************************************************
** 函数: UATR0_ISR() interrupt
** 入参:
** 返回:
** 说明: interrupt 4
******************************************************************************/
void serial(void) interrupt 4
{
unsigned char *t;
if(TI0)
{
TI0=0;
if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
SBUF0=*outTxBuf; outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
}
if (RI0)
{
RI0=0;
//这里,缓冲区的读写方式跟8019as的ram区一样,是循环读,而且也用了
//两个指针,一个用来收,一个用来读
t=inRxBuf;t++; //保留指针位置
if(t==RxBuf+LenRxBuf) t=RxBuf; //如果到缓冲区末尾,则返回缓冲区头
if(t==outRxBuf) return; //如果相等,说明缓冲区满了,RxBuf Full
*inRxBuf=SBUF0;
inRxBuf=t;
}
}
/**********************************************************************
** 函数原型: void Printf_Char(u8_t ascii)
** 参数说明: ascii: 发送到串口的ASCII
** 返 回 值: 无
** 说 明: 往串口发送一个字符
************************************************************************/
void Printf_Char(unsigned char ascii)
{
unsigned char *t;
ES0=0;
if(TIflag)
{
TIflag=0;
TI0=1;
}
t=inTxBuf;t++;
if(t==TxBuf+LenTxBuf) t=TxBuf;
if(t==outTxBuf) {ES0=1;return;} //TxBuf Full
*inTxBuf=ascii;
inTxBuf=t;
ES0=1;
}
/**********************************************************************
** 函数原型: void Printf_String(u8_t code *string)
** 参数说明: string: 字符串的起始地址
** 返 回 值: 无
** 说 明: 向串口发送字符串,碰到0x00结束
************************************************************************/
void Printf_String(unsigned char *string)
{
while(*string!=0)
{
Printf_Char(*string);
string++;
}
}
/**********************************************************************
**函数原型: Get_Char()
**参数说明: 无
**返 回 值: temp
**说 明: 从串口缓冲区接收一个字符
************************************************************************/
bit Get_Char(unsigned char xdata *ch)
{
ES0=0;
if(inRxBuf==outRxBuf) {ES0=1;return 0;} //RxBuf Empty
*ch=*outRxBuf; outRxBuf++; //数据被读走,读指针加1
if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf; //如果读指针到缓冲区尾部,则返回到头部
ES0=1;
return 1;
}
/**********************************************************************
**函数原型: process_uart
**入口参数: com_len
**出口参数: 无
**返 回 值: 无
**功能说明: 接收上位机的配置,检测串口有数据,等待一帧数据结束处理
***********************************************************************/
void process_uart()
{
unsigned char dat_len=0;
unsigned char xdata ch;
while(Get_Char(&ch))
{
delayms(2);
combuf[dat_len]=ch;
dat_len++;
if(dat_len==maxlen+1) dat_len=0;
if(dat_len==32) //简单的利用串口长度来确认帧到来
{
if((combuf[30]==0x55)&&(combuf[31]==0xaa))
{
dat_len=0;
process_incmd(); //处理串口接收的配置表
}
else
{
dat_len=0; //不处理
}
}
}
}
/**********************************************************************
**函数原型: process_incmd
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**功能说明: 处理接收的PC命令
***********************************************************************/
void process_incmd()
{
READER_PCS xdata *pcs;
pcs=(READER_PCS xdata *)(combuf);
switch(pcs->pcs_cmd)
{
case PCS_read_READER:
PCS_r_reader(); //pc命令上传读卡机参数
break;
case PCS_read_TAG:
PCS_rw_tag(PCS_read_TAG); //pc命令上传微波卡参数
break;
case PCS_write_READER: //pc命令配置读卡机参数
PCS_w_reader();
break;
case PCS_write_TAG:
PCS_rw_tag(PCS_write_TAG); //pc命令配置微波卡参数
break;
default:
break;
}
}
/**********************************************************************
**函数原型: PCS_r_reader()
**入口参数: none
**出口参数: none
**返 回 值: none
**功能说明: PC命令读基站参数
***********************************************************************/
void PCS_r_reader()
{
uchar i;
READER_PCS xdata *poreader;
poreader=(READER_PCS xdata *)(combuf);
memcpy(combuf+4,MyID,sizeof(MyID));
for(i=0;i<8;i++)
{
if(power==pow[i])
{
poreader->pcs_power=i; //查功率ItemIndex值
break;
}
}
for(i=0;i<8;i++)
{
if(INACTIVITY_TIME==cardouttime[i])
{
poreader->pcs_samecardtime=i; //查相同卡号输出间隔时间ItemIndex值
break;
}
}
for(i=0;i<8;i++)
{
if(RELAY_TIME_IN ==relay_time[i]) //查继电器动作延时时间ItemIndex值
{
poreader->pcs_relaytime=i;
break;
}
}
for(i=0;i<4;i++)
{
if(wiefmt==wie[i]) //查韦根格式ItemIndex值
{
poreader->pcs_wieformat=i;
break;
}
}
for(i=0;i<32;i++)
{
Printf_Char(combuf[i]);
}
BELL_ON;
delayms(1000);
BELL_OFF;
}
/**********************************************************************
**函数原型: tag_r_reader()
**入口参数: none
**出口参数: none
**返 回 值: none
**功能说明: tag reply
***********************************************************************/
void tag_r_reader()
{
uchar i;
memcpy(combuf+2,rxdata+1,26);
for(i=0;i<32;i++)
{
Printf_Char(combuf[i]);
}
BELL_ON;
delayms(1000);
BELL_OFF;
}
/**********************************************************************
**函数原型: PCS_w_reader()
**入口参数: none
**出口参数: none
**返 回 值: none
**功能说明: PC命令写基站参数
***********************************************************************/
void PCS_w_reader()
{
uchar i;
READER_PCS xdata *pcs;
pcs=(READER_PCS xdata *)(combuf);
wiefmt=wie[pcs->pcs_wieformat]; //提取RAM更改参数
power =pow[pcs->pcs_power];
INACTIVITY_TIME=cardouttime[pcs->pcs_samecardtime];
RELAY_TIME_IN =relay_time[pcs->pcs_relaytime];
RELAY_TIME_OUT =relay_time[pcs->pcs_relaytime];
memcpy(MyID,pcs->pcs_readerid,4); //赋值系统ID
pcs->pcs_crc16=cal_crc(combuf,sizeof(READER_PCS)-2); //计算CRC
memcpy(combuf,pcs,sizeof(READER_PCS)); //计算好的参数回COPY内存,结构体不能传递指针
flash_save(combuf,F_ADDR,32); //保存数据至flash;
delayms(100); //重新配置SI芯片
nres=0;
delayms(100);
nres=1;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
combuf[3]= PCS_wr_OK;
for(i=0;i<32;i++)
{
Printf_Char(combuf[i]); //基站参数配置成功
}
BELL_ON;
delayms(1000);
BELL_OFF;
}
/**********************************************************************
**函数原型: PCS_w_tag()
**入口参数: none
**出口参数: none
**返 回 值: none
**功能说明: PC命令上传或者写卡参数
***********************************************************************/
void PCS_rw_tag(uchar cmdm)
{
uchar i;
ULONG idata sum;
UINT result;
CMD_TAG xdata *pct;
READER_PCS xdata *pcs;
pcs=(READER_PCS xdata *)(combuf); //pcs指针指向解析的PC命令帧
pct=(CMD_TAG xdata *)(txdata+4); //pct指针指向发送的命令帧
memcpy(txdata, SiHead, 4); //同步头
pct->data_len=sizeof(CMD_TAG)-1; //数据长度
pct->cmd=cmdm; //命令
memcpy( pct->reader_id,pcs->pcs_readerid,4); //4字节基站
memcpy(pct->tag_id, pcs->pcs_tagid, 6); //6字节卡号
pct->tag_cenfre=pcs->pcs_cenfre; //中心频率
pct->tag_power=pcs->pcs_power; //功率 有效
pct->tag_bud=pcs->pcs_bud; //波特率
pct->tag_flaginout=pcs->pcs_flaginout; //进出标记
pct->tag_tagantitime=pcs->pcs_tagantitime; //anti
pct->tag_tagchgflagtine=pcs->pcs_tagchgflagtine; //chgtime
for(i=0;i<8;i++)
{
pct->tag_buf[i]=0; //预留补0
}
pct->skey[0]=0xff; //处理密钥
pct->skey[1]=0xff;
pct->skey[2]=0xff;
pct->skey[3]=0xff;
sum = (ULONG)cksum(txdata+4,sizeof(CMD_TAG)-2-1); //从长度开始算SUM
result = (UINT)(sum + (sum >> 16));
pct->crc=result;
for(i=0;i<10;i++)
{
txregframe(sizeof(CMD_TAG));
delayms(50);
}
}
/**********************************************************************
**函数原型: Hex2Asc
**入口参数: *chrDest *Hex Len
**出口参数: 无
**返 回 值: 无
**功能说明: 十六进制转字符
***********************************************************************/
/*
void Hex2Asc(unsigned char *chrDest,const unsigned char *Hex,unsigned int Len)
{
unsigned char *ASC = chrDest ;
unsigned int i,n1,n2;
unsigned char chrTmp[] = "0123456789ABCDEF";
for (i = 0;i < Len;i++)
{
n1 = ((*(Hex+i)) >> 4) & 0x0F ;
*(ASC+i * 2) = *(chrTmp+n1) ;
n2 = (*(Hex+i)) & 0x0F ;
*(ASC+i * 2 + 1) = *(chrTmp+n2);
}
ASC[i * 2] = '\0';
return ;
}
*/
/****************************@end@*************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -