📄
字号:
微芯的J1939协议栈,是学习地址声明的好代码
比较NAME函数有一个BUG,就是比较时的顺序有问题,应该反过来
signed char CompareName( unsigned char *OtherName )
{
unsigned char i;
for (i = 0; (i<J1939_DATA_LENGTH) && (OtherName[i] == CA_Name[i]); i++);
if (i == J1939_DATA_LENGTH)
return 0;
else if (CA_Name[i] < OtherName[i] )
return -1;
else
return 1;
}
static void J1939_AddressClaimHandling( unsigned char Mode )
{
OneMessage.Priority = J1939_CONTROL_PRIORITY;
OneMessage.PDUFormat = J1939_PF_ADDRESS_CLAIMED;
OneMessage.DestinationAddress = J1939_GLOBAL_ADDRESS;
OneMessage.DataLength = J1939_DATA_LENGTH;
if (Mode == ADDRESS_CLAIM_TX)
goto SendAddressClaim;
if (OneMessage.SourceAddress != J1939_Address)
return;
if (CompareName( OneMessage.Data ) != -1) // Our CA_Name is not less
{
#if J1939_ARBITRARY_ADDRESS != 0x00
//当地址不能被声明的时候,重新计算一下地址,可以在里面乱写一通,然后重新声明地址
if (CA_RecalculateAddress( &CommandedAddress ))
goto SendAddressClaim;
#endif
// Send Cannot Claim Address message
CopyName();
OneMessage.SourceAddress = J1939_NULL_ADDRESS;
SET_NETWORK_WINDOW_BITS;
SendOneMessage( (J1939_MESSAGE *) &OneMessage );
// Set up filter to receive messages sent to the global address
SetAddressFilter( J1939_GLOBAL_ADDRESS );
J1939_Flags.CannotClaimAddress = 1;
J1939_Flags.WaitingForAddressClaimContention = 0;
return;
}
SendAddressClaim:
CopyName();
OneMessage.SourceAddress = CommandedAddress;
SET_NETWORK_WINDOW_BITS;
SendOneMessage( (J1939_MESSAGE *) &OneMessage );
if (((CommandedAddress & 0x80) == 0) || // Addresses 0-127
((CommandedAddress & 0xF8) == 0xF8)) // Addresses 248-253 (254,255 illegal)
{
J1939_Flags.CannotClaimAddress = 0;
J1939_Address = CommandedAddress;
// Set up filter to receive messages sent to this address
SetAddressFilter( J1939_Address );
}
else
{
// We don't have a proprietary address, so we need to wait.
J1939_Flags.WaitingForAddressClaimContention = 1;
ContentionWaitTime = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -