Обработка прерывания Serial порта

maratk1n
Offline
Зарегистрирован: 05.09.2016

Всем привет. Я работаю с дисплеем Nextion, на борту которого находится собственный МК. При нажатии на кнопки тачскрина, дисплей по серийному порту (я его повесил на hardwareSerial, пины 2 и 3, т.к. UNO имеет только один встроенный порт) отправляет на ардуинку строки. Но если в loop'е происходят задержки, нажатия на таче никак не обрабатываются. Как можно реализовать прерывание для обработки отклика тачскрина? Буду очень благодарен за помощь.
Пример:
 

#include "Nextion.h"

/*
 * Declare a button object [page id:0,component id:1, component name: "b0"]. 
 */
NexButton b0 = NexButton(0, 1, "b0");

char buffer[100] = {0};

/*
 * Register a button object to the touch event list.  
 */
NexTouch *nex_listen_list[] = 
{
    &b0,
    NULL
};

/*
 * Button component pop callback function. 
 * In this example,the button's text value will plus one every time when it is released. 
 */
void b0PopCallback(void *ptr)
{
    uint16_t len;
    uint16_t number;
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));

    /* Get the text value of button component [the value is string type]. */
    btn->getText(buffer, sizeof(buffer));
    
    number = atoi(buffer);
    number += 1;

    memset(buffer, 0, sizeof(buffer));
    itoa(number, buffer, 10);

    /* Set the text value of button component [the value is string type]. */
    btn->setText(buffer);
}

void setup(void)
{    
    /* Set the baudrate which is for debug and communicate with Nextion screen. */
    nexInit();

    /* Register the pop event callback function of the current button component. */
    b0.attachPop(b0PopCallback, &b0);
}

void loop(void)
{   
    /*
     * When a pop or push event occured every time,
     * the corresponding component[right page id and component id] in touch event list will be asked.
     */
    nexLoop(nex_listen_list);
    delay(500);
}












 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Что я могу подсказать так это ссылку которую некогда смотрел когда были проблемы с UART

http://arduino.ru/forum/programmirovanie/preryvanie-po-postupleniyu-baita-usart-preryvanie-arduino-mega-2560

maratk1n
Offline
Зарегистрирован: 05.09.2016

Спасибо! Доберусь до дома -- обязательно попробую и отпишу.

Если я правильно понял, то мне бы просто запустить nexLoop(nex_listen_list); во время приема данных по UART'у. Дальше Nextion.h сам все распарсит 

maratk1n
Offline
Зарегистрирован: 05.09.2016

Почитал документации. Правильно ли я понимаю, что USART0_RX_vect применим к штатному Serial? Как же тогда быть, если я использую программный порт:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

К сожалению точно сказать не могу. Однако по документации программного serial написано следующее: для RX нужно использовать 2 или 3 пины (так как на них есть прерывание) а TX может быть на любом пине.

Я атк понимаю что библиотека тоже использует прерывание, осталось его определить. Может покопаться в библиотеке softSerial и может там есть название используемого прерывания?!

------

Посмотрел. Ничего не нашел. Хотя я не спец, мог и не понять что к чему. Тут знающий ответит, так как там код написан на чистом Си как я могу понимать. В среде оно может именоваться по другому.