carmasteruser 1 Опубликовано Среда в 22:33 Поделиться Опубликовано Среда в 22:33 У меня, наконец дошли руки до запуска блутуза. сначала проверил на прошивке что выложена здесь. все работает стабильно но подтупливает, особенно по сравнению с проводом. Решил что надо как-то распаралеллить нагрузку. В результате родилась следующая прошивка что принципиально другой режим обработки. результат порадовал! интерфейс стал заметно более отзывчивый. #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 (;;) { Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 1 Опубликовано 9 часов назад Поделиться Опубликовано 9 часов назад Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию. Спойлер #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 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; uint32_t min_delay = 1; uint32_t max_delay = min_delay * 128; uint32_t cur_delay = min_delay; uint32_t cur_delayBT = min_delay; uint32_t critical_size = SIZE_FIFO / 2; // Поток для обработки данных из последовательного порта 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); if (cur_delay > min_delay) { if (available >= critical_size) { cur_delay = min_delay; } else { cur_delay /= 2; } } } else { if (cur_delay < max_delay) { cur_delay *= 2; } } if (available <= critical_size) { vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки } } } // Поток для обработки данных из Bluetooth void bluetooth_reader_task(void* param) { for (;;) { availableBT = SerialBT.available(); if (availableBT > 0) { bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT))); bytesWriteBT = Serial.write(bufferBT, bytesReadBT); if (cur_delayBT > min_delay) { if (availableBT >= critical_size) { cur_delayBT = min_delay; } else { cur_delayBT /= 2; } } } else { if (cur_delayBT < max_delay) { cur_delayBT *= 2; } } if (availableBT <= critical_size) { vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки } } } 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() {} AllScan 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Виктор V 28 Опубликовано 8 часов назад Поделиться Опубликовано 8 часов назад Только что, carmasteruser сказал: Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию. Скрыть контент #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 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; uint32_t min_delay = 1; uint32_t max_delay = min_delay * 128; uint32_t cur_delay = min_delay; uint32_t cur_delayBT = min_delay; uint32_t critical_size = SIZE_FIFO / 2; // Поток для обработки данных из последовательного порта 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); if (cur_delay > min_delay) { if (available >= critical_size) { cur_delay = min_delay; } else { cur_delay /= 2; } } } else { if (cur_delay < max_delay) { cur_delay *= 2; } } if (available <= critical_size) { vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки } } } // Поток для обработки данных из Bluetooth void bluetooth_reader_task(void* param) { for (;;) { availableBT = SerialBT.available(); if (availableBT > 0) { bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT))); bytesWriteBT = Serial.write(bufferBT, bytesReadBT); if (cur_delayBT > min_delay) { if (availableBT >= critical_size) { cur_delayBT = min_delay; } else { cur_delayBT /= 2; } } } else { if (cur_delayBT < max_delay) { cur_delayBT *= 2; } } if (availableBT <= critical_size) { vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки } } } 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() {} Отлично работает ранее выложенная прошивка Ссылка на комментарий Поделиться на другие сайты Поделиться
lione63 0 Опубликовано 8 часов назад Поделиться Опубликовано 8 часов назад 1 годину назад, carmasteruser сказав: Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию. Показати контент #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 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; uint32_t min_delay = 1; uint32_t max_delay = min_delay * 128; uint32_t cur_delay = min_delay; uint32_t cur_delayBT = min_delay; uint32_t critical_size = SIZE_FIFO / 2; // Поток для обработки данных из последовательного порта 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); if (cur_delay > min_delay) { if (available >= critical_size) { cur_delay = min_delay; } else { cur_delay /= 2; } } } else { if (cur_delay < max_delay) { cur_delay *= 2; } } if (available <= critical_size) { vTaskDelay(pdMS_TO_TICKS(cur_delay)); // пауза для минимизации нагрузки } } } // Поток для обработки данных из Bluetooth void bluetooth_reader_task(void* param) { for (;;) { availableBT = SerialBT.available(); if (availableBT > 0) { bytesReadBT = SerialBT.readBytes(bufferBT, min(availableBT, sizeof(bufferBT))); bytesWriteBT = Serial.write(bufferBT, bytesReadBT); if (cur_delayBT > min_delay) { if (availableBT >= critical_size) { cur_delayBT = min_delay; } else { cur_delayBT /= 2; } } } else { if (cur_delayBT < max_delay) { cur_delayBT *= 2; } } if (availableBT <= critical_size) { vTaskDelay(pdMS_TO_TICKS(cur_delayBT)); // пауза для минимизации нагрузки } } } 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() {} Спасибо, будем тестировать Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 1 Опубликовано 5 часов назад Поделиться Опубликовано 5 часов назад 2 часа назад, Виктор V сказал: Отлично работает ранее выложенная прошивка этот вариант еще на порядок лучше Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти