📄 pronet.c
字号:
#include "config.h"
#include "global.h"
UINT8 ReceiveAck(UINT32 SendL)
{
//UINT32 i = 100000;//0; //50000
UINT32 i;
i = (4+SendL/8)*10000; //数据包长度增加8个字节,延迟时间增加1毫秒
while(i>0){
if(AckArrived)
return true;
i--;
}
return false;
}
//收到一个包的最后一帧信息时,返回应答。
void SendAckPacket(eCANNUM CanNum)
{
UINT32 status = 0;
//查询应答帧的填充方法
CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; //优先级
CTbuf.TxFrameInfo.Bits.FF_BIT = 1; //帧格式
CTbuf.TxFrameInfo.Bits.RTR_BIT = 1; //帧类型:远程帧
CTbuf.TxFrameInfo.Bits.DLC_BIT = 0; //数据长度
CTbuf.TxCANID.Word = CRBuf.RxCANID.Word & 0x1FFEFFFF; //把第16bit置0
status = CANSendData(CanNum, 0x01,&CTbuf);
}
void SendBeginPacket()
{
UINT32 status = 0;
//查询应答帧的填充方法
CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; //优先级
CTbuf.TxFrameInfo.Bits.FF_BIT = 1; //帧格式
CTbuf.TxFrameInfo.Bits.RTR_BIT = 1; //帧类型:远程帧
CTbuf.TxFrameInfo.Bits.DLC_BIT = 0; //数据长度
CTbuf.TxCANID.Word = 0x1FFEF000; //把第16bit置0
status = CANSendData(0, 0x01,&CTbuf);
}
void SendEndPacket()
{
UINT32 status = 0;
//查询应答帧的填充方法
CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; //优先级
CTbuf.TxFrameInfo.Bits.FF_BIT = 1; //帧格式
CTbuf.TxFrameInfo.Bits.RTR_BIT = 1; //帧类型:远程帧
CTbuf.TxFrameInfo.Bits.DLC_BIT = 0; //数据长度
CTbuf.TxCANID.Word = 0x1FFEFFFF; //把第16bit置0
status = CANSendData(0, 0x01,&CTbuf);
}
//把缓冲sCommSnd中的内容全部从chan中发送出去
//帧ID = packet_ID + idx
static void Packet2Chan(eCANNUM chan,UINT16 packet_ID)
{
UINT16 idx = 0; //步长8递增,0,8,16,...
UINT32 status = 0;
do
{
CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; //优先级
CTbuf.TxFrameInfo.Bits.FF_BIT = 1; //帧格式
CTbuf.TxFrameInfo.Bits.RTR_BIT = 0; //帧类型
CTbuf.TxFrameInfo.Bits.DLC_BIT = 8; //数据长度
//frame ID
*((UINT16 *)&CTbuf.TxCANID.Word ) = idx;
*((UINT16 *)&CTbuf.TxCANID.Word + 1) = packet_ID;
//数据区
memcpy((UINT8 *)&CTbuf.CANTDA,&sCommSnd[idx],4);
memcpy((UINT8 *)&CTbuf.CANTDB,&sCommSnd[idx+4],4);
idx += 8;
status = CANSendData(chan, 0x01,&CTbuf);
//DelayNS(1);
Delay(10000); //延长时间,与具体硬件有关系
}while(pstcPacket->packetLen > idx) ;
pstcPacket->packetLen = 0;
}
UINT8 SendPacket(UINT16 ID, UINT8 *sCommand,UINT16 packetLen) //packetLen 是sCommand的长度加上5
{
UINT16 SendLen; //实际发送的长度,8的整数倍。
pstcPacket = (stcPacket *)sCommSnd;
pstcPacket->packetID = ID;
pstcPacket->packetLen = packetLen+5;
memcpy(sCommSnd+4,sCommand,packetLen);
sCommSnd[ pstcPacket->packetLen-1] = 0xFF; //CRC, 需要计算
//先把sCommSnd的长度补充成8 的整数倍。
SendLen = packetLen+5;
while(SendLen % 8!=0)
{
sCommSnd[SendLen++] = 0x00;
}
if(ChanFlag == 1) // 0 通
{
chan = 0;
Bal += SendLen;
if(Bal > 80) //3100
{
Bal = 0;
ChanFlag = 3; //双通
}
}
else if(ChanFlag == 2) // 1 通
{
chan = 1;
Bal -= SendLen;
if(Bal < -80) //3100
{
Bal = -1;
ChanFlag = 3; //双通
}
}
else // 都不通 或者 都通
{
if(Bal < 0)
{
chan = 0;
Bal += SendLen;
}
else
{
chan = 1;
Bal -= SendLen;
}
ChanFlag = 3;
}
CurrentSndPacketID = ID;
AckArrived = 0;
Packet2Chan(chan,ID);
if(ReceiveAck(SendLen))
return true;
else
{
ChanFlag &= ~ (chan+1); //chan = 1,2 ChanFlag = 1,2,3
return false;
}
}
void CanDataToNetApp(eCANNUM CanNum)
{
UINT8 i;
if(*((UINT16 *)&CRBuf.RxCANID.Word ) == 0 ){ //是一包的首帧第三四字节是包的长度,记录下来
CurrentRcvPacketLen = *((UINT8 *)&CRBuf.CANRDA+2)+ (*((UINT8 *)&CRBuf.CANRDA+3)<<8);
CurrentRcvPacketID = *((UINT16 *)&CRBuf.RxCANID.Word + 1);
LockedFlag = 1;
}
for(i=0;i<4;i++)
{
sCommRcv[TransCounter+i]=*((UINT8 *)&CRBuf.CANRDA+i);
}
for(i=0;i<4;i++)
{
sCommRcv[TransCounter+4+i]=*((UINT8 *)&CRBuf.CANRDB+i);
}
TransCounter += 8;
pID = *((UINT16 *)&CRBuf.RxCANID.Word );
if((CurrentRcvPacketLen - pID)<=8) //packelen - idx ==8 说明是末帧
NetAppSendFlag = 1;
if(NetAppSendFlag)
{
SendAckPacket(CanNum);
Uart0Send(CurrentRcvPacketLen-5, sCommRcv+4);
NetAppSendFlag = 0;
TransCounter = 0;
LockedFlag = 0;
CurrentRcvPacketID = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -