Всем привет. Я решил переписать один свой хорошо отработанный на других MCU проект на rp2040. В проекте используется обмен с хостом по USB-CDC. Так как PICO-IDE для меня очень сложная и малопонятная, я решил попробовать адаптировать проект к среде Arduino. Установит библиотеку Adafruit TinyUsb и адаптировал пример CDC/serial_echo под свои нужды:
#include "Adafruit_TinyUSB.h"
#include "pico/multicore.h"
#define PC_PORT Serial
//Global integers
uint8_t exchange[280];
uint8_t rx_counter = 0;
uint8_t full_buff = 0;
uint8_t packet_size = 0;
volatile uint8_t nxt = 0;
void setup()
{
pinMode(MWCS_PIN, OUTPUT);
pinMode(PGDO_PIN, OUTPUT);
pinMode(PGDI_PIN, INPUT);
pinMode(PGC_PIN, OUTPUT);
PC_PORT.begin(115200);
PC_PORT.setTimeout(100);
//Запускаем обработку потока на втором ядре
multicore_launch_core1(core1_usb_reciever);
}
void loop()
{
if(full_buff)
{
deassemble_frame();
full_buff = 0;
}
}
//Приём пакетов от USB на втором ядре
void core1_usb_reciever()
{
uint16_t toread = 0;
while(true)
{
toread = PC_PORT.available();
if(toread)
{
for(uint16_t i = 0; i < toread; i++) exchange[rx_counter + i] = PC_PORT.read();
rx_counter += toread;
toread = 0;
if(rx_counter >= 3) packet_size = exchange[1];
if((packet_size > 0) && (rx_counter == packet_size + 3))
{
rx_counter = 0;
packet_size = 0;
if(exchange[2] == 0x3D) {nxt = 1; return;}
full_buff = 1;
}
}
}
}
Принцип работы программы следующий: хост отправляет пакет в COM порт, устройство разбирает пакет (в данном случае в отдельном потоке на втором ядре), а затем обрабатывает пакет в функции deassemble_frame() и отправляет ответный пакет обратно в COM порт.
Суть моей проблемы в том, что при отправки даже простых текстовых сообщений они видны только во встроенном мониторе порта Arduino ide, а в моих программах на C# или Qt нет. Даже в программе "Terminal 1.9" сообщения не приходят, хотя COM порт открывается без ошибок. Но если в программе "Terminal 1.9" при подключенном COM порте поменять скорость порта, данные начинают приходить. А если после этого не отключая usb запустить мою программу на C# или Qt то данные также начинают приходить и отправляться, но до следующего отключения usb.
А если при подключенном COM порте выставить скорость порта 1200 или 2400, то usb rp2040 отключается от COM порта и переходит на встроенный DFU загрузчик.
Также есть ещё одна проблема с отправкой данных: после отправки хосту приблизительно 256 байт подряд rp2040 зависает. Даже если после каждой отправки применять функцию flush().
В чём может быть проблема? Как отличается работа монитора порта Arduino ide от других подобных программ?