carmasteruser 2 Опубликовано Среда в 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 2 Опубликовано вчера в 17:46 Поделиться Опубликовано вчера в 17:46 Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию. Спойлер #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:00 Поделиться Опубликовано вчера в 19:00 Только что, 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 Опубликовано вчера в 19:34 Поделиться Опубликовано вчера в 19:34 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 2 Опубликовано 23 часа назад Поделиться Опубликовано 23 часа назад 2 часа назад, Виктор V сказал: Отлично работает ранее выложенная прошивка этот вариант еще на порядок лучше Ссылка на комментарий Поделиться на другие сайты Поделиться
Виктор V 28 Опубликовано 14 часов назад Поделиться Опубликовано 14 часов назад 9 часов назад, carmasteruser сказал: этот вариант еще на порядок лучше Чем лучше конкретнее Ссылка на комментарий Поделиться на другие сайты Поделиться
Roman St 54 Опубликовано 14 часов назад Поделиться Опубликовано 14 часов назад 7 минут назад, Виктор V сказал: Чем лучше конкретнее Теорией.... пока что. Надо тестит на реальном блоке. Я тоже пытался с 2 ядрами делать скетч. Работало... но при прошивке подопытного эбу висло и уваливало.... На выходных попробую затестить... если лень не помешает 😄 Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 2 Опубликовано 10 часов назад Поделиться Опубликовано 10 часов назад 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Roman St 54 Опубликовано 4 часа назад Поделиться Опубликовано 4 часа назад Пока перепаивал... проверил амперметром. Вообщем моя прошивка стандарт + смена имени блютуз потребляет в простое 70ма при передаче 140ма ваша с 2 ядрами 80ма в простое 155 при передаче. 2 ядра жрут на 10ма больше... не так уж и много, думал будет поболя. Если нет передачи секунд через 5 на обоих прошивках ток падает в 2 раза типо режим ожидания. Судя по потреблению тока все эти сейв моды и таймауты не нужны в коде. Все это реализованно в библиотеке и нормально работает. Позже потестю на прошивке блока.... Кидайте скетч самой последней вашей... потестим. Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 2 Опубликовано 4 часа назад Поделиться Опубликовано 4 часа назад а температурный режим сравнили? сдается мне будет разница. и еще интересно сколько ваша прошивка посылает запросов чтобы считать 1 байт данных? в случае когда данных нету. самому лень считать. почему ваша прошивка работает сносно, хотя должна по идее быстро ставить на колени микроконтроллер?? потому что у него есть встроенные средства защиты от дурака и говнокодинга. в моем случае эта защита не нужна. потому что все сделано грамотно и разумно. попробуйте код подобный вашему запустить на десктопе. вот тогда все тайное и станет явным. Ссылка на комментарий Поделиться на другие сайты Поделиться
Roman St 54 Опубликовано 3 часа назад Поделиться Опубликовано 3 часа назад Стандарт прошивка основанна на примере блютуз сериал из ардуино ide. Т.е самый минимум... Вы тоже используете туже библиотеку то есть у вас такой же говно код😀 А если без шуток то я не пытаюсь что там оспорить обхаить.... наоборот. Давайте тестить. Теория это не то.... 23 минуты назад, carmasteruser сказал: температурный режим сравнили Пока нет. Когда буду тестить на прошивка блока замерю. Если физику помните то поймете что чем больше ток тем теплее... 55 минут назад, carmasteruser сказал: еще интересно сколько ваша прошивка посылает запросов чтобы считать 1 байт А куда гнатся? К линия и кан шина не такие уж и скоростные... чеще всего тормоит именно эбу авто. Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 2 Опубликовано 3 часа назад Поделиться Опубликовано 3 часа назад по моим данным потребление в холостом режиме прыгает 82 -73 ма. при длительном приеме через блютуз не превышает 160 ма. температура под нагрузкой 46-47. Roman St 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Roman St 54 Опубликовано 2 часа назад Поделиться Опубликовано 2 часа назад 19 минут назад, carmasteruser сказал: прыгает 82 -73 ма Да. Еще я заметил что прыгает, на "моей" не прагало. Скинте вашу последню в личку я свою скину. Тестю на блоке edc16c39 Моя калибровки по к линии считала за 3.11 мин. По юсб 1.05 ваша читала 25 мин. Записывать еще не пробовал. Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 2 Опубликовано 49 минут назад Поделиться Опубликовано 49 минут назад так я выложил все свои прошивки в этой теме. если надо прям файл ino приложил. sketch_aug5a_copy_20250808171846.zip Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти