📄 104sl.c
字号:
break;
case U_STOPDTCON:
break;
case U_TESTFRACT:
S104SendCtrlFrame(Port, U_TESTFRCON);
break;
case U_TESTFRCON:
break;
default:
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104ProcPeerNoAckNum() */
/*函数功能:处理对方确认 */
/*输入说明:接受序列号 */
/*------------------------------------------------------------------*/
BOOL S104ProcPeerNoAckNum(INT8U Port, INT16U PeerNR)
{
INT8U i, j;
INT16U tmp, num;
char err[60];
i = Port - NET1;
if (PeerNR <= ComLink[i]->NS)
num = ComLink[i]->NS - PeerNR;
else
num = 32767 + ComLink[i]->NS - PeerNR;
if (num > ComLink[i]->PeerNoAckNum)
{
//ceshi
sprintf(err, "%04x; %04x; %04x; %04x 序列号确认错误", PeerNR, ComLink[i]->NS, ComLink[i]->PeerNoAckNum, num);
ErrorInfo(OSPrioCur, err);
return (FALSE);
}
for (j=0, tmp=0; j<ComLink[i]->PeerNoAckNum-num; j++)
{
if (ComLink[i]->DataType[j])
tmp++;
}
for (j=0; j<num; j++)
{
ComLink[i]->Tick.TValue1[j] = ComLink[i]->Tick.TValue1[num+j];
ComLink[i]->DataType[j] = ComLink[i]->DataType[num+j];
}
for (j=num; j<K; j++)
{
ComLink[i]->Tick.TValue1[j] = 0;
ComLink[i]->DataType[j] = 0;
}
ComLink[i]->PeerNoAckNum = num;
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:S104SendCtrlFrame() */
/*函数功能:发送链路层数据数据,包括S和U格式 */
/*输入说明:控制域类型 */
/*------------------------------------------------------------------*/
void S104SendCtrlFrame(INT8U Port, INT8U Type)
{
INT8U i;
struct PAPCI *pFrame;
i = Port - NET1;
pFrame = (struct PAPCI*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
pFrame->StartCode = STARTCODE;
pFrame->Length = 0x04;
pFrame->NS = Type;
if (Type == S_FRAME)
{
pFrame->NR = ComLink[i]->NR<<1;
S104StopTick(Port, 2);
}
else
{
pFrame->NR = 0x00;
if ((Type == U_STARTDTACT) || (Type == U_TESTFRACT))
{
S104BeginTick(Port, 1);
}
else
{
S104BeginTick(Port, 3);
}
}
ComLink[i]->TxdTail += 0x06;
ComLink[i]->DataType[ComLink[i]->PeerNoAckNum] = FALSE;
ComLink[i]->PeerNoAckNum++;
//发送
S104SendDataToMISI(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:S104DLSendProc() */
/*函数功能:链路层发送处理 */
/*------------------------------------------------------------------*/
void S104DLSendProc(INT8U Port, INT8U* pData, INT8U Len)
{
INT8U i;
struct PAPCI *pFrame;
i = Port - NET1;
pFrame = (struct PAPCI*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
if (Len == 0)
return;
pFrame->StartCode = STARTCODE;
pFrame->Length = Len + 0x04;
pFrame->NS = ComLink[i]->NS<<1;
pFrame->NR = ComLink[i]->NR<<1;
memcpy((INT8U*)(pFrame+1), pData, Len);
ComLink[i]->TxdTail += Len + 0x06;
ComLink[i]->DataType[ComLink[i]->PeerNoAckNum] = TRUE;
ComLink[i]->PeerNoAckNum++;
ComLink[i]->NS++;
//发送
S104StopTick(Port, 2);
S104BeginTick(Port, 3);
S104SendDataToMISI(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:S104BeginTick() */
/*函数功能:启动定时器 */
/*输入说明:No:定时器号 */
/*------------------------------------------------------------------*/
void S104BeginTick(INT8U Port, INT8U No)
{
INT8U i, j;
i = Port - NET1;
switch (No)
{
case 0:
ComLink[i]->Tick.TValue0 = 0;
ComLink[i]->Tick.Flag |= TICKT0USE;
break;
case 1:
for (j=0; j<K; j++)
{
ComLink[i]->Tick.TValue1[j] = 0;
}
ComLink[i]->Tick.Flag |= TICKT1USE;
break;
case 2:
ComLink[i]->Tick.TValue2 = 0;
ComLink[i]->Tick.Flag |= TICKT2USE;
break;
case 3:
ComLink[i]->Tick.TValue3 = 0;
ComLink[i]->Tick.Flag |= TICKT3USE;
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104StopTick() */
/*函数功能:停止定时器 */
/*输入说明:No:定时器号 */
/*------------------------------------------------------------------*/
void S104StopTick(INT8U Port, INT8U No)
{
INT8U i;
i = Port - NET1;
switch (No)
{
case 0:
ComLink[i]->Tick.Flag &= (~TICKT0USE);
break;
case 1:
ComLink[i]->Tick.Flag &= (~TICKT1USE);
break;
case 2:
ComLink[i]->Tick.Flag &= (~TICKT2USE);
break;
case 3:
ComLink[i]->Tick.Flag &= (~TICKT3USE);
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104StopDT() */
/*函数功能:停止数据传输,关闭TCP连接 */
/*------------------------------------------------------------------*/
void S104StopDT(INT8U Port)
{
INT32U tmp;
struct AppMsg msg;
if (Port == NET1)
tmp = SCK0;
else
tmp = SCK1;
msg.Cmd = DL_NOWORK;
msg.ConNum = 0;
msg.pData = NULL;
msg.Len = 0;
S104AppProc(Port, &msg);
//复位网口
at91_pio_write (&PIO_DESC, tmp, PIO_SET_OUT);
OSTimeDlyHMSM(0, 0, 0, 50);
at91_pio_write (&PIO_DESC, tmp, PIO_CLEAR_OUT);
OSTimeDlyHMSM(0, 0, 0, 50);
at91_pio_write (&PIO_DESC, tmp, PIO_SET_OUT);
}
/*------------------------------------------------------------------*/
/*函数名称:S104RecMISIData() */
/*函数功能:接收MISI数据 */
/*------------------------------------------------------------------*/
void S104RecMISIData(INT8U Port, BOOL Flag)
{
INT16U i, count;
i = Port - NET1;
count = Readx((INT8U *)&ComLink[i]->RxdBuf[ComLink[i]->RxdTail], APDULEN, i+1);
lseek(i+1, count);
if (Flag)
{
ComLink[i]->RxdTail += count;
ComLink[i]->RxdLength += count;
}
S104SearchFrame(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:S104SendDataToMISI() */
/*函数功能:发送数据 */
/*------------------------------------------------------------------*/
void S104SendDataToMISI(INT8U Port)
{
INT16U i, count, num;
i = Port - NET1;
ComLink[i]->IdleTimeCount = 0;
if (ComLink[i]->TxdHead >= ComLink[i]->TxdTail)
return ;
num = ComLink[i]->TxdTail - ComLink[i]->TxdHead;
count = WriteX((INT8U *)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead], num, i+1);
ComLink[i]->TxdHead += count;
if (ComLink[i]->TxdHead >= ComLink[i]->TxdTail)
{
ComLink[i]->TxdTail = 0;
ComLink[i]->TxdHead = 0;
}
}
/*------------------------------------------------------------------*/
/*函数名称:S104NetTest() */
/*函数功能:网络连接判断 */
/*------------------------------------------------------------------*/
void S104NetTest(INT8U Port)
{
#ifdef DF9311_NET
INT8U i;
char err[60];
struct SysTime_t SystemTime;
i = Port - NET1;
if (!LinkState(i))
{
if (ComLink[i]->Connect)
{
GetTime((void *)&SystemTime, SYSTIME);
sprintf(err, "%04d-%02d-%02d %02d:%02d:%02d:%03d 网络连接中断...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond);
ErrorInfo(OSPrioCur, err);
}
S104InitReset(Port);
ComLink[i]->Connect = FALSE;
ComApp[i]->Connect = FALSE;
}
else if (!ComLink[i]->Connect)
{
GetTime((void *)&SystemTime, SYSTIME);
sprintf(err, "%04d-%02d-%02d %02d:%02d:%02d:%03d 网络连接成功...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond);
ErrorInfo(OSPrioCur, err);
S104InitReset(Port);
ComLink[i]->Connect = TRUE;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -