Обсуждаем контроллеры компании Atmel.
Ответить

Re: Автоматический выход из ждущего режима uart_receive();

Чт авг 11, 2022 16:15:46

AlexandrRa писал(а):так правильней.

Да хоть так, главная тут задача, отвязаться от c = uart_receive(); на время выполнения условия с циклом for, вот никак не смог отвязать разве что часто нажатием какой нибудь клавиши
Последний раз редактировалось Sulik Чт авг 11, 2022 21:14:51, всего редактировалось 3 раз(а).

Re: Автоматический выход из ждущего режима uart_receive();

Чт авг 11, 2022 16:23:22

Код:
void uart_handler_RX(void)
{
if (y < Size_data)  // если весь пакет не принят
  {
    data[y] = UDR0;  // запись следующего байта data[y]
    y++;  // счётчик байт
    return;
  }
  y=0;
}

И добавь прерывание по приёму

Добавлено after 2 minutes 18 seconds:
Код:
uint8_t flag = 0;
uint8_t Size_data = 12; // например передаём 12 байт

ISR(PCINT0_vect){
   if(PINB & (1 << PB0)) flag = 1; // Разрешение передачи данных
}

int main(){
   UART_init();
   interrupt_init();
   sei();
   
   while(1){
      if (flag){
         for (y = 0; y < Size_data ; y++){
            uart_transmit(data[y]);
         }
       flag = 0; // Данные переданы
      }
}


и с на фиг ненужно стало

Добавлено after 3 minutes 10 seconds:
Что за МК хоть?
Последний раз редактировалось AlexandrRa Чт авг 11, 2022 16:26:00, всего редактировалось 1 раз.

Re: Автоматический выход из ждущего режима uart_receive();

Чт авг 11, 2022 16:29:34

AlexandrRa писал(а):И не закрывай посылку значением данных в передаче. Отучайся от этого.

Иногда очень необходимо бывает закрыться именно "\0", есть такие моменты в коде где именно так необходимо учитывая, что количество символов в одном массиве данных могут быть разной длины, то увеличится эта длина то уменьшится.

Добавлено after 2 minutes 34 seconds:
AlexandrRa писал(а):Что за МК хоть?
Atmega 328P

Добавлено after 2 minutes 59 seconds:
AlexandrRa писал(а):И добавь прерывание по приёму

Это у меня добавлено, просто код я привел как пример
Последний раз редактировалось Sulik Чт авг 11, 2022 21:07:56, всего редактировалось 1 раз.

Re: Автоматический выход из ждущего режима uart_receive();

Чт авг 11, 2022 16:31:09

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

Re: Автоматический выход из ждущего режима uart_receive();

Чт авг 11, 2022 16:42:22

AlexandrRa писал(а):и с на фиг ненужно стало

Он нужен в другом коде, просто приведенном мною примере он не нужен, но он нужен это для приема неких команд и отправка этих команд в нужное условие с данными

Добавлено after 6 minutes 32 seconds:
Задача тут очень понятная, например консоль putty будет постоянно открыть по UART с МК, ждет ввода команд с клавы, но в то же время как только придет нужное прерывание отвязаться от uart_receive(); и начал обрабатывать другое условие с циклом с выводом данных на консоль и после обработки вернулась в тот же режим uart_receive();
Последний раз редактировалось Sulik Чт авг 11, 2022 21:07:09, всего редактировалось 1 раз.

Re: Автоматический выход из ждущего режима uart_receive();

Чт авг 11, 2022 18:52:34

Sulik, смотри, в каком сообщении ты жмешь кнопку "цитата".
а то получается, что всё тобой процитированное, написано тобой, а не тем человеком, откуда ты взял цитату.

Re: Автоматический выход из ждущего режима uart_receive();

Пт авг 12, 2022 07:46:36

Задача тут очень понятная, например консоль putty будет постоянно открыть по UART с МК, ждет ввода команд с клавы, но в то же время как только придет нужное прерывание отвязаться от uart_receive(); и начал обрабатывать другое условие с циклом с выводом данных на консоль и после обработки вернулась в тот же режим uart_receive();

Нафига сидеть и ждать приёма? За этим прекрасно сможет следить флаг прерывания. А нужное прерывание смотри по флагу или данным в основном цикле. В этом случае ты всегда будешь отвязан от uart_receive(). И я бы лучше уходил в сон во время ожидания приёма, вместо того чтобы жрать энергию.

Re: Автоматический выход из ждущего режима uart_receive();

Пт авг 12, 2022 14:25:10

Sulik писал(а):Задача тут очень понятная,
Вам командная консоль нужна или как?
А команды какого вида, по символьные или пакетные, заканчивающие определенным символом или еще как?

Re: Автоматический выход из ждущего режима uart_receive();

Пт авг 12, 2022 14:54:10

Не советую так делать, есть возможность прочитать не тот байт или потерять вообще всю посылку. Т. к. чтение данных будет только один раз за цикл. А если данные приходят несколько раз за цикл и неизвестно когда по времени? Очень легко пропустить посылку.

Расскажите это тем кто написал и тем кто применяет software serial.

Если бездумно сидеть в цикле, то всегда существует вероятность потерять данные, даже если применяются прерывания.

Приведенный код будет работать, но если есть аппаратная поддержка, то не применять аппаратные прерывания нет смысла.

Re: Автоматический выход из ждущего режима uart_receive();

Пт авг 12, 2022 16:17:40

Sulik писал(а):Задача тут очень понятная,
Вам командная консоль нужна или как?
А команды какого вида, по символьные или пакетные, заканчивающие определенным символом или еще как?

Да именно консоль, а команды могут быть и те и другие, по ситуации.

Re: Автоматический выход из ждущего режима uart_receive();

Пт авг 12, 2022 18:09:14

Вот пример, смотрите
Ответить