The Makecode editor radio blocks add some additional binary information at the start of the radio message. When received by Python, this binary data can cause your program to crash.
To fix this, you need to step over the first 12 bytes of any radio message transmitted bythe Makecode editor, in order to get at the data inside the message.
This Python module provides an easy way to integrate MakeCode and Python radio https://github.com/rhubarbdog/microbit-radio
Byte 3 is the payload type as follows:
// payload: number (9 ... 12) #define PACKET_TYPE_NUMBER 0 // payload: number (9 ... 12), name length (13), name (14 ... 26) #define PACKET_TYPE_VALUE 1 // payload: string length (9), string (10 ... 28) #define PACKET_TYPE_STRING 2
The below Makecode editor code transmits the message 'DALEK' every second, and can be used to test the below Python code with.
basic.forever(() => { radio.sendString("DALEK") basic.showLeds(` . # . . . # # # # # # # . . . # # # # . # # # . . `) basic.pause(500) basic.clearScreen() basic.pause(500) }) radio.setGroup(123)
The following code, written in MicroPython, will receive any string message that the above the Makecode editor program transmits on radio group 123 and then scroll the text message on the screen.
from microbit import * import radio radio.config(group=132) radio.on() def get_message(): while True: try: msg = radio.receive_bytes() if msg is not None: if len(msg) >= 13 and msg[3] == 2: lstr = msg[12] # length byte text = str(msg[13:13+lstr], 'ascii') return text except Exception as e: # reset radio on error print("reset %s" % str(e)) radio.off() radio.on() while True: print("waiting...") display.show('?') m = get_message() print('got message:', m) display.scroll(m)
The radio payload sent from the Makecode editor has the following format:
01 00 01 | 02 | 1E 01 01 00 | 00 00 00 00 | 05 44 41 4C 45 4B --- DAL HEADER 01 raw payload 00 group 0? 01 version 1 -- PXT HEADER 02 type=string 1E 01 01 00 timestamp 00 00 00 00 serial number (disabled) -- PXT DATA 05 length of string 44 41 4C 45 4B DALEK
If you are not too worried about errors, you can use this simplified version
from microbit import * import radio radio.config(group=132) radio.on() while True: display.show('?') text = None while text is None: try: msg = radio.receive_bytes() if msg is not None: text = str(msg[13:], 'ascii') except: display.scroll("ERROR") display.scroll(text)
Further Information
- Great walkthrough availble from community member Barry Byford
- https://github.com/rhubarbdog/microbit-radio
Keywords for search: send text from makecode to python, junk, radio, error, python not receiving radio