Skip to content

Instantly share code, notes, and snippets.

@pilotak
Created October 30, 2019 14:01
Show Gist options
  • Save pilotak/c45fd1f6df42e56895f6139e64703c02 to your computer and use it in GitHub Desktop.
Save pilotak/c45fd1f6df42e56895f6139e64703c02 to your computer and use it in GitHub Desktop.
Mbed DMA serial receive unknown length of data
#include "mbed.h"
const uint32_t baud = 9600;
uint8_t eQueue_buffer[3 * EVENTS_EVENT_SIZE];
EventQueue eQueue(3 * EVENTS_EVENT_SIZE, eQueue_buffer);
LowPowerTimeout rs232Timeout;
Serial rs232(TX_pin, RX_pin, baud);
uint8_t rs232_buffer[256] = {0}; // make sure it fits your data
uint16_t rs232_buffer_offset = 0;
uint8_t rs232_char = 0;
constexpr const uint16_t char_timeout = (8 + 4 + 1 + 1) * 1000000 /
baud; // 1.5 char (8 + 4 bits) + 1 bit start + 1 bit stop
void rs232SerialCb(int e);
void rs232Attach() {
rs232.read(&rs232_char, 1, event_callback_t(rs232SerialCb), -1);
}
void rs232DoneCb() {
printf("data[%u]: ", rs232_buffer_offset);
for (int i = 0; i < rs232_buffer_offset; ++i) {
printf("%02X ", rs232_buffer[i]);
}
printf("\n");
rs232_buffer_offset = 0;
}
void rs232SerialCb(int e) { // ISR
if (rs232_buffer_offset < sizeof(rs232_buffer)) {
rs232_buffer[rs232_buffer_offset++] = rs232_char;
} else {
rs232_buffer_offset = 0; // prevent buffer overflow
}
rs232Timeout.detach();
rs232Timeout.attach_us(eQueue.event(rs232DoneCb), char_timeout);
eQueue.call(rs232Attach);
}
int main() {
Thread eQueueThread;
eQueueThread.start(callback(&eQueue, &EventQueue::dispatch_forever));
rs232.set_blocking(false);
rs232Attach();
while (1) {
ThisThread::sleep_for(osWaitForever);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment