Skip to content

Commit 29597ae

Browse files
committed
Fix SDO writes of empty strings.
1 parent ffbd10f commit 29597ae

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

canopen/sdo/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ def open(self, index, subindex=0, mode="rb", encoding="ascii",
215215
raw_stream = BlockDownloadStream(self, index, subindex, size, request_crc_support=request_crc_support)
216216
else:
217217
raw_stream = WritableStream(self, index, subindex, size, force_segment)
218-
if buffering:
218+
if buffering and ((size is None) or size > 0):
219+
# BufferedWriter will omit the write if size is 0 and the expedited SDO will not be sent
220+
# Therefore, skip the BufferedWriter if size is known to be 0
219221
buffered_stream = io.BufferedWriter(raw_stream, buffer_size=buffer_size)
220222
else:
221223
return raw_stream

test/test_sdo.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ def _send_message(self, can_id, data, remote=False):
6868
while self.data and self.data[0][0] == RX:
6969
self.network.notify(0x582, self.data.pop(0)[1], 0.0)
7070

71+
self.message_sent = True
72+
7173
def setUp(self):
7274
network = canopen.Network()
7375
network.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
@@ -76,6 +78,8 @@ def setUp(self):
7678
node.sdo.RESPONSE_TIMEOUT = 0.01
7779
self.network = network
7880

81+
self.message_sent = False
82+
7983
def test_expedited_upload(self):
8084
self.data = [
8185
(TX, b'\x40\x18\x10\x01\x00\x00\x00\x00'),
@@ -91,6 +95,7 @@ def test_expedited_upload(self):
9195
]
9296
trans_type = self.network[2].sdo[0x1400]['Transmission type RPDO 1'].raw
9397
self.assertEqual(trans_type, 254)
98+
self.assertTrue(self.message_sent)
9499

95100
def test_size_not_specified(self):
96101
self.data = [
@@ -100,13 +105,23 @@ def test_size_not_specified(self):
100105
# Make sure the size of the data is 1 byte
101106
data = self.network[2].sdo.upload(0x1400, 2)
102107
self.assertEqual(data, b'\xfe')
108+
self.assertTrue(self.message_sent)
103109

104110
def test_expedited_download(self):
105111
self.data = [
106112
(TX, b'\x2b\x17\x10\x00\xa0\x0f\x00\x00'),
107113
(RX, b'\x60\x17\x10\x00\x00\x00\x00\x00')
108114
]
109115
self.network[2].sdo[0x1017].raw = 4000
116+
self.assertTrue(self.message_sent)
117+
118+
def test_expedited_download_zero_length(self):
119+
self.data = [
120+
(TX, b'\x33\x00\x20\x00\x00\x00\x00\x00'),
121+
(RX, b'\x60\x00\x20\x00\x00\x00\x00\x00')
122+
]
123+
self.network[2].sdo[0x2000].raw = ""
124+
self.assertTrue(self.message_sent)
110125

111126
def test_segmented_upload(self):
112127
self.data = [

0 commit comments

Comments
 (0)