carmasteruser 0 Опубликовано 2 часа назад Поделиться Опубликовано 2 часа назад У меня, наконец дошли руки до запуска блутуза. сначала проверил на прошивке что выложена здесь. все работает стабильно но подтупливает, особенно по сравнению с проводом. Решил что надо как-то распаралеллить нагрузку. В результате родилась следующая прошивка что принципиально другой режим обработки. результат порадовал! интерфейс стал заметно более отзывчивый. #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <driver/uart.h> #include <BluetoothSerial.h> #define BAUD_RATE 115200 * 8 #define SIZE_BUFFER 512 #define SIZE_FIFO SIZE_BUFFER * 8 #define SAVE_MODE //#define USE_PIN #ifdef USE_PIN const char* pin = "1234"; #endif const String device_name = "SCANMATIK #A111788"; BluetoothSerial SerialBT; uint8_t buffer[SIZE_BUFFER]; uint8_t bufferBT[SIZE_BUFFER]; unsigned int available=0; unsigned int availableBT=0; size_t bytesRead=0; size_t bytesReadBT=0; size_t bytesWrite=0; size_t bytesWriteBT=0; #ifdef SAVE_MODE uint32_t min_delay = 1; uint32_t max_delay = min_delay * 1024; uint32_t cur_delay = min_delay; uint32_t cur_delayBT = min_delay; uint32_t critical_size = (SIZE_FIFO / 4) * 3; #endif // Поток для обработки данных из последовательного порта void serial_reader_task(void* param) { for (; { available = Serial.available(); if (available > 0) { bytesRead = Serial.readBytes(buffer, min(available, sizeof(buffer))); bytesWrite = SerialBT.write(buffer, bytesRead); #ifdef SAVE_MODE if (cur_delay > min_delay) { if (available >= critical_size) { cur_delay = min_delay; } else { cur_delay /= 2; } } vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки #endif } #ifdef SAVE_MODE else { if (cur_delay < max_delay) { cur_delay *= 2; } vTaskDelay(pdMS_TO_TICKS(cur_delay)); } #endif } } // Поток для обработки данных из Bluetooth void bluetooth_reader_task(void* param) { for (; { availableBT = SerialBT.available(); if (availableBT > 0) { // Чтение данных из Bluetooth bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT))); bytesWriteBT = Serial.write(bufferBT, bytesReadBT); #ifdef SAVE_MODE if (cur_delayBT > min_delay) { if (availableBT >= critical_size) { cur_delayBT = min_delay; } else { cur_delayBT /= 2; } } vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки #endif } #ifdef SAVE_MODE else { if (cur_delayBT < max_delay) { cur_delayBT *= 2; } vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); } #endif } } void setup() { Serial.setRxBufferSize(SIZE_FIFO); Serial.setTxBufferSize(SIZE_FIFO); Serial.begin(BAUD_RATE); SerialBT.begin(device_name); memset(buffer, 0, sizeof(buffer)); memset(bufferBT, 0, sizeof(bufferBT)); // setup UART from hardware (RTS/CTS) uart_set_pin(UART_NUM_0, 1, 3, 22, 19); // UART, TX, RX, RTS, CTS uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_CTS_RTS, 64); uart_set_mode(UART_NUM_0, UART_MODE_UART); SerialBT.begin(device_name); #ifdef USE_PIN SerialBT.setPin(pin); #endif Serial.print("AT-AB -BypassMode-\n"); // Назначение задач на разные ядра xTaskCreatePinnedToCore(serial_reader_task, "Serial Reader", 4096, NULL, 10, NULL, 0); xTaskCreatePinnedToCore(bluetooth_reader_task, "Bluetooth Reader", 4096, NULL, 10, NULL, 1); } // Метод loop() void loop() {} 8 часов назад, chipandtun сказал: Добрый день. Подскажите купил Есп32, прошил, запаял в см2про, комп видит блютуз и подключается, привязал к проге сканматик, блютуз определяется, но при подключении к авто-- нет связи. В чем может быть проблема? У меня такое было при плохом контакте одного из 4 проводов UART TX, RX, RTS, CTS. можно попробовать отключить CTS или RTS. или оба сразу. например так uart_set_pin(UART_NUM_0, 1, 3, 22, -1); // UART, TX, RX, RTS, CTS uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_RTS, 64); редактор немного порезал код! вместо for(; { должно быть for (;;) { Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти