Перейти к содержанию

Scanmatik 2 pro, установка Bluetooth модуля.


Рекомендуемые сообщения

  • Ответов 78
  • Создана
  • Последний ответ

Топ авторов темы

#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 лучше не надо

Ссылка на комментарий
Поделиться на другие сайты

Это исходный код для Ардуины IDE. Проверял да, на ESP32. Для DEBUG режима надо соединить с какой USB-TTL платой способной работать на высоких скоростях. Годится дешевый программатор на CH341A. Далее запускаем терминал где можно отправлять файлы и выставить соответствующую скорость. Cгодится minicom на передачу  и Putty для приема. Не забываем и про блютуз. Для передачи файла на блютуз готового решения не нашел, пришлось свой скрипт на питоне сварганить. По поводу размера буфера. 128 должно было в теории хватать для устойчивой работы. Но при длительной передаче заметил что буфер FIFO постепенно заполняется под завязку что чревато потерей данных. При 256 такой проблемы не заметил. Увеличивать до 512 смысла не вижу. Будет страдать отзывчивость системы. Все-таки у нас один поток и все операции выполняются последовательно.

Прошивка энергосберегающая. Применяется динамическая задержка от 1 до 1024 миллисекунд в зависимости от загрузки системы. В результате потребление системы снижается до 45 - 55 ма в состоянии покоя. Переход от максимальной задержки к минимальной в пределах значения максимальной задержки. При загрузке буферов FIFO больше половины задержка не применяется.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
  • Создать...