koliada 1 Опубликовано Воскресенье в 08:22 Поделиться Опубликовано Воскресенье в 08:22 Делай на HC-05 реально работает спасибо автору Посмотри в соседней ветке Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 0 Опубликовано 21 час назад Поделиться Опубликовано 21 час назад #include "BluetoothSerial.h" #include "driver/uart.h" #define BAUD_RATE 115200 * 8 #define SIZE_BUFFER 256 #define SIZE_FIFO SIZE_BUFFER * 8 #define SAVE_MODE //#define DEBUG_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]; unsigned int available=0; unsigned int availableBT=0; size_t bytesRead=0; size_t bytesWrite=0; #ifdef SAVE_MODE uint32_t min_delay = 1; uint32_t max_delay = min_delay * 1024; uint32_t cur_delay = min_delay; uint32_t critical_size = SIZE_FIFO / 2; #endif #ifdef DEBUG_MODE #include <chrono> using namespace std::chrono; auto timePointSerial = high_resolution_clock::now(); auto timePointBT = high_resolution_clock::now(); #endif void setup() { Serial.setRxBufferSize(SIZE_FIFO); Serial.setTxBufferSize(SIZE_FIFO); Serial.begin(BAUD_RATE); memset(buffer, 0, sizeof(buffer)); // 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"); } void loop() { 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) { cur_delay /= 2; } #endif #ifdef DEBUG_MODE auto timeoutSerial = high_resolution_clock::now() - timePointSerial; Serial.printf("\n\rAvailable from Serial %u, cur_delay %u , timeout %u\n", available, cur_delay, duration_cast<microseconds>(timeoutSerial).count()); Serial.printf("\n\rFrom Serial to BT Read = %u, Write = %u\n", bytesRead, bytesWrite); timePointSerial = high_resolution_clock::now(); #endif } availableBT = SerialBT.available(); if (availableBT > 0) { bytesRead = SerialBT.readBytes(buffer, min(availableBT, sizeof(buffer))); bytesWrite = Serial.write(buffer, bytesRead); #ifdef SAVE_MODE if (cur_delay > min_delay) { cur_delay /= 2; } #endif #ifdef DEBUG_MODE auto timeoutBT = high_resolution_clock::now() - timePointBT; Serial.printf("\n\rAvailable from BT %u, cur_delay %u, timeout %u\n", availableBT, cur_delay, duration_cast<microseconds>(timeoutBT).count()); Serial.printf("\n\rFrom BT to Serial Read = %u, Write = %u\n", bytesRead, bytesWrite); timePointBT = high_resolution_clock::now(); #endif } #ifdef SAVE_MODE if ((available < critical_size) && (availableBT < critical_size)) { delay(cur_delay); } if ((available <= 0) && (availableBT <= 0)) { if (cur_delay < max_delay) { cur_delay *= 2; } } #endif } для визуального контроля работы интерфейсов раскоментировать //#define DEBUG_MODE Это для экспериментов до установки в сканматик. Устанавливать с включенным DEBUG лучше не надо Roman St 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
a_m_k 2 Опубликовано 6 часов назад Поделиться Опубликовано 6 часов назад А это подо что скетч? Под ESP32? Ссылка на комментарий Поделиться на другие сайты Поделиться
carmasteruser 0 Опубликовано 19 минут назад Поделиться Опубликовано 19 минут назад Это исходный код для Ардуины IDE. Проверял да, на ESP32. Для DEBUG режима надо соединить с какой USB-TTL платой способной работать на высоких скоростях. Годится дешевый программатор на CH341A. Далее запускаем терминал где можно отправлять файлы и выставить соответствующую скорость. Cгодится minicom на передачу и Putty для приема. Не забываем и про блютуз. Для передачи файла на блютуз готового решения не нашел, пришлось свой скрипт на питоне сварганить. По поводу размера буфера. 128 должно было в теории хватать для устойчивой работы. Но при длительной передаче заметил что буфер FIFO постепенно заполняется под завязку что чревато потерей данных. При 256 такой проблемы не заметил. Увеличивать до 512 смысла не вижу. Будет страдать отзывчивость системы. Все-таки у нас один поток и все операции выполняются последовательно. Прошивка энергосберегающая. Применяется динамическая задержка от 1 до 1024 миллисекунд в зависимости от загрузки системы. В результате потребление системы снижается до 45 - 55 ма в состоянии покоя. Переход от максимальной задержки к минимальной в пределах значения максимальной задержки. При загрузке буферов FIFO больше половины задержка не применяется. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти