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

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


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

У меня, наконец дошли руки до запуска блутуза. сначала проверил на прошивке что выложена здесь. все работает стабильно но подтупливает, особенно по сравнению с проводом. Решил что надо как-то распаралеллить нагрузку. В результате родилась следующая прошивка что принципиально другой режим обработки. результат порадовал! интерфейс стал заметно более отзывчивый.
#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 (;;) {

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

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

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

Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию.

Спойлер

#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 сказал:

Доработал прошивку до вполне вменяемого состояния. Беглое тестирование показало что почти не уступает оригинальной версии. Рекомендуется к использованию.

  Скрыть контент

#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() {}

 

Отлично работает ранее выложенная прошивка

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

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() {}

 

Спасибо, будем тестировать

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

2 часа назад, Виктор V сказал:

Отлично работает ранее выложенная прошивка

этот вариант еще на порядок лучше

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

9 часов назад, carmasteruser сказал:

этот вариант еще на порядок лучше

Чем лучше конкретнее 

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

7 минут назад, Виктор V сказал:

Чем лучше конкретнее

Теорией.... пока что. Надо тестит на реальном блоке. Я тоже пытался с 2 ядрами делать скетч. Работало... но при прошивке подопытного эбу висло и уваливало.... 

На выходных попробую затестить... если лень не помешает 😄

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

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

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

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

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

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

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

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

Войти

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

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
  • Создать...