V2.04 支持新的can帧协议,解决上报数据丢失的问题
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user