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

Stm32 Прием Данных По Usart И Вывод На Hd44780


motoalex

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

Здравствуйте уважаемые любители МК)

Пытаюсь организовать такую задачу на 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++;
}
}
}

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Тут надо учесть, что буквы по USART передаются медленно, одна за другой, а процессор работает быстро.

Вот, только передали первый символ из строки "+suprima", как тут же сработали оба условия if(Recieve_C>0) и if(Recieve_buff[Recieve_R++]=='+'), и процессор сразу пытается вывести что-то на экран. Хотя ещё только-только второй символ "s" передаётся, не говоря уже об остальных символах из строки.

Причём при приёме следующего символа условие if(Recieve_buff[Recieve_R++]=='+') уже не будет срабатывать, т.к. Recieve_R уже увеличился и проехал плюсик в буфере.

Надо по-другому. Проверять в прерывании все полученные символы на равенство "+", и при приёме плюсика выставлять флаг, что пошла строка. В главном цикле проверять флаг, и при установке флага просто выводить все приходящие символы на экран по одному. После приёма всей строки - флаг сбрасывать и снова ждать плюсик.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Надо по-другому. Проверять в прерывании все полученные символы на равенство "+", и при приёме плюсика выставлять флаг, что пошла строка. В главном цикле проверять флаг, и при установке флага просто выводить все приходящие символы на экран по одному. После приёма всей строки - флаг сбрасывать и снова ждать плюсик.

Огромное спасибо Вам, Уважаемый, сделал почти как Вы говорите,но есть пару нюансов:

1. sprintf(str1, "%s", USART_ReceiveData(USART2)); - не корректно выводит данные на ЖКИ, Я в прерывании по выставлению флага, сделал ещё одно условие и там пишу в Recieve_buff[Recieve_W]. И его уже вывожу на ЖКИ - всё славно.

2. Конец строки ловлю тоже в прерывании символом конца строки.

Но есть ещё пару вопросов, когда лучше обнулять переменную Recieve_W буфера Recieve_buff[], так как выполнение этой операции в прерывании не всегда выводит последний отправленный символ.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Мне кажется, использовать функцию 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;
 }
}

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

Вы очень сильно мне помогли, все работает, как часики. хочу Вас попросить об последней просьбе.Как сравнить два массива (один в памяти, а другой принятый по 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;
}
}
}
}

В моем случае не правильно сравниваю данные в массиве. Точней не правильно пишу алгоритм.

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

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;
 }
}
}

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

  • 1 месяц спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

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