Created
October 30, 2019 14:01
-
-
Save pilotak/c45fd1f6df42e56895f6139e64703c02 to your computer and use it in GitHub Desktop.
Mbed DMA serial receive unknown length of data
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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