Jump to content
motoalex

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

Recommended Posts

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

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

Edited by motoalex

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by Yurkin2015

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

Edited by Yurkin2015

Share this post


Link to post
Share on other sites

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

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

Edited by motoalex

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

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

Edited by melkiy93

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By svd
      Предлагаю печатные платы для паяльной станции на STM32 и OLED дисплее 1,3" версии 2.1S
      Плата делалась под китайский алюминиевый корпус.
      Тема, где обсуждается данная станция T12 , опубликована на сайте radiokot.ru
      Фото платы


      Схема немного доработана:
      1) добавлены блокировочные конденсаторы 0,1 мкФ в цепях микроконтроллера;
      2) добавлен резистор в цепи буззера для возможности снижения громкости;
      3) есть возможность подключать жала JBC (для Т12 в разъеме паяльника запаивается перемычка)

      Большинство элементов типоразмера 0603. DC/DC преобразователь PSR-7805LF можно заменить на любой китайский аналог или микросхему 7805
      Ссылки на возможные замены:
      DC/DC аналог 7805 №1
      DC/DC аналог 7805 №2

      Во вложениях схема и расположение элементов на ПП, чертеж передней панели и прошивка под дисплей 1.3" с контроллером SH1106.

      Цена за одну плату 400 руб c учетом стоимости пересылки по РФ. Количество плат ограничено.
      По всем вопросам просьба обращаться в личку.
       
      STM32_T12_2.1S_SSH1106_1.3_v2_.pdf передняя панель.pdf T12_HW21S_Encryption-SH1106.zip
    • By ART_ME
      Здравствуйте.
      Рискну спросить: не завалялась ли у кого в хозяйстве для STM32F103xx: 
      - AC induction motor IFOC software library V1.0
      либо 
      - ACIM and PMSM motor control software libraries release 2.0
      ?
      Просьба поделиться если вдруг такой раритет найдется. 
       
    • By Илья Юрченко
      Добрый день, уважаемые форумчане! Для научной работы хотел собрать данные о том, насколько микроконтроллеры stm32 удовлетворяют нужды и требования программистов и разработчиков продуктов на нем. Если не сложно, ответьте, пожалуйста, важны данные)
      Разумеется "очень средне" неадекватная метрика, но в рамках работы нужна именно средняя удовлетворённость, и определение существует ли необходимость в создании другой серии универсальных плат на базе МК.
    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
  • Сообщения

    • Мне очень запала эта схемка,кто бы ее правильно на кварц.стабилизацию качнул!?Хотя жалоб о стабильности от меня.Просто хотелось бы увести его из этого диапазона.  представляю мощного жука #1²  и #1³ Т1 КТ3130Б; Т2 Bfr93; Т3 Bfr93. Т1 КТ3107Л; Т2 КТ368; КТ913Б.     Для антенн буду использовать посеребренный провод. .ля,как же я доволен вашей схемкой!
    • Вопрос следовало задать в теме защиты акустики, так так собственно к усилителю она имеет опосредованное отношение. По вопросу, я делаю так       
    • Здарова друзья!Ну что пробовал я собирать как и обещал,эту схему!Так как на схемке. Работает жучек,но мощность сильно падает,до 150метров,катушку на выходе делал так :L3 3+3витка(2катушки)спаивал в одну катушку,получался центральный выход на коллектор s9018,и катушечка L4 на 2виточка, от которой идет уже конкретно антенна,своими двумя витками помещалась посредине L3,3миллиметровый латунный сердечник плотно проходил внутри,и это не добавляло особо мощности,только взлетала частота до 145мГц что немножко упрощало его поиск и все. Потому я от этого каскада отказался.Просто перед антенной поставил конденсатор от 10--22pf!
    • То есть цифровой вольтметр определяет направление тока и по этому принципу ставит знак? И высчитывает разность потенциалов этого минуса?
    • Еще раз напишу, что стрелочки указывают направление тока. Если батарейку (любую) перевернуть, тока не будет, светодиод светится не будет. Ионы не перейдут через запрещённую зону PN-перехода диода  при "не той" полярности. Считай, что в мультиметре знак "минус" подсвечивает тот светодиод, который правый. Переворачиваешь правую батарейку, и мультиметр твой покажет напряжение без знака "минус".
    • @Slavka Всё именно так, как вы сказали. Но и с vg155 согласен, что вызванивать каждый контакт без конкретной схемы, а только аналогов. Нет гарантий что найду все контакты или не допущу ошибки. По этому и посмотрел барахолку и нашёл экземпляр с более простой проблемой. А так вот мой парк (маленьких DT182 даже 2шт)  
    • Прошу объясните. Вот если чёрный щуп мультиметра ставлю между двумя батарейками, а красный ставлю на плюс или минус, то почему мультиметр показывает знак минус в случае если ставлю на минус красный щуп? Как мультиметр определяет где минус, где плюс?
  • Покупай!

×
×
  • Create New...