Fixed issue #426: SDO Client block transfer has incorrect handling of early server acknowledgments.
This commit is contained in:
parent
32d6106047
commit
e79a364983
1 changed files with 7 additions and 0 deletions
|
|
@ -787,11 +787,18 @@ CO_SDO_return_t CO_SDOclientDownload(CO_SDOclient_t *SDO_C,
|
|||
if (SDO_C->CANrxData[0] == 0xA2) {
|
||||
/* check number of segments */
|
||||
if (SDO_C->CANrxData[1] < SDO_C->block_seqno) {
|
||||
size_t size_before, size_after;
|
||||
/* NOT all segments transferred successfully.
|
||||
* Re-transmit data after erroneous segment. */
|
||||
size_before = CO_fifo_altGetOccupied(&SDO_C->bufFifo);
|
||||
/* Change alt read pointer after the last successfully
|
||||
* transmitted data byte (put it back). */
|
||||
CO_fifo_altBegin(&SDO_C->bufFifo,
|
||||
(size_t)SDO_C->CANrxData[1] * 7);
|
||||
size_after = CO_fifo_altGetOccupied(&SDO_C->bufFifo);
|
||||
SDO_C->finished = false;
|
||||
/* Make correction of data size actually transferred */
|
||||
SDO_C->sizeTran -= size_after - size_before;
|
||||
}
|
||||
else if (SDO_C->CANrxData[1] > SDO_C->block_seqno) {
|
||||
/* something strange from server, break transmission */
|
||||
|
|
|
|||
Loading…
Reference in a new issue