📄 dlcrecv.c
字号:
/****************************************************************
** *
** FILE : DLCRecv.C *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : CCH 2002.11.26 *
****************************************************************/
#define SRC_DLCRECV
#include "includes.h"
#include "bsp.h"
#include "timetask.h"
#include "crc.h"
#include "dlcs.h"
#include "dlcrecv.h"
#include "hardware.h"
#include "ZPrint.h"
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define PERIOD_SCAN MILTICK, 1 /* PERIOD_SCAN = 1 tick */
#define PERIOD_MONITOR SECOND, 3 /* PERIOD_MONITOR = 3 seconds */
/*
********************************************************************************
* DEFINE Receive step
********************************************************************************
*/
#define STEP_RECV_FLAG_S -5 /* recv flag (start) */
#define STEP_RECV_ADDR -4 /* recv addr */
#define STEP_RECV_TYPE -3 /* recv type */
#define STEP_RECV_LEN_L -2 /* recv len (low byte) */
#define STEP_RECV_LEN_H -1 /* recv len (high byte) */
#define STEP_RECV_FLAG_E -6 /* recv flag (end) */
#define STEP_RECV_FLAG_ERR -7 /* recv flag (when crc error) */
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static TMR_TSK *monitortmr, *scantmr;
static void MonitorTmrProc(void)
{
#if DEBUG_DLC_STATUS > 0
PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC timer overflow>\n");
#endif
ResetDLCRecv();
StopTmr(monitortmr);
}
static void ScanTmrProc(void)
{
INT8S dlci;
INT16S ch;
INT16U temp;
#if DEBUG_DLC_IO > 0
BOOLEAN firstread;
#endif
StartTmr(scantmr, PERIOD_SCAN);
if ((dlci = GetShieldedDLC()) != -1) {
#if DEBUG_DLC_IO > 0
firstread = TRUE;
#endif
while((ch = ReadDLCIO()) != -1) {
#if DEBUG_DLC_IO > 0
if (firstread) {
firstread = FALSE;
PrintFromUART(DEBUG_UARTNo_DLC, "\nDLC recv: ");
}
SendFromUART_HEX(DEBUG_UARTNo_DLC, ch);
#endif
WriteDLCRecvRound(dlci, ch);
}
return;
}
#if DEBUG_DLC_IO > 0
firstread = TRUE;
#endif
while((ch = ReadDLCIO()) != -1) {
#if DEBUG_DLC_IO > 0
if (firstread) {
firstread = FALSE;
PrintFromUART(DEBUG_UARTNo_DLC, "\nDLC recv: ");
}
SendFromUART_HEX(DEBUG_UARTNo_DLC, ch);
#endif
switch(DLCRecv.recvlen)
{
case STEP_RECV_FLAG_ERR:
ResetDLCRecv();
break;
case STEP_RECV_FLAG_E: /* receive end flag */
if (ch == DLC_FLAG) {
/* receive one frame success */
HdlDLCRecv(); /* handle DLC receive frame */
}
ResetDLCRecv();
break;
case STEP_RECV_FLAG_S: /* receive start flag */
if (ch == DLC_FLAG) {
InitCrc(&DLCRecv.crc);
DLCRecv.recvlen = STEP_RECV_ADDR;
StartTmr(monitortmr, PERIOD_MONITOR); /* start monitor timer */
}
break;
case STEP_RECV_ADDR: /* receive address */
if (ch != DLC_FLAG) {
CalcCrcByByte(&DLCRecv.crc, ch);
DLCRecv.addr = ch;
DLCRecv.recvlen = STEP_RECV_TYPE;
}
break;
case STEP_RECV_TYPE: /* receive type */
CalcCrcByByte(&DLCRecv.crc, ch);
DLCRecv.type = ch;
#if GSM_BENQ
DLCRecv.recvlen = 0;
DLCRecv.len = 0xffff;
#else
DLCRecv.recvlen = STEP_RECV_LEN_L;
#endif
break;
case STEP_RECV_LEN_L: /* receive low byte of length */
CalcCrcByByte(&DLCRecv.crc, ch);
if (ch & 0x01) {
DLCRecv.len = ch >> 1;
DLCRecv.recvlen = 0;
} else {
DLCRecv.len = ch;
DLCRecv.recvlen = STEP_RECV_LEN_H;
}
break;
case STEP_RECV_LEN_H: /* receive high byte of length */
CalcCrcByByte(&DLCRecv.crc, ch);
temp = ch;
temp <<= 8;
DLCRecv.len |= temp;
DLCRecv.len >>= 1;
DLCRecv.recvlen = 0;
break;
default:
#if GSM_BENQ
if ((DLC_FLAG == ch)) {
EndCrc(&DLCRecv.crc);
if(DLCRecv.inf[DLCRecv.recvlen-1]==DLCRecv.crc){
DLCRecv.len=DLCRecv.recvlen;
HdlDLCRecv();
ResetDLCRecv();
}else{
#if DEBUG_DLC_STATUS > 0
PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC CRC error>\n");
#endif
ResetDLCRecv();
}
}
#else
if (DLCRecv.recvlen == DLCRecv.len) { /* receive FCS */
EndCrc(&DLCRecv.crc);
if (DLCRecv.crc == ch) { /* check crc */
DLCRecv.recvlen = STEP_RECV_FLAG_E;
} else {
#if DEBUG_DLC_STATUS > 0
PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC CRC error>\n");
#endif
DLCRecv.recvlen = STEP_RECV_FLAG_ERR;
}
}
#endif
else { /* receive information field */
if (DLCRecv.recvlen < sizeof(DLCRecv.inf)) {
DLCRecv.inf[DLCRecv.recvlen++] = ch;
} else {
#if DEBUG_DLC_STATUS > 0
PrintFromUART(DEBUG_UARTNo_DLC, "<sorry, DLC data is too long>\n");
#endif
ResetDLCRecv();
}
}
break;
}
}
}
void ResetDLCRecv(void)
{
DLCRecv.recvlen = STEP_RECV_FLAG_S;
StopTmr(monitortmr);
}
void InitDLCRecv(void)
{
scantmr = CreateTimer(ScanTmrProc, 0);
monitortmr = CreateTimer(MonitorTmrProc, 0);
ResetDLCRecv();
StartTmr(scantmr, PERIOD_SCAN);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -