motoalex Опубликовано 19 февраля, 2016 Поделиться Опубликовано 19 февраля, 2016 (изменено) Здравствуйте уважаемые любители МК) Пытаюсь организовать такую задачу на STM32f407VG: 1. Принимаем данные по USART, помещаем их во временный буфер( Recieve_buff). 2. Если попадается символ '+' читаем (Recieve_buff) и записываем данные после '+' в массив данных (massive). 3. Выводим данные на жки wh1602. с 1 и 3 пунктом проблем как бы нет, но вот со вторым вовсе не клеится. К примеру: отправляю +suprima, после 1, а то и 3 отправки приходит только один символ 's', т.е. и не каждый раз выводятся данные. Прошу помощи у Гуру сообщества. Всем Благ! #include "main.h" uint16_t delay_count=0; uint32_t i; uint32_t i3; int i2=123; char str1[50]; uint8_t massive[256]; // massive buffer uint8_t Recieve_buff[256]; // recieved buffer uint8_t Recieve_W=0, Recieve_R=0, Recieve_C=0; char Send_buffer[100]; uint8_t Send_count=0; void SysTick_Handler(void)// counter { if (delay_count > 0) { delay_count --; } } void(delay_ms(uint16_t delay_temp)) // schitayem nashe vremya, kotoroe zadano v osnovnom tele { delay_count = delay_temp; while(delay_count) {} } //---------------------------------------------------// //recieved data interrupt //---------------------------------------------------// void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) // if flag interrupt set up we will do next... { USART_ClearITPendingBit(USART2, USART_IT_RXNE); // reset interrupt Recieve_buff[Recieve_W] =USART_ReceiveData(USART2); Recieve_W++; Recieve_C++; } } //---------------------------------------------------// int main(void) { USART2_init(); SystemCoreClockUpdate(); SysTick_Config(SystemCoreClock/1000);// 1ms delay_ms(50); LCD_ini(); while(1) { if(Recieve_C>0) { if(Recieve_buff[Recieve_R++]=='+') { massive[i3++]=Recieve_buff[Recieve_R++]; sprintf(str1, "%s", massive); //sprintf(str7, "%s %d %s", "one", i2, str); LCD_Send_String8(0,str1); } Recieve_C--; Recieve_R++; } } } Изменено 19 февраля, 2016 пользователем motoalex 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 19 февраля, 2016 Поделиться Опубликовано 19 февраля, 2016 (изменено) Тут надо учесть, что буквы по USART передаются медленно, одна за другой, а процессор работает быстро. Вот, только передали первый символ из строки "+suprima", как тут же сработали оба условия if(Recieve_C>0) и if(Recieve_buff[Recieve_R++]=='+'), и процессор сразу пытается вывести что-то на экран. Хотя ещё только-только второй символ "s" передаётся, не говоря уже об остальных символах из строки. Причём при приёме следующего символа условие if(Recieve_buff[Recieve_R++]=='+') уже не будет срабатывать, т.к. Recieve_R уже увеличился и проехал плюсик в буфере. Надо по-другому. Проверять в прерывании все полученные символы на равенство "+", и при приёме плюсика выставлять флаг, что пошла строка. В главном цикле проверять флаг, и при установке флага просто выводить все приходящие символы на экран по одному. После приёма всей строки - флаг сбрасывать и снова ждать плюсик. Изменено 19 февраля, 2016 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
motoalex Опубликовано 19 февраля, 2016 Автор Поделиться Опубликовано 19 февраля, 2016 Надо по-другому. Проверять в прерывании все полученные символы на равенство "+", и при приёме плюсика выставлять флаг, что пошла строка. В главном цикле проверять флаг, и при установке флага просто выводить все приходящие символы на экран по одному. После приёма всей строки - флаг сбрасывать и снова ждать плюсик. Огромное спасибо Вам, Уважаемый, сделал почти как Вы говорите,но есть пару нюансов: 1. sprintf(str1, "%s", USART_ReceiveData(USART2)); - не корректно выводит данные на ЖКИ, Я в прерывании по выставлению флага, сделал ещё одно условие и там пишу в Recieve_buff[Recieve_W]. И его уже вывожу на ЖКИ - всё славно. 2. Конец строки ловлю тоже в прерывании символом конца строки. Но есть ещё пару вопросов, когда лучше обнулять переменную Recieve_W буфера Recieve_buff[], так как выполнение этой операции в прерывании не всегда выводит последний отправленный символ. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Yurkin2015 Опубликовано 19 февраля, 2016 Поделиться Опубликовано 19 февраля, 2016 (изменено) Мне кажется, использовать функцию sprintf() тут не надо. Программа по USART получает уже готовый символ. Можно либо сразу его отправлять без всяких преобразований, типа LCD_Send_Data(USART_ReceiveData(USART2)); Но лучше накапливать строку в буфере прямо в прерывании, а по концу строки выводить её прямо на ЖКИ в основной программе. типа так: Прерывание { char tmpc = USART_ReceiveData(USART2); Если (Plusik == 1) { str1[Receive_R++] = tmpc; } if(tmpc=='+') { Plusik = 1; Receive_R = 0; } Если получили конец строки, { Plusik = 0 ; str1[Receive_R]=0 ; KonecStroki=1; } } В основной программе while(1){ если (KonecStroki==1) { LCD_Send_Line(str1); KonecStroki=0; } } Изменено 19 февраля, 2016 пользователем Yurkin2015 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
motoalex Опубликовано 19 февраля, 2016 Автор Поделиться Опубликовано 19 февраля, 2016 (изменено) Вы очень сильно мне помогли, все работает, как часики. хочу Вас попросить об последней просьбе.Как сравнить два массива (один в памяти, а другой принятый по usart). char massive[]={'S','U','P','R','I','M','A','1','2','3','4','5'}; // massive buffer *********************************** while(1) { if(f2==1) // флаг на конец строки { if (f4==0) флаг на работу с массивами { if (massive[i3]==str1[i3]) // сравниваем наши массивы { i3++; if(i3==12) { f4=1; //обнуляем флаг f3=1; // идем на печать строки в ЖКИ } } } if(f3==1) { LCD_Send_String8(0, str1); i3=0; f2=0; f3=0; } } } } В моем случае не правильно сравниваю данные в массиве. Точней не правильно пишу алгоритм. Изменено 19 февраля, 2016 пользователем motoalex 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
melkiy93 Опубликовано 19 февраля, 2016 Поделиться Опубликовано 19 февраля, 2016 (изменено) char massive[]={'S','U','P','R','I','M','A','1','2','3','4','5'}; // massive buffer *********************************** while(1) { if (f2 == 1) // флаг на конец строки { f2 = 0; f3 = 1; for(i3=0; i3<12; i3++) { if (massive[i3] != str1[i3]) // сравниваем наши массивы { f3 = 0; break; } } if(f3 == 1) { LCD_Send_String8(0, str1); f3 = 0; } } } Изменено 19 февраля, 2016 пользователем melkiy93 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
motoalex Опубликовано 20 февраля, 2016 Автор Поделиться Опубликовано 20 февраля, 2016 Огромное спасибо, тем, кто мне помог) Тему можно закрыть. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
PeterBr Опубликовано 8 апреля, 2016 Поделиться Опубликовано 8 апреля, 2016 пример передачи данных Usart http://ivarious.com/index.php?onecategory=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B2%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D1%85%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC&id=40 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.