hardbar

Запись Даных После Опроса И Отправка.алгоритм Uarta На Asm

9 сообщений в этой теме

hardbar    98

Вот хочу сделать опрос кнопок на одном мк отправка по Uart и вывод значения на другом мк.

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

Просто по очереди записывать в РОН и отправлять не работает так как даные после обработки могут пойти не в той порт.

вот схема для наглядности

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 044

Дай сначала байт-идентификатор, а потом байт данных. Т.е. $7F (идентификатор передачи состояния фиксированных кнопок), $XX (само состояние) и $1F (идентификатор кнопок без фиксации), $XX (само состояние). На другом конце МК декодирует идентификаторы в посылках и согласно им поместит результаты "по местам". Коды идентификаторов можешь придумать любые, на свое усмотрение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hardbar    98

А если идентификатор совпадает с посылкой. Тогда что сделать?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 044

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hardbar    98

Ок. А как тогда сделать двух байтовую посылку. Вдруг первый байт придет вторым а второй первым.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 044

Не вей провода и тогда байты не запутаются. :) Ты волнуешься, что принимающий МК собьется со счета? Тогда усложни протокол. Запрос на передачу (МК №1 1байт), ответ готовности приема (МК №2 1байт), посылка данных (идентификатор/данные). Пока не договорятся все посылки игнорировать. Во время ответа второй МК синхронизирует счетчик принятых байт. Ну как-то так. Можно напридумывать как угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hardbar    98

Оооо... гениальная мысля. Нужно чтоб приемник давал команду что готов принять 1 посылку после ее приема давал что готов принять 2 посылку. А потом выводил значение в порт.

Спасиба!

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: rmatveev
      Всем привет!
      Задумано следующее: на малинку ставится веб-сервер (именно веб, а не HTTP, т.к. подразумевается тонкий клиент, но возможно я с терминами немного путаю), который обеспечивает управление через тонкий клиент по Ethernet, по Modbus RTU поверх RS-485 малинка должна будет управлять объектом.
      Т.е. задача такая: на удаленном рабочем месте визуализация объекта и его управление по Modbus.
      Изначально я хотел под это дело использовать какой-нибудь NUCLEO на процессоре STM32. Но почитал немного о подробностях установки TCP-IP стека и веб-сервера на STM32 и понял, что эту задачу они выполняют, но как-то сложновато. Вроде как Raspberry Pi намного лучше с этим должна справиться. Да и комьюнити намного больше.
      Ваши мнения, господа?
    • Автор: DmitryDDDD
      Здравствуйте, имеется задача передачи данных от stm32 на ПК и от ПК в stm по UART. Имеется stm32f411e-disco, созданная программа на пк в Qt creator. UART передатчик - CH340. Программа для stm - Keil, настройка в cubeMX.
      Основные выдержки из кода Qt (mainwindow.cpp):
       
      C++ (Qt)Выделить код
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
      // Настройка UART      serial = new QSerialPort(this);      serial->setPortName("com4");      serial->setBaudRate(QSerialPort::Baud115200);      serial->setDataBits(QSerialPort::Data8);      serial->setParity(QSerialPort::NoParity);      serial->setStopBits(QSerialPort::OneStop);      serial->setFlowControl(QSerialPort::NoFlowControl);      serial->open(QIODevice::ReadWrite);      /*serial->write("ok*");  */                                                          connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));   // Запись принятых даннх в текстовое окно void MainWindow::serialReceived() {     QByteArray ba;     ba=serial->readAll();     ui->label->setText(ba);     qDebug()<<ba; }   // Отправка "1" и "2" в зависимости от нажатой кнопки void MainWindow::on_pushButton_clicked() {   serial->write("1"); }   void MainWindow::on_pushButton_2_clicked() {   serial->write("2"); }
      Настроен UART на прием и передачу. При нажатии какой-либо кнопки по UART передаётся 1 или 2ка. Так же принятая информация отображается в текстовом окне label. При замыкании RX и TX у CH340 отправленная 1 или 2 тут же принимаются программой.

      Программный код для stm создан в CubeMX. Там подключено два UART, один на приём, другой на передачу (можно настроить один для работы в 2 направления).
      Основные выдержки из кода Keil (main.c):
      //Настройка UART
      serial = new QSerialPort(this);
      serial->setPortName("com4");
      serial->setBaudRate(QSerialPort::Baud115200);
      serial->setDataBits(QSerialPort::Data8);
      serial->setParity(QSerialPort::NoParity);
      serial->setStopBits(QSerialPort::OneStop);
      serial->setFlowControl(QSerialPort::NoFlowControl);
      serial->open(QIODevice::ReadWrite);
      /* serial->write("ok*"); */ // Transmiting "ок" to COM Port
      connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));
       
      // Отображение принятых данных в текстовом меню label
      void MainWindow::serialReceived()
      {
      QByteArray ba;
      ba=serial->readAll();
      ui->label->setText(ba);
      qDebug()<<ba;
      }
       
      // Отправка 1 или 2 в зависимости от нажатой кнопки
      void MainWindow::on_pushButton_clicked()
      {
      serial->write("1");
      }
       
      void MainWindow::on_pushButton_2_clicked()
      {
      serial->write("2");
      }
       
      Выдержки из кода в Keil (main.c):
       
      // Настройка UART
      static void MX_USART1_UART_Init(void)
      {
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 115200;
        huart1.Init.WordLength = UART_WORDLENGTH_8B;
        huart1.Init.StopBits = UART_STOPBITS_1;
        huart1.Init.Parity = UART_PARITY_NONE;
        huart1.Init.Mode = UART_MODE_TX_RX;
        huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        if (HAL_UART_Init(&huart1) != HAL_OK)
        {
          _Error_Handler(__FILE__, __LINE__);
        }
      }
      // 2 массива для принятия и отправки данных
        uint8_t strTX[1];
          uint8_t strRX[1];
      // Попытка сделать что-то адекватное
              int strTX = 1;
      while(1) {        
              HAL_UART_Transmit_IT(&huart2, (uint8_t*) strTX, 1);
            HAL_UART_Receive_IT(&huart2, (uint8_t*) strTX, 1);
      Код в keil явно кривой, в Qt вроде всё работает. Получается передать из stm в Qt, но из Qt в stm нет. 
      Нужно получить следующее: нажимаем в Qt одну из двух кнопок, отправляется в stm либо 1, либо 2 в зависимости от выбранной кнопки. Stm принимает, обрабатывает, если 1, то загорается один светодиод, если 2, то другой. Дальше stm отправляет обратно в Qt информацию о том, какой светодиод загорелся. 

      P.S: довольно далек от программирования, но стараюсь разобраться. Буду благодарен любой помощти, некоторые скриншоты прилагаю.



    • Автор: User_1
      Всем привет!
      Почему-то этот код работает: 
      void Send_to_UART(char* string) { char data = 0; while(*string) { while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); data = *string; USART1->TDR = data; string++; } while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0D); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0A); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TC))); } char hello[13] = {'H','e','l','l','o',' ','W','o','r','l','d','!'}; int main (void) { Init_Clock(); Init_USART1(); Send_to_UART(hello); while(1); } А если написать вот так:
      int main (void) { Init_Clock(); Init_USART1(); Send_to_UART("Hello World!"); while(1); } то не просто не работает - микроконтролер зависает даже до входа в main().
      В Си ведь, насколько я понимаю, строка - это тот же массив символов
      Объясните, пожалуйста, что я делаю не так?
      Камень stm32f030, среда CooCox CoIDE
    • Гость Andrey-Docent
      Автор: Гость Andrey-Docent
      Всем привет! Планируется сделать на базе arduino устройство, ведущее обмен данными с переферийным устройством по интерфейсу rs-232 и также необходимо контролировать работу arduino с помощью компьютера тоже посредством интерфейса rs-232. Но у arduino только один такой порт. Первая мысль в связи с этим - сделать ещё один порт и вывести линии RX и TX на другие (например цифровые) ножки порта. Можно ли как-то это сделать? Нет ли готовых библиотек для этого (на данный момент не нашёл таковых в интернете)? Может есть ещё какой-нибудь обходной путь? Заранее спасибо.
    • Автор: LoKeR
      Доброго времени суток, нашел хорошую статью Usart прием и отправка строки. Настроил на порт Usart3 перестал работать, попробовал на Usart2 перекинуть тоже не работает, как правильно переделать подскажите...
      stm32-uart-spl.rar