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

Передача Нескольких Переменных Через Uart


mappy89

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

Доброго времени суток, не могу решить простую проблему - передать несколько переменных одновременно через UART на мк. Данные на контроллер приходят в виде [aaa]<bbb>(ccc), где aaa bbb ccc - значения переменных, а различные скобки - их идентификаторы.

обработчик этих переменных следующий (контроллер -мега16)

struct us
{
int freaqready; ..флаги готовности приёма переменных
int duratready;
int delayready;

int chcounter; //счётчик символов
}

us us1;

volatile char sym[2];
volatile text1[20], text2[20], text3[20];

while(1)
{
sym[0]=USART_GetChar(); //принимаем символ
sym[1]=0;
if (sym[0])
{

switch (sym[0])
{
case '[': us1.freaqready=1; break;

case '(': us1.duratready=1; break;

case '<': us1.delayready=1; break;

case ']': //по окончанию приёма 1 переменной
timerValue=atoi(text);
us1.freaqready=0;
us1.chcounter=0;
USART_FlushRxBuf();
break;

case ')': //по окончанию приёма 2 переменной
widthValue=atoi(text2);
us1.duratready=0;
us1.chcounter=0;
USART_FlushRxBuf();
break;

case '>': //по окончанию приёма 3 переменной
tempdelay=atoi(text3);
us1.delayready=0;
us1.chcounter=0;
USART_FlushRxBuf();
break;

default:
if (us1.freaqready)
text1[us1.chcounter++]=sym[0];
else if (us1.duratready)
text2[us1.chcounter++]=sym[0];
else if (us1.delayready)
text3[us1.chcounter++]=sym[0];
break;
}

Однако контроллер стабильно принимает только 1 переменную, остальные он игнорирует. В чём может быть проблема?

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

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

а чего USART_FlushRxBuf(); только в 5 и 6 варианте сделано?

Вообще алгоритм достаточно сложный. Если забить (пока) на проверку, можно сначала загружать информацию в переменную а потом по закрывающей скобке скопировать ее куда надо. Примерно так. Жаль проверить не на чем.

int a,b,c; //считываемые переменные
char ch; //тут храним последний байт с UARTa
int temp; //временная переменная для хранения принятого числа

while(1)1{
ch=USART_GetChar(); //принимаем символ. Я так понял до окончания приема оно зациклено? Если нет - добавьте проверку, я этой функции не знаю.
switch(ch){
 case '(': case '[': case '<': temp=0; break; //если принят флаг начала переменной, не важно какой - обнуляем temp
 case ')': a=temp; break; // если символ приема первой переменной - запись в нее
 case ']': b=temp; break; //аналогично со второй
 case '>': c=temp; break; //и третьей
 default: temp = temp*10+ch-'0'; //если же это цифра (можно добавить проверку а цифра ли это, можно добавить проверку на соответствие скобок друг другу, много чего можно, но для примера и так сойдет) то добавляем ее к temp
} //конец switch()
}//конец while()

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

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

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

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

А зачем нужны идинтификаторы ? Не проще все складывать в массив и брать необходимый элемент ? Идинтификатор пакета ложить в первый байт, в последний - контрольную сумму. Пакет будеть иметь такой вид - [идинтификатор][переменная1][переменная2][переменная3][контрольная сумма]

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

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

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

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

стабильно принимает только 1 переменную
Что под этим подразумевается?

Если вы передаете последовательность данных [aaa]<bbb>(ccc),а при этом выполняется только [aaa], то проблема кроется в обработчиках case ']' , '>', ')'.

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

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

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

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

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

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

Идентификаторы нужны, так как переменные могут приходить в разной последовательности.

BerZerKku, обработчик приёма переменных я вставил выше в надежде, что кто то укажет на ошибку/недоработку, там вроде всё четко, однако код не рабочий =)

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

Т.к. из всех данных имеется только кусок кода (причем создается ощущение что он не совпадает с тем, который вы компилируете) и название МК, то трудно сделать какие-либо выводы, можно только угадывать.

Измерьте время выполнения

timerValue=atoi(text);

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

И если есть возможность, откажитесь от данного протокола. Либо продумывайте защиту от ошибок.

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

Зачем отказываться-то? Среди аппаратно реализованных интерфейсов все равно помехозащищенных нет, ну может, кроме экзотики, всякие USB да modbus'ы. Защиту от ошибок, конечно, стоит добавить, но только когда будет готов алгоритм.

mappy89, korsaj, вам память девать некуда? Для ввода хранить надо всего одну переменную. Если это int/uint то от -32768 до 32767, то есть 6 десятичных знаков. Плюс 1 на открывающую скобку, то есть размер буфера в 7 байт достаточен. Можно обойтись без буфера совсем, на сложности это не скажется. Даже контроль ошибок делать на лету можно. CRC или хотя бы LRC.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

В общем я заметил, что если общее количество символов не превышает 16, то всё работает, однако при большем числе передаваемых символов приём данных ведется некорректно - принимается только половина данных, либо идёт прием битых данных.

Может кто нибудь пояснить, чем это может быть вызвано?

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

может контроллер не успевает принимать (см. биты DOR, FE) или слетает синхронизация (в передатчике можно увеличить количество стоп-битов)

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Зависит от скорости контроллера и UART. Если скорость контроллера намного выше можно обрабатывать на лету, если сравнима - только с буферизацией. Кстати, чисто для проверки, можно принять всю строку а потом переслать обратно, посмотреть в каком месте проблема.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Дело в том, что буфер библиотеки полностью принимает передаваемую с ПК строку, однако если поместить в суперцикл char буфер и уже через него принимать данные, то в случае отправки больше 16 символов этот буфер принимает только 2 первые переменные (с идентификаторами соответственно), а третью переменную в упор не видит (не принимает даже идентификаторы - скобки ). 16 это по идее размер 2-х буферов приёмника, но ведь буфер кольцевой - он должен сам себя перезаписывать, однако буфер из while(1) больше чем 16 символов принимать отказывается =(

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

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

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

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

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

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

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

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

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

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

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