V2.04 支持新的can帧协议,解决上报数据丢失的问题

This commit is contained in:
ranchuan
2024-01-08 18:02:07 +08:00
parent b76c04d072
commit 84bbe6ed3e
5 changed files with 52 additions and 19 deletions

View File

@@ -10,6 +10,8 @@
#define QT_NO_DEBUG_OUTPUT
typedef struct
{
uint32_t Reserve1 : 3;
@@ -20,12 +22,26 @@ typedef struct
uint32_t FunClass : 6;
uint32_t SegFlag : 2;
uint32_t SegNum : 8;
} YeCanID_st_old;
typedef struct
{
uint32_t SegNum : 8;
uint32_t Reserve0 : 2;
uint32_t ACK : 1;
uint32_t FunClass : 6;
uint32_t SegFlag : 2;
uint32_t destMACID : 5;
uint32_t srcMACID : 5;
uint32_t Reserve1 : 3;
} YeCanID_st;
typedef union
{
uint32_t Exide;
YeCanID_st yecanid;
YeCanID_st_old yecanid_old;
} YeCanID_un;
can_slave::can_slave()
@@ -173,10 +189,21 @@ void can_host::recv_data_cb()
if (frame_id.Exide == 0x000000)
return;
QByteArray payload = frame.payload();
uint8_t slave_addr = frame_id.yecanid.srcMACID;
uint8_t dst_addr = frame_id.yecanid.destMACID;
uint8_t seg_flag = frame_id.yecanid.SegFlag;
int seg_num = frame_id.yecanid.SegNum;
uint8_t slave_addr;
uint8_t dst_addr;
uint8_t seg_flag;
int seg_num;
if(frame_id.yecanid.Reserve0==0){
slave_addr = frame_id.yecanid_old.srcMACID;
dst_addr = frame_id.yecanid_old.destMACID;
seg_flag = frame_id.yecanid_old.SegFlag;
seg_num = frame_id.yecanid_old.SegNum;
}else{
slave_addr = frame_id.yecanid.srcMACID;
dst_addr = frame_id.yecanid.destMACID;
seg_flag = frame_id.yecanid.SegFlag;
seg_num = frame_id.yecanid.SegNum;
}
can_slave &slave = get_slave_by_addr(slave_addr);
if (seg_flag == 0x00){
// 不分段
@@ -249,17 +276,18 @@ void can_host::append(uint8_t addr, uint8_t fun_class, QByteArray data)
{
YeCanID_un frameId;
frameId.Exide = 0;
frameId.yecanid.destMACID = addr;
frameId.yecanid.srcMACID = 0;
frameId.yecanid.FunClass = fun_class;
frameId.yecanid.SegFlag = 0;
frameId.yecanid.SegNum = 0;
frameId.yecanid_old.destMACID = addr;
frameId.yecanid_old.srcMACID = 0;
frameId.yecanid_old.FunClass = fun_class;
frameId.yecanid_old.SegFlag = 0;
frameId.yecanid_old.SegNum = 0;
// frameId.yecanid.Reserve0=1;// 使用新协议
// 单包发送
if (data.size() <= 8)
{
frameId.yecanid.SegFlag = 0x0;
frameId.yecanid.SegNum = 0;
frameId.yecanid_old.SegFlag = 0x0;
frameId.yecanid_old.SegNum = 0;
QCanBusFrame frame = QCanBusFrame(frameId.Exide, data.left(8));
while (can_->writeFrame(frame) != true)
{
@@ -273,17 +301,17 @@ void can_host::append(uint8_t addr, uint8_t fun_class, QByteArray data)
{
if (i == 0)
{
frameId.yecanid.SegFlag = 0x1;
frameId.yecanid_old.SegFlag = 0x1;
}
else if (data.size() > 8)
{
frameId.yecanid.SegFlag = 0x2;
frameId.yecanid_old.SegFlag = 0x2;
}
else
{
frameId.yecanid.SegFlag = 0x3;
frameId.yecanid_old.SegFlag = 0x3;
}
frameId.yecanid.SegNum = (uint8_t)i;
frameId.yecanid_old.SegNum = (uint8_t)i;
QCanBusFrame frame = QCanBusFrame(frameId.Exide, data.left(8));
while (can_->writeFrame(frame) != true)
{