Ну да, можно, только если бы кто-нибудь потом всё это монтировал, писал метаданные, а ещё когда-то надо и осваивать новый материал, причем очень профессионально осваивать, чтобы не выложить в паблик сырец, что недопустимо. Когда всё в одном лице, тяжеловато. Дохода от этого практически почти нет, поэтому нанять кого-то ещё для ускорения процесса не представляется возможным. Поэтому пока так как есть. Максимум по 3 видео в неделю.
Я не помню спрашивал Вас или нет - работаете ли Вы удаленно? Если да, можете сбросить мне описания Ваших последних работ в 1-2 предложениях и Ваши условия. Лучше в личку mail@msdesign.ru
Я имел ввиду делаете ли Вы проекты на микроконтроллерах удаленно, основное место работы меня совершенно не интересует, мне бывает нужны разработчики на срочные работы с высоким качеством, соответственно поэтому был вопрос - есть ли у Вас желание и опыт удаленной работы.
Владимир, расскажите пожалуйста как преобразовать строку в int. С компьютера идут чары, а я хочу потом управлять программой в зависимости от принятого числа (управление скважностью ШИМа). Чисел много, табличный способ будет очень громоздким.
Добрый день! Большое спасибо за урок, но у меня возник вопрос, на который я так и не нашел ответа. Как всё-таки передавать произвольное число символов?
Если нам не известно сколько байтов будет вы можете сделать урок по прерыванию чтобы он перестал когда получить перевод строки /r/n просто тут заказываешь 8 байт и если 8 байт не принимаешь заходить в цикл error
Из за этого тоже приходится писать свой код в обработчике прерываний. Я часто пишу АТ команды для интерфейса юарт и нужно принимать разной длины сообщения по юарту...
добрый день! столкнулся с проблемой принять по uart посылки разной длины - 2 и 6 байт. использую HAL_UART_Receive_IT(&huart1, dataUARTResive, SendByte); если SendByte=2, то в посылке по 6 теряются последние 4, если SendByte=6, то надо 3 раза посылать. оба варианте не проходные. всю голову сломал. может кто знает как правильно сделать?
Добрый день, уважаемый. Я понимаю, что мой вопрос будет глупым, но как передать по уарту переменную, которая объявлена как 32-х разрядная. Не ужели искусственно перекидывать в массив??
Спасибо! Пока нет, к сожалению. Уже слишком много готовых непоказаных проектов набралось, во-первых, во-вторых, нет пока устройств, которые можно подключить по данной шине, в наличии. Как появятся, буду разбираться
Столкнулся с такой ситуацией, что максимальная длинна буфера для принимаемых данных может быть 976 байт. при 977 не запускается . Как его можно увеличить. stm32f103c8t6
В общем так как и думал , принимать по ДМА разного размера данные размер которых не знаешь - неудобно да и будет выглядеть как глюк программы. Но вот передавать по ДМА удобно . Настроил в кубе ДМА например для тх первого юарта , сгенерил проект , прописал пару строчек : void RS485U1(char *str) // PWM interface , speed 115200 { int x=0; str+=0; while(str[x]) { x++; } if(hdma_usart1_tx.State==HAL_DMA_STATE_BUSY)HAL_Delay(100 if(hdma_usart1_tx.State==HAL_DMA_STATE_READY) { if(x) HAL_UART_Transmit_DMA(&huart1,(uint8_t*)str, x); hdma_usart1_tx.State=HAL_DMA_STATE_BUSY; } } Вызываю эту функцию когда надо что то передать , работает быстро и красиво , но если данные быстро передавать , вот такая АТ команда вызывает отправку 48 байт: if(string_cmp("STR OK! ", rx_buffer0)) { sprintf(tx_buffer0 , "STR%sEND " , PWM_buff); RS485U1(tx_buffer0); timer=0; clear_RS485_1(); } то на 5 - 6 ю отправку дма подвисает секунд на 20... как решить эту проблему можно кто в курсе?
Спасибо большое, все заработало! Подскажите пожалуйста, а функция HAL_UART_Receive_IT может принимать только символы или любое число? Если я хочу принять просто 8-битное число, мне надо написать вот так?: uint8_t A = 0; HAL_UART_Receive_IT(&huart3, &A, 8);
А где найти обработчик прерывание при приеме данных? Что бы можно было сделать кольцевой буфер! И если у нас не известно количество байт которые должны прийти, то надо поставить 1 третьим параметром?
Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться. Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
Не слышал даже об этом. У меня много где отправка на USART прописана, а терминальную программу я не включаю. Хотя я переходник при этом не отключаю, он у меня в ST-Link обычно встроен.
Подаю из терминала HEX-цифры, но прерывание отрабатывается только один раз. Т.е. подаю из терминала единичку - светодиод зажигается. Подаю нолик - но светодиод не гаснет. Но если перезагрузить мк, то нолик принимается и обрабатывается в прерывании нормально, а вот единичка следом уже нет. Интересно, почему так? PS. Лампочки на адаптере usb-rs232 моргают, значит данные с компьютера идут нормально.
А как по ДМА или по прерыванию (при помощи HAL функции) складывать сообщения в буфер разной длины ? Вот к примеру надо принимать ат команды и их обрабатывать.
Если размер буфера str[] 8 байт, а инициализируете Вы его массивом из одного байта ({0}), то проинициализируется только первый элемент буфера. Вы можете в этом убедится поставив 1 вместо 0 ({1}).
Ну слушайте, человек в кепке, то есть автор, ваши уроки конечно очень познавательны, но есть ли среди исходников хоть один проект, где бы вот так открыть в кейле и скомпилить? Ну пока что не встречал! То константа не от того проца, то драйверов нету. Это у вас защита от дурака такая или же причина в чем то другом?
Это не принципиально, если нужно можно и больше передавать, главное чтобы размер буфера не был меньше чем передаваемон количество байт. Тут просто пример такой передаем ровно 8 символов
Огромное спасибо , за данные уроки . Пересел с Pic на stm32 .
Шпариш уроки как пирожки! Лайк за труды!!!
Когда человек увлечен своим делом, он может шпарить хоть каждый день по три видоса.
Ну да, можно, только если бы кто-нибудь потом всё это монтировал, писал метаданные, а ещё когда-то надо и осваивать новый материал, причем очень профессионально осваивать, чтобы не выложить в паблик сырец, что недопустимо. Когда всё в одном лице, тяжеловато. Дохода от этого практически почти нет, поэтому нанять кого-то ещё для ускорения процесса не представляется возможным. Поэтому пока так как есть. Максимум по 3 видео в неделю.
Я не помню спрашивал Вас или нет - работаете ли Вы удаленно? Если да, можете сбросить мне описания Ваших последних работ в 1-2 предложениях и Ваши условия. Лучше в личку mail@msdesign.ru
msdesign.ru Я работаю администратором приложений 1С-Предприятие и не удалённо, а на стационарном рабочем месте.
Я имел ввиду делаете ли Вы проекты на микроконтроллерах удаленно, основное место работы меня совершенно не интересует, мне бывает нужны разработчики на срочные работы с высоким качеством, соответственно поэтому был вопрос - есть ли у Вас желание и опыт удаленной работы.
Однозначно Лайк!
+Paradise for SPIDERS
Спасибо большое, Богдан! Ты настоящий ценитель искусства кодинга микрочипов)
Владимир, расскажите пожалуйста как преобразовать строку в int. С компьютера идут чары, а я хочу потом управлять программой в зависимости от принятого числа (управление скважностью ШИМа). Чисел много, табличный способ будет очень громоздким.
функции легче искать : в окне слева - дерево проекта, есть вкладка функции, а там список их соответственно по файлам и алфавитном порядке )
Спасибо за подсказку. Я давно в курсе этого дерева, но извините, так привык.
Добрый день! Большое спасибо за урок, но у меня возник вопрос, на который я так и не нашел ответа. Как всё-таки передавать произвольное число символов?
Если нам не известно сколько байтов будет вы можете сделать урок по прерыванию чтобы он перестал когда получить перевод строки /r/n просто тут заказываешь 8 байт и если 8 байт не принимаешь заходить в цикл error
С длиной сообщения не удобно вообще. Есть выход? Если неизвестна длина?
Из за этого тоже приходится писать свой код в обработчике прерываний.
Я часто пишу АТ команды для интерфейса юарт и нужно принимать разной длины сообщения по юарту...
Dma режим. Ловите по первому принятому байту. Hal unlock. Dma ready. Stop Dma. Clear cntr. Start Dma.
добрый день! столкнулся с проблемой принять по uart посылки разной длины - 2 и 6 байт. использую HAL_UART_Receive_IT(&huart1, dataUARTResive, SendByte); если SendByte=2, то в посылке по 6 теряются последние 4, если SendByte=6, то надо 3 раза посылать. оба варианте не проходные. всю голову сломал. может кто знает как правильно сделать?
Добрый день, уважаемый. Я понимаю, что мой вопрос будет глупым, но как передать по уарту переменную, которая объявлена как 32-х разрядная. Не ужели искусственно перекидывать в массив??
Очень понравились ваши уроки , продолжайте в том же духе !!! Было бы круто посмотреть про CAN модуль , не планируете на этот модуль урок ?
Спасибо!
Пока нет, к сожалению. Уже слишком много готовых непоказаных проектов набралось, во-первых, во-вторых, нет пока устройств, которые можно подключить по данной шине, в наличии. Как появятся, буду разбираться
Зачем писать прерывание в бесконечном цикле? Оно на то и прерывание, что может быть записано в сторонке. Нужно писать код в обработчике прерываний.
Спасибо Вам)
Как восстановить связь при обрыве линии, а потом при ее соединении ??
Столкнулся с такой ситуацией, что максимальная длинна буфера для принимаемых данных может быть 976 байт. при 977 не запускается . Как его можно увеличить. stm32f103c8t6
В общем так как и думал , принимать по ДМА разного размера данные размер которых не знаешь - неудобно да и будет выглядеть как глюк программы.
Но вот передавать по ДМА удобно . Настроил в кубе ДМА например для тх первого юарта , сгенерил проект , прописал пару строчек :
void RS485U1(char *str) // PWM interface , speed 115200
{
int x=0;
str+=0;
while(str[x])
{
x++;
}
if(hdma_usart1_tx.State==HAL_DMA_STATE_BUSY)HAL_Delay(100
if(hdma_usart1_tx.State==HAL_DMA_STATE_READY)
{
if(x) HAL_UART_Transmit_DMA(&huart1,(uint8_t*)str, x);
hdma_usart1_tx.State=HAL_DMA_STATE_BUSY;
}
}
Вызываю эту функцию когда надо что то передать , работает быстро и красиво , но если данные быстро передавать , вот такая АТ команда вызывает отправку 48 байт:
if(string_cmp("STR OK!
", rx_buffer0))
{
sprintf(tx_buffer0 , "STR%sEND
" , PWM_buff);
RS485U1(tx_buffer0);
timer=0;
clear_RS485_1();
}
то на 5 - 6 ю отправку дма подвисает секунд на 20... как решить эту проблему можно кто в курсе?
Спасибо большое, все заработало!
Подскажите пожалуйста, а функция HAL_UART_Receive_IT может принимать только символы или любое число? Если я хочу принять просто 8-битное число, мне надо написать вот так?:
uint8_t A = 0;
HAL_UART_Receive_IT(&huart3, &A, 8);
Данная функция принимает буфер. А данные могут там быть любые.
Решено
А где найти обработчик прерывание при приеме данных? Что бы можно было сделать кольцевой буфер! И если у нас не известно количество байт которые должны прийти, то надо поставить 1 третьим параметром?
Callback поставить
есть в документации по HAL
Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться.
Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
Не слышал даже об этом. У меня много где отправка на USART прописана, а терминальную программу я не включаю.
Хотя я переходник при этом не отключаю, он у меня в ST-Link обычно встроен.
Подаю из терминала HEX-цифры, но прерывание отрабатывается только один раз. Т.е. подаю из терминала единичку - светодиод зажигается. Подаю нолик - но светодиод не гаснет.
Но если перезагрузить мк, то нолик принимается и обрабатывается в прерывании нормально, а вот единичка следом уже нет. Интересно, почему так?
PS. Лампочки на адаптере usb-rs232 моргают, значит данные с компьютера идут нормально.
Разобрался, скорость побольше поставил.
А как по ДМА или по прерыванию (при помощи HAL функции) складывать сообщения в буфер разной длины ? Вот к примеру надо принимать ат команды и их обрабатывать.
Парсить поток.
Посмотрите уроки по модулю HC-05, думаю, поймёте.
narod stream , дайте ссылочку пожалуйста :)
Урок 97. Подключаем bluetooth-модуль HC-05 ruclips.net/video/S4P-lAa4iFQ/видео.html
Урок 99. HC-05. Master. Соединяем два МК. Часть 1 ruclips.net/video/-59JSYhd9cE/видео.html
Урок 99. HC-05. Master. Соединяем два МК. Часть 2 ruclips.net/video/xmqYVYwpgTY/видео.html
narod stream , в уроках рассказывается именно как по дма парсить входной поток? А то посмотрю только завтра видос..
Нет, не DMA, но принцип, думаю будет понятен.
Решено
void Gsm_RxCallBack(void)
{
RxBuff[RxIndex] = usartBuff;
if (strstr(RxBuff, "
") != 0)
Gsm_RxClear();
if(RxIndex < _GSM_RX_SIZE)
RxIndex++;
else
Gsm_RxClear();
HAL_UART_Receive_IT(&huart1,&usartBuff,1);
}
Если размер буфера str[] 8 байт, а инициализируете Вы его массивом из одного байта ({0}), то проинициализируется только первый элемент буфера. Вы можете в этом убедится поставив 1 вместо 0 ({1}).
А как поправить? Написать вот так что ли? {0,0,0,0,0,0,0,0};
Или написать просто 0 без фигурных скобок ?
Ну слушайте, человек в кепке, то есть автор, ваши уроки конечно очень познавательны, но есть ли среди исходников хоть один проект, где бы вот так открыть в кейле и скомпилить? Ну пока что не встречал! То константа не от того проца, то драйверов нету. Это у вас защита от дурака такая или же причина в чем то другом?
А почему только 8?
Вопрос не понял. Формируйте, пожалуйста, комментарии поподробнее. Они же не для меня, здесь читают и смотрят многие.
Это не принципиально, если нужно можно и больше передавать, главное чтобы размер буфера не был меньше чем передаваемон количество байт. Тут просто пример такой передаем ровно 8 символов