diff --git a/py/binary.c b/py/binary.c
index cec23744600fedc18685d614690cb40cd3d62407..833d9c85ad2e0b3cfe2f456e4291a84aae73e104 100644
--- a/py/binary.c
+++ b/py/binary.c
@@ -26,6 +26,7 @@
 
 #include <stdint.h>
 #include <stdlib.h>
+#include <string.h>
 #include <assert.h>
 
 #include "misc.h"
@@ -75,7 +76,7 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
                 case 'q': case 'Q':
                     // TODO: This is for x86
                     align = sizeof(int); size = sizeof(long long); break;
-                case 'P': case 'O':
+                case 'P': case 'O': case 'S':
                     align = size = sizeof(void*); break;
             }
         }
@@ -161,6 +162,8 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) {
     *ptr += size;
     if (val_type == 'O') {
         return (mp_obj_t)val;
+    } else if (val_type == 'S') {
+        return mp_obj_new_str((char*)val, strlen((char*)val), false);
     } else if (is_signed(val_type)) {
         return mp_obj_new_int(val);
     } else {
diff --git a/py/modstruct.c b/py/modstruct.c
index 39571e3efaf3177ab33641091ea2a3e544f811a5..a45181852cf5e786662afca227f2a414334a23f2 100644
--- a/py/modstruct.c
+++ b/py/modstruct.c
@@ -39,6 +39,22 @@
 
 #if MICROPY_PY_STRUCT
 
+/*
+    This module implements most of character typecodes from CPython, with
+    some extensions:
+
+    O - (Pointer to) an arbitrary Python object. This is useful for callback
+        data, etc. Note that you must keep reference to passed object in
+        your Python application, otherwise it may be garbage-collected,
+        and then when you get back this value from callback it may be
+        invalid (and lead to crash).
+    S - Pointer to a string (returned as a Python string). Note the
+        difference from "Ns", - the latter says "in this place of structure
+        is character data of up to N bytes length", while "S" means
+        "in this place of a structure is a pointer to zero-terminated
+        character data".
+ */
+
 STATIC char get_fmt_type(const char **fmt) {
     char t = **fmt;
     switch (t) {