⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 微芯的J1939协议栈,是学习地址声明的好代码
💻
字号:
微芯的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 + -