Приветствую, всех.
В предыдущем посте упомянул про переходник usb2usart на базе такой-же платки. В целом ничего особенного, но при отладке выявились моменты по коммуникациям, которые могут быть интегрированы в этот порт grbl или последующие, ибо софт переходника это наследие grbl.
Как уже сказал - я долго не мучился и взял из grbl часть для usb и такую-же часть зеркальную для usart2. Такой обрезок получился.
1. Маленькие приемные буферы. Я сделал и для usb и для usart2 по 1024 байта (память и производительность контроллера позволяет, зачем ужиматься). Соответственно надо аккуратно изменить тип указателей(это не термин языка си, это индексы массива) головы и хвоста на uint16. Глобальные переменные ...head, ...tail, а также локальные смежные переменные head, tail и т.д. По исходящему буферу usb наверное тож можно сделать, тока быть аккуратнее (поинтерная работа непосильная для меня) ибо передатчик берет из этого буфера пакеты не более 64 байт и других ограничений не увидел.
2. В переходнике не использую, но оставил вместе с индикатором строки(моргалка диодом) Ярослава. Маленький буфер входящей строки. Можно довести до стандарта G-code и ставить 256 символов вместо 90. Я для страховки счетчик символов строки - "char_counter" тож перевел в uint16.
3. При программировании через uart (использовал стандартную утилиту от ST) выяснил что на одном из начальных шагов идет посылка символа 0xFF. В grbl этот символ идет для обозначения отсутствия данных. Не знаю для чего это было сделано, в общем - убрал его и функция чтения данных имеет вид uint8_t serial_read(uint8_t *data), где возврат 0-нет данных, 1-есть данные, а по указателю заполняю символ.
4. Утилита программирования от ST не хочет работать если не указать четность = EVEN. Это-же замечание есть и в описании протокола, хотя в том же документе (в другом месте) написано что контроллер в начале прошивки ждет 0x7f и сам определяет скорость, четность и т.д. И по факту контроллер работает и без четности (проверял на своей утилите). В общем для поддержки такого режима и стандартной утилиты изобразил следующее в самом начале функции OnUsbDataRx:
vcp_lc = Virtual_Com_Port_SetLineCoding(sizeof(LINE_CODING));
vcp_paritytype = (vcp_lc)->paritytype;
if (vcp_paritytype_prev != vcp_paritytype) {
vcp_paritytype_prev = vcp_paritytype;
// перестроим порт usart2
if (vcp_paritytype_prev == 0) {
USART2->CR1 &= ~USART_CR1_M; // 8 bit
USART2->CR1 &= ~USART_CR1_PCE; // disable parity
}
else {
USART2->CR1 |= USART_CR1_M; // 9 bit
USART2->CR1 |= USART_CR1_PCE; // enable parity
if (vcp_paritytype_prev == 1) {USART2->CR1 |= USART_CR1_PS;} // ODD
else {USART2->CR1 &= ~USART_CR1_PS;} // == 2 EVEN
}
}
В описании:
uint8_t vcp_paritytype;
uint8_t vcp_paritytype_prev;
LINE_CODING* vcp_lc;
Гуру могут меня поправить если криво, думаю мысль понятна.
Такая функция сработает один раз после первого принятого пакета от usb после соединения и настройки usart2 можно менять на лету не боясь потерь.
Возможно что-то из этого будет полезно для этого grbl порта.
Вообще жду новой версии GRBL и новых портов

. Недочеты есть и чего-то не хватает.
Например сделал кнопку EStop в управляющей программе. По фукционалу самый раз команда двери безопасности, но в статусе видим - DOOR. Т.Е. все прекрасно работает - чисто эргономика, гадай потом или у меня палец на мышке дрогнул или реальный датчик сработал. Не понравилось триггерное отображение шпинделя в строке отчета. Мало ли я чего пропустил или чего-то нажал - хочется видеть постоянный статус, ведь у пробников нормально сделано.
Оно мелочи но хочется по человечески.
Ну как-то так. Всем удачи.