• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Прием данных по UART

Br.Misha

New member
Надо сделать прием данных по UART. Открыл sdout.c, там уже, вроде как всё готово:
Код:
LOCAL void
uart0_rx_intr_handler(void *para)
{
    uint8 uart_no = UART0;

    if (UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST))
    {
        WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_RXFIFO_FULL_INT_CLR);
    }
}

void ICACHE_FLASH_ATTR stdoutInit() {

    /* rcv_buff size if 0x100 */
    ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff));

    //Enable TxD pin
    PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);

    //Set baud rate and other serial parameters to 115200,n,8,1
    uart_div_modify(0, UART_CLK_FREQ/BIT_RATE_115200);
    WRITE_PERI_REG(UART_CONF0(0), (STICK_PARITY_DIS)|(ONE_STOP_BIT << UART_STOP_BIT_NUM_S)| \
            (EIGHT_BITS << UART_BIT_NUM_S));

    //Reset tx & rx fifo
    SET_PERI_REG_MASK(UART_CONF0(0), UART_RXFIFO_RST|UART_TXFIFO_RST);
    CLEAR_PERI_REG_MASK(UART_CONF0(0), UART_RXFIFO_RST|UART_TXFIFO_RST);

    //set rx fifo trigger
    WRITE_PERI_REG(UART_CONF1(0),
            ((0x01 & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S) |
            ((0x01 & UART_RX_FLOW_THRHD) << UART_RX_FLOW_THRHD_S) |
            UART_RX_FLOW_EN);

    //Install our own putchar handler
    os_install_putc1((void *)stdoutPutchar);

    //clear all interrupt
    WRITE_PERI_REG(UART_INT_CLR(0), 0xffff);

    //enable rx_interrupt
    SET_PERI_REG_MASK(UART_INT_ENA(0), UART_RXFIFO_FULL_INT_ENA);

    ETS_UART_INTR_ENABLE();
}
Затем я внутри uart0_rx_intr_handler сделал инкремент определенной переменной. Передаю с терминала данные на rx модуля - переменная не инкрементируется и esp виснет, черед несколько сек происходит перезагрузка.
Подскажите, пожалуйста, как организовать прием данных по юарту?
PS: так же включен второй юарт, по нем данные только передаются.
Спасибо!
 

de1m

New member
Вот так у меня работает.
Инициализация (uart0 и uart1)
Код:
uart_init(BIT_RATE_9600,BIT_RATE_9600);
Передача данных на uart0:
Код:
uart0_tx_buffer(cmd, sizeof(cmd));
Приём:
Сперва нужно приделать прерывание:
Код:
    system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
    system_os_post(user_procTaskPrio, 0, 0 );
Потом так (по одному знаку), по другому я тоже не знаю
Код:
static void ICACHE_FLASH_ATTR loop(os_event_t *events) {

  int c = uart0_rx_one_char();
}
Так я делаю на uart1 (GPIO02)
Код:
os_printf("Test");
 
Попробовал прикрутить код , ругается на это: " uart0_rx_one_char();"
uart.h подключен . Но в нем я не нашел функции uart0_rx_one_char();
какой файл надо подключить чтобы заработал код?
 

de1m

New member
Да, это и правда оказалась не стандартная функция.
Вот она

Код:
int ICACHE_FLASH_ATTR uart0_rx_one_char() {
  if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
  int ret = *UartDev.rcv_buff.pReadPos;
  UartDev.rcv_buff.pReadPos++;
  if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
  }

  return ret;
}
Вопрос к знаю знающим, как правильно сделать приём данных стандартными средствами?
 
Я уже решил задачу , я расковырял uart.c дописал немного его и теперь получаю строку.
 

slavikb

New member
Надо сделать прием данных по UART. Открыл sdout.c, там уже, вроде как всё готово:
Код:
LOCAL void
uart0_rx_intr_handler(void *para)
Все функции, которые могут вызываться в обработчиках прерываний, должны кэшироваться в оперативной памяти, для этого их нужно помечать атрибутом ICACHE_RAM_ATTR:
Код:
void ICACHE_RAM_ATTR uart0_rx_intr_handler(void *para)
 
Последнее редактирование:

slavikb

New member
Вот пример рабочего кода

Код:
#include "esp8266_peri.h"
#include "uart_register.h"


// Инициализация:
void init_uart()
{
  Serial.begin(2400);
  // Установка порога - прерывание по приёму 1 байта
 const uint32 conf1 = (1 << UART_RXFIFO_FULL_THRHD_S);
  WRITE_PERI_REG(UART_CONF1(UART0), conf1);
  //  Регистрация обработчика прерывания
  ETS_UART_INTR_ATTACH(uart_int_handler, 0);
  // Установка маски на прерывания от UART0 по приёму данных
  WRITE_PERI_REG(UART_INT_ENA(UART0), UART_RXFIFO_FULL_INT_ENA);
  // Разрешение прерываний от UART
  ETS_UART_INTR_ENABLE();
}

// Обработчик прерываний

void ICACHE_RAM_ATTR uart_int_handler(void *va)
{
  for (;;)
  {
    const uint32 uartIntStatus = READ_PERI_REG(UART_INT_ST(UART0));
    if (uartIntStatus == 0)
      break;

    if (CHECK_INT_STATUS(uartIntStatus, UART_RXFIFO_FULL_INT_ST))
    {
      // обработка прерывания по приёму данных
      const uint32 fifoLen = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT;
      for (uint32 i = 0; i < fifoLen; ++i)
      {
        const uint8 ch = READ_PERI_REG(UART_FIFO(UART0));
        ProcessReceive(ch);
      }
      // очистка прерывания
      WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
    }
  }
}

// Функция ProcessReceive делает полезную работу.
// Все функции, используемые в обработчиках прерываний должны иметь атрибут ICACHE_RAM_ATTR

void ICACHE_RAM_ATTR ProcessReceive(uint8 ch)
{
}
 
Да, это и правда оказалась не стандартная функция.
Вот она

Код:
int ICACHE_FLASH_ATTR uart0_rx_one_char() {
  if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
  int ret = *UartDev.rcv_buff.pReadPos;
  UartDev.rcv_buff.pReadPos++;
  if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
  }

  return ret;
}
Вопрос к знаю знающим, как правильно сделать приём данных стандартными средствами?
а что вы дописали и куда? вот ту функцию я добавил во все uart.c которые шли у меня с SDK. и не заработало.
linux ubuntu. код правлю в атоме, компилирую make.
 
что я вообще сделал:
я взял проект из примеров blinky
убрал всё что моргает.
сделал
Код:
void ICACHE_FLASH_ATTR user_init()
void ICACHE_FLASH_ATTR user_init()
{
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
#include "key.h"
#include "c_types.h"
#include "time.h"
#include "mem.h"
#include "uart.h"

#define user_procTaskPrio        0
#define user_procTaskQueueLen    1
os_event_t    user_procTaskQueue[user_procTaskQueueLen];
static void loop(os_event_t *events);
LOCAL os_timer_t network_timer;


static void ICACHE_FLASH_ATTR loop(os_event_t *events) {

    int c = uart0_rx_one_char();
}

void ICACHE_FLASH_ATTR user_init()
{
  // init gpio subsytem
  gpio_init();

  //uart_init
  uart_init(74400, 74400);
  os_printf("\r\n ESP8266 started!\r\n");
  wifi_set_opmode(0x00);
  os_printf("\r\n Wi-Fi off!\r\n");

  system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
  system_os_post(user_procTaskPrio, 0, 0 );


}
спотыкается на int c = uart0_rx_one_char(); когда делаю make

Код:
$ make
xtensa-lx106-elf-gcc -I/d/T_projects/sechub_esp_modem -I/home/sam/esp-open-sdk/sdk/driver_lib/include/driver -I/home/sam/esp-open-sdk/sdk/include -mlongcalls -Os -ffunction-sections -fdata-sections -DICACHE_FLASH   -c -o blinky.o blinky.c
xtensa-lx106-elf-gcc -Teagle.app.v6.move2rom.ld  blinky.o  -nostdlib -Wl,--start-group -lcirom -lhal -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lmgcc -lwps -lcrypto -ldriver -Wl,--end-group -Wl,-Map,Project.map -Wl,--gc-sections -o blinky
blinky.o:(.irom0.literal+0x0): undefined reference to `uart0_rx_one_char'
blinky.o: In function `loop':
blinky.c:(.irom0.text+0x6): undefined reference to `uart0_rx_one_char'
collect2: error: ld returned 1 exit status
<встроенное>: ошибка выполнения рецепта для цели «blinky»
make: *** [blinky] Ошибка 1
вот сам make


Код:
CC = xtensa-lx106-elf-gcc
#CFLAGS = -I. -mlongcalls
CFLAGS = -I/d/Teko_projects/sechub_esp_modem -I/d/Teko_projects/sechub_esp_modem/driver -I/home/sam/esp-open-sdk/sdk/driver_lib/include/driver -I/home/sam/esp-open-sdk/sdk/include -mlongcalls -Os -ffunction-sections -fdata-sections -DICACHE_FLASH

#LDLIBS = -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc
LDLIBS = -nostdlib -Wl,--start-group -lcirom -lhal -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lmgcc -lwps -lcrypto -ldriver -Wl,--end-group -Wl,-Map,Project.map -Wl,--gc-sections

#LDFLAGS = -Teagle.app.v6.ld
LDFLAGS = -Teagle.app.v6.move2rom.ld

blinky-0x00000.bin: blinky
    esptool.py elf2image $^

blinky: blinky.o

blinky.o: blinky.c

flash: blinky-0x00000.bin
    esptool.py write_flash 0 blinky-0x00000.bin 0x10000 blinky-0x10000.bin

clean:
    rm -f blinky blinky.o blinky-0x00000.bin blinky-0x10000.bin
я решил пойти другим путём - поискать тот самый uart.с и uart.h которые надо изменить. пошёл по пути /home/sam/esp-open-sdk/sdk/driver_lib/include/driver и /home/sam/esp-open-sdk/sdk/include в первом было искомое. но добавление туда

Код:
int ICACHE_FLASH_ATTR uart0_rx_one_char() {
  if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
  int ret = *UartDev.rcv_buff.pReadPos;
  UartDev.rcv_buff.pReadPos++;
  if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
  }
  return ret;
}
ничего не дало.
 
Последнее редактирование:
запустилось! вот в таком виде:
вот сам blinky.c
Код:
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
#include "key.h"
#include "c_types.h"
#include "time.h"
#include "mem.h"
#include "uart.h"


#define UART0   0
#define UART1   1

#define user_procTaskPrio        0
#define user_procTaskQueueLen    1
os_event_t    user_procTaskQueue[user_procTaskQueueLen];
static void loop(os_event_t *events);
LOCAL os_timer_t network_timer;


static void ICACHE_FLASH_ATTR loop(os_event_t *events) {

  int c = uart0_rx_one_char();
  if(c == 0x30) {
   os_printf("1\r\n");
  }
  if(c == 0x31) {
   os_printf("2\r\n");
  }
}


void ICACHE_FLASH_ATTR user_init()
{
  // init gpio subsytem
  gpio_init();

  //uart_init
  uart_init(74400, 74400);
  os_printf("\r\n ESP8266 started!\r\n");
  wifi_set_opmode(0x00);
  os_printf("\r\n Wi-Fi off  2  !\r\n");

  system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
  system_os_post(user_procTaskPrio, 0, 0 );

}

Код:
CC = xtensa-lx106-elf-gcc
#CFLAGS = -I. -mlongcalls
CFLAGS = -I/d/Teko_projects/sechub_esp_modem -I/home/sam/esp-open-sdk/sdk/driver_lib/include/driver -I/home/sam/esp-open-sdk/sdk/include -mlongcalls -Os -ffunction-sections -fdata-sections -DICACHE_FLASH

#LDLIBS = -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc
LDLIBS = -nostdlib -Wl,--start-group -lcirom -lhal -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lmgcc -lwps -lcrypto -ldriver -Wl,--end-group -Wl,-Map,Project.map -Wl,--gc-sections

#LDFLAGS = -Teagle.app.v6.ld
LDFLAGS = -Teagle.app.v6.move2rom.ld


blinky-0x00000.bin: blinky
    esptool.py elf2image $^

blinky: blinky.o
blinky: uart.o
#
blinky.o: blinky.c
blinky.o: uart.c

flash: blinky-0x00000.bin
    esptool.py write_flash 0 blinky-0x00000.bin 0x10000 blinky-0x10000.bin

clean:
    rm -f blinky blinky.o blinky-0x00000.bin blinky-0x10000.bin

uart.c и uart.h были взяты вот отсюда: esp8266 serial (UART0) tx/rx - 41J Blog
вот uart.c
Код:
/******************************************************************************
* Copyright 2013-2014 Espressif Systems (Wuxi)
*
* FileName: uart.c
*
* Description: Two UART mode configration and interrupt handler.
*              Check your hardware connection while use this mode.
*
* Modification history:
*     2014/3/12, v1.0 create this file.
*******************************************************************************/
#include "ets_sys.h"
#include "osapi.h"
#include "uart.h"

#define UART0   0
#define UART1   1

// UartDev is defined and initialized in rom code.
extern UartDevice UartDev;

LOCAL void uart0_rx_intr_handler(void *para);
#define user_procTaskPrio        0

/******************************************************************************
* FunctionName : uart_config
* Description  : Internal used function
*                UART0 used for data TX/RX, RX buffer size is 0x100, interrupt enabled
*                UART1 just used for debug output
* Parameters   : uart_no, use UART0 or UART1 defined ahead
* Returns      : NONE
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
uart_config(uint8 uart_no)
{
    if (uart_no == UART1) {
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
    } else {
        /* rcv_buff size if 0x100 */
        ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff));
        PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
    }

    uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));

    WRITE_PERI_REG(UART_CONF0(uart_no),    UartDev.exist_parity
                   | UartDev.parity
                   | (UartDev.stop_bits << UART_STOP_BIT_NUM_S)
                   | (UartDev.data_bits << UART_BIT_NUM_S));


    //clear rx and tx fifo,not ready
    SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
    CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);

    //set rx fifo trigger
    WRITE_PERI_REG(UART_CONF1(uart_no), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S);

    //clear all interrupt
    WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);
    //enable rx_interrupt
    SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA);
}

/******************************************************************************
* FunctionName : uart1_tx_one_char
* Description  : Internal used function
*                Use uart1 interface to transfer one char
* Parameters   : uint8 TxChar - character to tx
* Returns      : OK
*******************************************************************************/
LOCAL STATUS ICACHE_FLASH_ATTR
uart1_tx_one_char(uint8 TxChar)
{
    while (true)
    {
        uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(UART1)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
        if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
            break;
        }
    }

    WRITE_PERI_REG(UART_FIFO(UART1) , TxChar);
    return OK;
}

/******************************************************************************
* FunctionName : uart1_write_char
* Description  : Internal used function
*                Do some special deal while tx char is '\r' or '\n'
* Parameters   : char c - character to tx
* Returns      : NONE
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
uart1_write_char(char c)
{
    if (c == '\n') {
        uart1_tx_one_char('\r');
        uart1_tx_one_char('\n');
    } else if (c == '\r') {
    } else {
        uart1_tx_one_char(c);
    }
}

/******************************************************************************
* FunctionName : uart0_rx_intr_handler
* Description  : Internal used function
*                UART0 interrupt handler, add self handle code inside
* Parameters   : void *para - point to ETS_UART_INTR_ATTACH's arg
* Returns      : NONE
*******************************************************************************/
LOCAL void
uart0_rx_intr_handler(void *para)
{
    /* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents
     * uart1 and uart0 respectively
     */
    RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;
    uint8 RcvChar;

    if (UART_RXFIFO_FULL_INT_ST != (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST)) {
        return;
    }

    WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);

    while (READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
        RcvChar = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;

        /* you can add your handle code below.*/

        *(pRxBuff->pWritePos) = RcvChar;

        // insert here for get one command line from uart
        if (RcvChar == '\r') {
            pRxBuff->BuffState = WRITE_OVER;
        }

        pRxBuff->pWritePos++;

        // if we hit the end of the buffer, loop back to the beginning
        if (pRxBuff->pWritePos == (pRxBuff->pRcvMsgBuff + RX_BUFF_SIZE)) {
            // overflow ...we may need more error handle here.
            pRxBuff->pWritePos = pRxBuff->pRcvMsgBuff ;
        }
    }
   system_os_post(user_procTaskPrio, 0, 0 );
}


/******************************************************************************
* FunctionName : uart0_tx_buffer
* Description  : use uart0 to transfer buffer
* Parameters   : uint8 *buf - point to send buffer
*                uint16 len - buffer len
* Returns      :
*******************************************************************************/
// void ICACHE_FLASH_ATTR
// uart0_tx_buffer(uint8 *buf, uint16 len)
// {
//     uint16 i;
//
//     for (i = 0; i < len; i++) {
//         uart_tx_one_char(buf[i]);
//     }
// }


int ICACHE_FLASH_ATTR uart0_rx_one_char() {
  if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
  int ret = *UartDev.rcv_buff.pReadPos;
  UartDev.rcv_buff.pReadPos++;
  if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
  }

  return ret;
}


/******************************************************************************
* FunctionName : uart_init
* Description  : user interface for init uart
* Parameters   : UartBautRate uart0_br - uart0 bautrate
*                UartBautRate uart1_br - uart1 bautrate
* Returns      : NONE
*******************************************************************************/
// void ICACHE_FLASH_ATTR
// uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
// {
//     // rom use 74880 baut_rate, here reinitialize
//     UartDev.baut_rate = uart0_br;
//     uart_config(UART0);
//     UartDev.baut_rate = uart1_br;
//     uart_config(UART1);
//     ETS_UART_INTR_ENABLE();
//
//     // install uart1 putc callback
//     os_install_putc1((void *)uart1_write_char);
// //    UartDev.rcv_buff.pWritePos = UartDev.rcv_buff.pRcvMsgBuff;
// //    UartDev.rcv_buff.pReadPos  = UartDev.rcv_buff.pRcvMsgBuff;
// }

всё это удовольствие компилируется. но!
не работает
static void ICACHE_FLASH_ATTR loop(os_event_t *events) {

int c = uart0_rx_one_char();
if(c == 0x30) {
os_printf("1\r\n");
}
if(c == 0x31) {
os_printf("2\r\n");
}
}
ничего не отправляет в ответ. светодиодом поморгать не могу. только уарт.
 
Ребят кто подскажет почему не принимаются и не обрабатываются байты?
я "нестандартную" функцию дописал. врое всё как в примере у esp8266 serial (UART0) tx/rx - 41J Blog
вот мой blinky.c
Код:
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
#include "key.h"
#include "c_types.h"
#include "time.h"
#include "mem.h"
#include "uart.h"



#define user_procTaskPrio        0
#define user_procTaskQueueLen    1
os_event_t    user_procTaskQueue[user_procTaskQueueLen];
static void loop(os_event_t *events);
LOCAL os_timer_t network_timer;

static volatile os_timer_t some_timer;

// void ICACHE_RAM_ATTR uart0_rx_intr_handler(void *para)
// ICACHE_RAM_ATTR ICACHE_FLASH_ATTR
static void ICACHE_FLASH_ATTR loop(os_event_t *events)
// static void ICACHE_RAM_ATTR loop(os_event_t *events)
{
  int c = uart0_rx_one_char();
  if(c == 0x30)
  {
   uart0_tx_buffer("0123456789", 10);
  }
  if(c == 0x31)
  {
   uart0_tx_buffer("9876543210", 10);
  }
  system_os_post(user_procTaskPrio, 0, 0 );
}

void some_timerfunc(void *arg)
{
  //debag i am alive
  os_printf("On working! \r\n");
}


void ICACHE_FLASH_ATTR user_init()
{
  // init gpio subsytem
  gpio_init();

  //uart_init
  uart_init(74400, 74400);
  os_printf("\r\n ESP8266 started!\r\n");
  wifi_set_opmode(0x00);
  os_printf("\r\n Wi-Fi off!\r\n");

  // setup timer (500ms, repeating)
  os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
  os_timer_arm(&some_timer, 1000, 1);

  system_os_task(loop, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen);
  system_os_post(user_procTaskPrio, 0, 0 );

}
что может быть не так?
 
это немного не то что мне требуется.
Это то .
В файле я дописал пару строк и создал массив . А в главном файле я этот массив обрабатываю . Если данные появились , то значит по юарт пришло что то.
Файл прикрепляю: Screenshot_2017-08-25-10-44-46-183_com.google.android.apps.docs.png
 
Сверху Снизу