Code: Select all
char start_string[] = "start";
char stop_string[] = "stop";
static mailbox_t serial_mb;
static msg_t serial_mb_buffer[10];
uint8_t buffer[8];
THD_WORKING_AREA(serial_output_thread_wa, 128);
THD_FUNCTION(serial_output_thread, arg) {
(void)arg;
chRegSetThreadName("Uart Comm Thread");
chMBObjectInit(&serial_mb, serial_mb_buffer, 10);
msg_t msg = 0;
BaseSequentialStream *stream = (BaseSequentialStream *)&SD3;
while (true) {
chMBFetchTimeout(&serial_mb, &msg, TIME_INFINITE);
const char *s_msg = (const char *)msg;
chprintf(stream, "%s", s_msg);
}
}
THD_WORKING_AREA(serial_input_thread_wa, 128);
THD_FUNCTION(serial_input_thread, p) {
(void) p;
chRegSetThreadName("Serial Input Thread");
while (true) {
//clear buffer
memset(buffer, 0, sizeof(buffer));
sdReadTimeout(&SD3, buffer, 5, TIME_MS2I(50));
if (strcmp((char *) buffer, start_string) == 0) {
chMBPostTimeout(&serial_mb, (msg_t)"Very long string", TIME_INFINITE);
} else if (strcmp((char *) buffer, stop_string) == 0) {
sdWrite(&SD3, buffer, 5);
}
}
}
When typing start I get "very long string" from the serial, so that seems to work. My question now is why and how does that work? The msg_t is an int32 if I recall correctly, that can fit 4 char variables. So why can I enocde a string longer than that? How would I need to cast the buffer variable in order to send it over the q?