Excuse me for russian comments!
.......
// Обработчик событий на прием данных
static void device_uart_cb(int uart_no, void* param)
{
(void)param;
assert(uart_no == DEVICE_SERIAL_PORT);
size_t rx_av = mgos_uart_read_avail(DEVICE_SERIAL_PORT);
if (rx_av == 0)
{
if (!device_reading_in_process)
{
return;
}
else
{
device_reading_in_process = false;
//LOG(LL_INFO, ("- Прием данных завершен"));
//LOG(LL_INFO, ("Кол-во всех байт - %d", (int)device->connection.receive_buffer.len));
device_get_data_from_message();
device_read_next_data();
//LOG(LL_INFO, ("Конец приёма данных"));
}
}
else
{
LOG(LL_INFO, ("."));
device_reading_in_process = true;
//LOG(LL_INFO, ("Кол-во байт - %d", (int)rx_av));
//LOG(LL_INFO, ("Чтение входного буфера"));
mgos_uart_read_mbuf(DEVICE_SERIAL_PORT, &device->connection.receive_buffer, rx_av);
//LOG(LL_INFO, ("SlaveID: %.2x, Receive Buffer: %d, Read Available: %d",
// device->connection.id, device->connection.receive_buffer.len, rx_av));
}
}
// Запустить отправку данных
static bool device_start_transaction()
{
mbuf_clear(&device->connection.receive_buffer);
if (device->connection.transmit_buffer.len > 0) {
//LOG(LL_INFO, ("- Подготовка к отправке сообщения"));
mgos_uart_flush(DEVICE_SERIAL_PORT);
//LOG(LL_INFO, ("- Отправка..."));
mgos_uart_write(DEVICE_SERIAL_PORT, device->connection.transmit_buffer.buf, device->connection.transmit_buffer.len);
device_reading_in_process = false;
mgos_uart_set_dispatcher(DEVICE_SERIAL_PORT, device_uart_cb, NULL);
return true;
}
return false;
}
// Чтение объема
void device_read_volume()
{
//LOG(LL_INFO, ("ЧТЕНИЕ ОБЪЕМА"));
device->connection.transmit_buffer.buf = GetVolumeMessage;
device->connection.transmit_buffer.len = 10;
device_start_transaction();
}
....
And the second observation:
In handler device_uart_cb(int uart_no, void param)* when I uncomment line LOG(LL_INFO, (".")) - the code will execute faster, if comment - slower