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) {
|
if (SDO_C->CANrxData[0] == 0xA2) {
|
||||||
/* check number of segments */
|
/* check number of segments */
|
||||||
if (SDO_C->CANrxData[1] < SDO_C->block_seqno) {
|
if (SDO_C->CANrxData[1] < SDO_C->block_seqno) {
|
||||||
|
size_t size_before, size_after;
|
||||||
/* NOT all segments transferred successfully.
|
/* NOT all segments transferred successfully.
|
||||||
* Re-transmit data after erroneous segment. */
|
* 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,
|
CO_fifo_altBegin(&SDO_C->bufFifo,
|
||||||
(size_t)SDO_C->CANrxData[1] * 7);
|
(size_t)SDO_C->CANrxData[1] * 7);
|
||||||
|
size_after = CO_fifo_altGetOccupied(&SDO_C->bufFifo);
|
||||||
SDO_C->finished = false;
|
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) {
|
else if (SDO_C->CANrxData[1] > SDO_C->block_seqno) {
|
||||||
/* something strange from server, break transmission */
|
/* something strange from server, break transmission */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue