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 Опубликовано 20 часов назад Поделиться Опубликовано 20 часов назад Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию. Спойлер #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 Опубликовано 19 часов назад Поделиться Опубликовано 19 часов назад Только что, 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 Опубликовано 18 часов назад Поделиться Опубликовано 18 часов назад 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 Опубликовано 16 часов назад Поделиться Опубликовано 16 часов назад 2 часа назад, Виктор V сказал: Отлично работает ранее выложенная прошивка этот вариант еще на порядок лучше Ссылка на комментарий Поделиться на другие сайты Поделиться
Виктор V 28 Опубликовано 7 часов назад Поделиться Опубликовано 7 часов назад 9 часов назад, carmasteruser сказал: этот вариант еще на порядок лучше Чем лучше конкретнее Ссылка на комментарий Поделиться на другие сайты Поделиться
Roman St 54 Опубликовано 7 часов назад Поделиться Опубликовано 7 часов назад 7 минут назад, Виктор V сказал: Чем лучше конкретнее Теорией.... пока что. Надо тестит на реальном блоке. Я тоже пытался с 2 ядрами делать скетч. Работало... но при прошивке подопытного эбу висло и уваливало.... На выходных попробую затестить... если лень не помешает 😄 Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 1 Опубликовано 3 часа назад Поделиться Опубликовано 3 часа назад 3 часа назад, Виктор V сказал: Чем лучше конкретнее Предыдущая прошивка, например, долго думала при автоматическом выборе ЭБУ. Здесь же выбирает почти мгновенно. Там максимальная задержка была 1024 мсек, тут 128, Затупов практически нету и при этом проц не греется. Этой уже вполне можно пользоваться в рабочем режиме. Кому надо в бинарном виде - ловите. Заливать примерно так: esptool.py write_flash \\ --flash_mode dio \\ --flash_freq 40m \\ --flash_size detect \\ 0x1000 bootloader.bin \\ 0x8000 partitions.bin \\ 0x10000 app.bin \\ 0x100000 data.bin esp32.esp32.node32s.zip Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти