@@ -255,11 +255,6 @@ STATIC void pack(mp_obj_t obj, msgpack_stream_t *s, mp_obj_t default_handler) {
255
255
mp_buffer_info_t bufinfo ;
256
256
mp_get_buffer_raise (ext -> data , & bufinfo , MP_BUFFER_READ );
257
257
pack_ext (s , ext -> code , bufinfo .buf , bufinfo .len );
258
- } else if (MP_OBJ_IS_TYPE (obj , & mp_type_bytes )) {
259
- // bytes
260
- mp_buffer_info_t bufinfo ;
261
- mp_get_buffer_raise (obj , & bufinfo , MP_BUFFER_READ );
262
- pack_bin (s , bufinfo .buf , bufinfo .len );
263
258
} else if (MP_OBJ_IS_TYPE (obj , & mp_type_tuple )) {
264
259
// tuple
265
260
mp_obj_tuple_t * self = MP_OBJ_TO_PTR (obj );
@@ -297,7 +292,11 @@ STATIC void pack(mp_obj_t obj, msgpack_stream_t *s, mp_obj_t default_handler) {
297
292
} else if (obj == mp_const_true ) {
298
293
write1 (s , 0xc3 );
299
294
} else {
300
- if (default_handler != mp_const_none ) {
295
+ mp_buffer_info_t bufinfo ;
296
+ if (mp_get_buffer (obj , & bufinfo , MP_BUFFER_READ )) {
297
+ // bytes (bin type)
298
+ pack_bin (s , bufinfo .buf , bufinfo .len );
299
+ } else if (default_handler != mp_const_none ) {
301
300
// set default_handler to mp_const_none to avoid infinite recursion
302
301
// this also precludes some valid outputs
303
302
pack (mp_call_function_1 (default_handler , obj ), s , mp_const_none );
@@ -332,7 +331,15 @@ STATIC mp_obj_t unpack_bytes(msgpack_stream_t *s, size_t size) {
332
331
vstr_t vstr ;
333
332
vstr_init_len (& vstr , size );
334
333
byte * p = (byte * )vstr .buf ;
335
- read (s , p , size );
334
+ // read in chunks: (some drivers - e.g. UART) limit the
335
+ // maximum number of bytes that can be read at once
336
+ // read(s, p, size);
337
+ while (size > 0 ) {
338
+ int n = size > 256 ? 256 : size ;
339
+ read (s , p , n );
340
+ size -= n ;
341
+ p += n ;
342
+ }
336
343
return mp_obj_new_str_from_vstr (& mp_type_bytes , & vstr );
337
344
}
338
345
0 commit comments