Browse Source

zcanhost添加重发机制,解决zcan小概率指令下发失败的BUG

master
zhaohe 1 year ago
parent
commit
3cd88d85f2
  1. 1
      src/iflytop/components/zcanreceiver/zcanhost.cpp
  2. 15
      src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp
  3. 2
      src/iflytop/components/zcanreceiver/zcanreceiverhost.hpp

1
src/iflytop/components/zcanreceiver/zcanhost.cpp

@ -461,6 +461,7 @@ int32_t ZCanHost::hpp272_read_c1000(int sensorid, hpp272_data_t& value) {
return 0;
}
int32_t ZCanHost::call(int32_t cmdid, int32_t* val0, int32_t nval, int32_t* ack, int32_t* acknum) {
shared_ptr<ZCanReceiverCMD> cmd = make_shared<ZCanReceiverCMD>();
cmd->cmdid = cmdid;

15
src/iflytop/components/zcanreceiver/zcanreceiverhost.cpp

@ -23,6 +23,21 @@ void ZCanReceiverHost::registerListener(onpacket_t onpacket) { m_onpacket = onpa
void ZCanReceiverHost::registerReportMsgListener(onreport_t onpacket) { m_onReportPacket = onpacket; }
shared_ptr<ZCanReceiverCMD> ZCanReceiverHost::sendcmdblock(shared_ptr<ZCanReceiverCMD> cmd, int overtime_ms) { //
/**
* @brief 3
*/
for (int i = 0; i < 3; i++) {
auto rx = _sendcmdblock(cmd, overtime_ms);
if (rx) {
return rx;
}
}
return nullptr;
}
shared_ptr<ZCanReceiverCMD> ZCanReceiverHost::_sendcmdblock(shared_ptr<ZCanReceiverCMD> cmd, int overtime_ms) { //
lock_guard<mutex> lock(m_txblocklock);
// 加这个延时是因为,曾经出现一个BUG,当发送一条指令成功后,立马下发第二条指令,第二条指令会发送失败,原因未知
usleep(10 * 1000);

2
src/iflytop/components/zcanreceiver/zcanreceiverhost.hpp

@ -83,6 +83,8 @@ class ZCanReceiverHost {
shared_ptr<ZCanReceiverCMD> sendcmdblock(shared_ptr<ZCanReceiverCMD> cmd, int overtime_ms);
private:
shared_ptr<ZCanReceiverCMD> _sendcmdblock(shared_ptr<ZCanReceiverCMD> cmd, int overtime_ms);
void processRx(shared_ptr<SocketCanFrame> frame);
void processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len);
void resetSocketCan();

Loading…
Cancel
Save