Browse Source

修复多从机时指令接收超时的BUG

master
zhaohe 2 years ago
parent
commit
14aa923a01
  1. 10
      components/zcancmder/basic.hpp
  2. 45
      components/zcancmder/zcanreceiver_master.cpp
  3. 1
      components/zcancmder/zcanreceiver_master.hpp
  4. 10
      components/zprotocol_helper/micro_computer_module_device_script_cmder_paser.cpp

10
components/zcancmder/basic.hpp

@ -31,10 +31,12 @@ class CanPacketRxBuffer {
uint8_t rxdata[1000] = {0}; uint8_t rxdata[1000] = {0};
int rxdataSize = 0; int rxdataSize = 0;
bool dataIsReady = false;
bool isOnReceive = false;
bool isUsed = false;
bool lostpacket = false;
bool dataIsReady = false;
bool isOnReceive = false;
bool isUsed = false;
bool lostpacket = false;
bool dataIsProcessed = false;
int32_t lastrxtime = 0;
public: public:
uint16_t get_packetindex(); uint16_t get_packetindex();

45
components/zcancmder/zcanreceiver_master.cpp

@ -122,7 +122,7 @@ int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t subModu
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff;
cmdheader->packetType = kptv2_cmd; cmdheader->packetType = kptv2_cmd;
cmdheader->packetindex = generateFreeIndex(); cmdheader->packetindex = generateFreeIndex();
cmdheader->cmdMainId = MODULE_CMDID(cmdid);
cmdheader->cmdMainId = MODULE_CMDID(cmdid);
cmdheader->cmdSubId = CMD_SUB_ID(cmdid); cmdheader->cmdSubId = CMD_SUB_ID(cmdid);
cmdheader->subModuleid = subModuleid; cmdheader->subModuleid = subModuleid;
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid); // ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
@ -170,7 +170,7 @@ int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t subModuleid, int32_t
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff;
cmdheader->packetType = kptv2_cmd; cmdheader->packetType = kptv2_cmd;
cmdheader->packetindex = generateFreeIndex(); cmdheader->packetindex = generateFreeIndex();
cmdheader->cmdMainId = MODULE_CMDID(cmdid);
cmdheader->cmdMainId = MODULE_CMDID(cmdid);
cmdheader->cmdSubId = CMD_SUB_ID(cmdid); cmdheader->cmdSubId = CMD_SUB_ID(cmdid);
cmdheader->subModuleid = subModuleid; cmdheader->subModuleid = subModuleid;
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid); // ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
@ -381,12 +381,18 @@ void ZCanCommnaderMaster::initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t
CanPacketRxBuffer *ZCanCommnaderMaster::allocCanPacketRxBufferInIRQ(uint16_t id) { CanPacketRxBuffer *ZCanCommnaderMaster::allocCanPacketRxBufferInIRQ(uint16_t id) {
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].id == id) {
// 说明当前id的缓存已经存在,但由于丢包数据灭有收集满
if (!m_canPacketRxBuffer[i].dataIsReady) {
initCanPacketRxBuffer(&m_canPacketRxBuffer[i], id);
m_canPacketRxBuffer[i].isUsed = true;
return &m_canPacketRxBuffer[i];
CanPacketRxBuffer *packetbuf = &m_canPacketRxBuffer[i];
if (packetbuf->dataIsReady) {
// 等待等待处理完成后释放
if (packetbuf->dataIsProcessed) packetbuf->isUsed = false;
} else {
// 数据已经开始接收,但超时未处理,回收buffer
if (packetbuf->isUsed && zos_haspassedms(packetbuf->lastrxtime) > 100) {
packetbuf->isUsed = false;
}
// 数据开始接收了,但又收到了0号包,回收buffer
if (packetbuf->isUsed && id == packetbuf->id) {
packetbuf->isUsed = false;
} }
} }
} }
@ -408,14 +414,6 @@ CanPacketRxBuffer *ZCanCommnaderMaster::findCanPacketRxBufferInIRQ(uint16_t id)
} }
return nullptr; return nullptr;
} }
void ZCanCommnaderMaster::freeCanPacketRxBuffer(uint16_t id) {
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].id == id) {
m_canPacketRxBuffer[i].isUsed = false;
return;
}
}
}
void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) { void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) {
/** /**
@ -448,7 +446,12 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c
} else { } else {
rxbuf = findCanPacketRxBufferInIRQ(from); rxbuf = findCanPacketRxBufferInIRQ(from);
} }
if (!rxbuf) return;
if (!rxbuf) {
ZLOGE(TAG, "board[%d] packetId[%d] find rx buff fail", from, frameId);
return;
}
rxbuf->lastrxtime = zos_get_tick();
if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) { if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) {
rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader; rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader;
@ -459,7 +462,8 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c
* @brief * @brief
*/ */
if (nframe == frameId + 1) { if (nframe == frameId + 1) {
rxbuf->dataIsReady = true;
rxbuf->dataIsReady = true;
rxbuf->dataIsProcessed = false;
if ((rxbuf->m_canPacketNum) != rxbuf->m_npacket) rxbuf->lostpacket = true; if ((rxbuf->m_canPacketNum) != rxbuf->m_npacket) rxbuf->lostpacket = true;
} }
} }
@ -484,16 +488,15 @@ void ZCanCommnaderMaster::processReadyPacket(CanPacketRxBuffer *rxbuf) {
} else { } else {
callListener(rxbuf); callListener(rxbuf);
} }
rxbuf->dataIsReady = false;
} }
void ZCanCommnaderMaster::loop() { void ZCanCommnaderMaster::loop() {
/** /**
* @brief MainLoop上下文 * @brief MainLoop上下文
*/ */
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].dataIsReady) {
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].dataIsReady && !m_canPacketRxBuffer[i].dataIsProcessed) {
processReadyPacket(&m_canPacketRxBuffer[i]); processReadyPacket(&m_canPacketRxBuffer[i]);
m_canPacketRxBuffer[i].dataIsProcessed = true;
} }
} }
} }

1
components/zcancmder/zcanreceiver_master.hpp

@ -97,7 +97,6 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
void initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t id); void initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t id);
CanPacketRxBuffer *allocCanPacketRxBufferInIRQ(uint16_t id); CanPacketRxBuffer *allocCanPacketRxBufferInIRQ(uint16_t id);
CanPacketRxBuffer *findCanPacketRxBufferInIRQ(uint16_t id); CanPacketRxBuffer *findCanPacketRxBufferInIRQ(uint16_t id);
void freeCanPacketRxBuffer(uint16_t id);
void processReadyPacket(CanPacketRxBuffer *buf); void processReadyPacket(CanPacketRxBuffer *buf);
}; };

10
components/zprotocol_helper/micro_computer_module_device_script_cmder_paser.cpp

@ -460,8 +460,14 @@ void MicroComputerModuleDeviceScriptCmderPaser::do_wait_for_module(int32_t modul
* @brief * @brief
*/ */
i++; i++;
if (i % 10 == 0) ZLOGI(TAG, "wait for module %d %d", moduleid, status);
thisThread.sleep(30);
if (i % 10 == 0) {
if (ack->ecode == 0) {
ZLOGI(TAG, "wait for module %d %d", moduleid, status);
} else {
ZLOGI(TAG, "wait for module %d err: %s(%d)", moduleid, err::error2str(ack->ecode), ack->ecode);
}
}
thisThread.sleep(100);
} }
} }

Loading…
Cancel
Save