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

Данные По Com Порту Не Успевают Передаваться


mappy89

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

Доброго времени суток, проблема следующая: имеются 4 реле времени, которые срабатывают практически одновременно, посылая импульсы на ноги контроллера, после попадания на него импульсов он формирует строку типа "a1256", где a - 1-й номер сработавшего реле, 1256 - 1,256 сек - время срабатывания. Если представить ситуацию, что все 4 реле времени сработали одновременно (т. е. самая распространённая ситуация), то вместо строки "aXXXXbXXXXcXXXXdXXXX" (где xxxx-времена срабатывания) по ком порту отправляется строка "abcdXXXX", т.е. передаётся только последнее время срабатывания реле

main()
{
volatile int optime=0; //время срабатывания
volatile char mass[10]; //для хранения optime в char

DDRB|=(0<<0)|(0<<1)|(0<<2)|(0<<3); //пины, ловящие импульс от реле

while(1)
{
for (int ii=0; ii<4;ii++)
{
if (PINB & (1<<(ii+4))  //если реле сработало то

US_cl();
USART_FlushTxBuf(); //очищаем передающий буфер

itoa(mass, optime,10);  //перевод optime в char

switch (ii)						
{
case 0: USART_SendStr("a"); break;  //1 реле
case 1: USART_SendStr("b");break;   //2 реле и т д 
case 2: lUSART_SendStr("c"); break;
case 3: USART_SendStr("d"); break;
}
USART_SendStr(optime);
}
}
}

Код библиотеки usart прикрепил в файле.

usart.zip

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

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

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

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

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

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

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

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

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

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

Используйте таймаут или оборачивайте передачу в критическую секцию

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

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

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

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

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

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

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

Поскольку контроллер измеряет время срабатывания, то инициатором является тоже он, во всяком случае начало отсчета ему известно. Нет смысла ждать час срабатывания. Не сработало за макс. допустимое время - брак, строку формируйте сразу всю. Это таймаут. Про критические секции - код особо не смотрел, но смысл в чем - если используются прерывания, то на время передачи нужно их запретить в тех местах, где возможна порча/изменение передаваемых данных. Это при условии что все остальное верно..

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

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

Формируйте строку в зависимости от количества сработавших реле. Зачем вам ее делать всегда вида aXXXXbXXXXcXXXXdXXXX. Сколько реле сработало, до начала формирования строки, столько и включайте в пакет.

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

Проблема решилась благодаря "склейке" символа, обзначающего номер элемента и времени срабатывания реле, используя функцию strcat:

main()
{
volatile int optime=0; //время срабатывания
volatile char mass[10]; //для хранения optime в char

volatile char buf[32]; //для хранения склеенных строк
memset(buf,0,sizeof(buf)); //на всякий случай очищаем буфер

DDRB|=(0<<0)|(0<<1)|(0<<2)|(0<<3); //пины, ловящие импульс от реле
while(1)
{
for (int ii=0; ii<4;ii++)
{
if (PINB & (1<<(ii+4))  //если реле сработало то
US_cl();
USART_FlushTxBuf(); //очищаем передающий буфер
itoa(mass, optime,10);  //перевод optime в char
switch (ii)											
{
case 0: strcat(buf,"a"); break;  //1 реле
case 1: strcat(buf,"b"); break;   //2 реле и т д
case 2: strcat(buf,"c"); break;
case 3: strcat(buf,"d"); break;
}
strcat(buf,optime);  //склеиваем символ-номер реле и время срабатывания
USART_SendStr(buf);
memset(buf,0,sizeof(buf)); //очищаем буфер
}
}
}

Выложил полностью работающий код, без потерь отправляющие данные, авось кому пригодится =)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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