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

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

Тема в разделе "SDK и создание собственных прошивок", создана пользователем Br.Misha, 7 дек 2016.

  1. Br.Misha

    Br.Misha Новичок

    Сообщения:
    50
    Симпатии:
    3
    Надо сделать прием данных по UART. Открыл sdout.c, там уже, вроде как всё готово:
    Код (C):
    1. LOCAL void
    2. uart0_rx_intr_handler(void *para)
    3. {
    4.     uint8 uart_no = UART0;
    5.  
    6.     if (UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST))
    7.     {
    8.         WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_RXFIFO_FULL_INT_CLR);
    9.     }
    10. }
    11.  
    12. void ICACHE_FLASH_ATTR stdoutInit() {
    13.  
    14.     /* rcv_buff size if 0x100 */
    15.     ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff));
    16.  
    17.     //Enable TxD pin
    18.     PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
    19.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
    20.  
    21.     //Set baud rate and other serial parameters to 115200,n,8,1
    22.     uart_div_modify(0, UART_CLK_FREQ/BIT_RATE_115200);
    23.     WRITE_PERI_REG(UART_CONF0(0), (STICK_PARITY_DIS)|(ONE_STOP_BIT << UART_STOP_BIT_NUM_S)| \
    24.             (EIGHT_BITS << UART_BIT_NUM_S));
    25.  
    26.     //Reset tx & rx fifo
    27.     SET_PERI_REG_MASK(UART_CONF0(0), UART_RXFIFO_RST|UART_TXFIFO_RST);
    28.     CLEAR_PERI_REG_MASK(UART_CONF0(0), UART_RXFIFO_RST|UART_TXFIFO_RST);
    29.  
    30.     //set rx fifo trigger
    31.     WRITE_PERI_REG(UART_CONF1(0),
    32.             ((0x01 & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S) |
    33.             ((0x01 & UART_RX_FLOW_THRHD) << UART_RX_FLOW_THRHD_S) |
    34.             UART_RX_FLOW_EN);
    35.  
    36.     //Install our own putchar handler
    37.     os_install_putc1((void *)stdoutPutchar);
    38.  
    39.     //clear all interrupt
    40.     WRITE_PERI_REG(UART_INT_CLR(0), 0xffff);
    41.  
    42.     //enable rx_interrupt
    43.     SET_PERI_REG_MASK(UART_INT_ENA(0), UART_RXFIFO_FULL_INT_ENA);
    44.  
    45.     ETS_UART_INTR_ENABLE();
    46. }
    Затем я внутри uart0_rx_intr_handler сделал инкремент определенной переменной. Передаю с терминала данные на rx модуля - переменная не инкрементируется и esp виснет, черед несколько сек происходит перезагрузка.
    Подскажите, пожалуйста, как организовать прием данных по юарту?
    PS: так же включен второй юарт, по нем данные только передаются.
    Спасибо!
     
  2. de1m

    de1m Новичок

    Сообщения:
    60
    Симпатии:
    1
    Вот так у меня работает.
    Инициализация (uart0 и uart1)
    Код (C):
    1. uart_init(BIT_RATE_9600,BIT_RATE_9600);
    Передача данных на uart0:
    Код (C):
    1. uart0_tx_buffer(cmd, sizeof(cmd));
    Приём:
    Сперва нужно приделать прерывание:
    Код (C):
    1.     system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
    2.     system_os_post(user_procTaskPrio, 0, 0 );
    Потом так (по одному знаку), по другому я тоже не знаю
    Код (C):
    1. static void ICACHE_FLASH_ATTR loop(os_event_t *events) {
    2.  
    3.   int c = uart0_rx_one_char();
    4. }
    Так я делаю на uart1 (GPIO02)
    Код (C):
    1. os_printf("Test");
     
  3. Br.Misha

    Br.Misha Новичок

    Сообщения:
    50
    Симпатии:
    3
    Спасибо! Уже разобрался)))
     
  4. Артемий

    Артемий Читатель

    Сообщения:
    166
    Симпатии:
    8
    Попробовал прикрутить код , ругается на это: " uart0_rx_one_char();"
    uart.h подключен . Но в нем я не нашел функции uart0_rx_one_char();
    какой файл надо подключить чтобы заработал код?
     
  5. de1m

    de1m Новичок

    Сообщения:
    60
    Симпатии:
    1
    Да, это и правда оказалась не стандартная функция.
    Вот она

    Код (C):
    1. int ICACHE_FLASH_ATTR uart0_rx_one_char() {
    2.   if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
    3.   int ret = *UartDev.rcv_buff.pReadPos;
    4.   UartDev.rcv_buff.pReadPos++;
    5.   if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    6.     UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
    7.   }
    8.  
    9.   return ret;
    10. }
    11.  
    Вопрос к знаю знающим, как правильно сделать приём данных стандартными средствами?
     
  6. Артемий

    Артемий Читатель

    Сообщения:
    166
    Симпатии:
    8
    Я уже решил задачу , я расковырял uart.c дописал немного его и теперь получаю строку.
     
  7. MegAlexandr

    MegAlexandr Новичок

    Сообщения:
    1
    Симпатии:
    0
    Здравствуйте Артемий! Могли бы Вы выложить код с вашими настройками и дополнениями связанными с UART?
     
  8. slavikb

    slavikb Новичок

    Сообщения:
    2
    Симпатии:
    0
    Все функции, которые могут вызываться в обработчиках прерываний, должны кэшироваться в оперативной памяти, для этого их нужно помечать атрибутом ICACHE_RAM_ATTR:
    Код (C):
    1. void ICACHE_RAM_ATTR uart0_rx_intr_handler(void *para)
     
    Последнее редактирование: 17 июн 2017
  9. slavikb

    slavikb Новичок

    Сообщения:
    2
    Симпатии:
    0
    Вот пример рабочего кода

    Код (C):
    1.  
    2. #include "esp8266_peri.h"
    3. #include "uart_register.h"
    4.  
    5.  
    6. // Инициализация:
    7. void init_uart()
    8. {
    9.   Serial.begin(2400);
    10.   // Установка порога - прерывание по приёму 1 байта
    11.  const uint32 conf1 = (1 << UART_RXFIFO_FULL_THRHD_S);
    12.   WRITE_PERI_REG(UART_CONF1(UART0), conf1);
    13.   //  Регистрация обработчика прерывания
    14.   ETS_UART_INTR_ATTACH(uart_int_handler, 0);
    15.   // Установка маски на прерывания от UART0 по приёму данных
    16.   WRITE_PERI_REG(UART_INT_ENA(UART0), UART_RXFIFO_FULL_INT_ENA);
    17.   // Разрешение прерываний от UART
    18.   ETS_UART_INTR_ENABLE();
    19. }
    20.  
    21. // Обработчик прерываний
    22.  
    23. void ICACHE_RAM_ATTR uart_int_handler(void *va)
    24. {
    25.   for (;;)
    26.   {
    27.     const uint32 uartIntStatus = READ_PERI_REG(UART_INT_ST(UART0));
    28.     if (uartIntStatus == 0)
    29.       break;
    30.  
    31.     if (CHECK_INT_STATUS(uartIntStatus, UART_RXFIFO_FULL_INT_ST))
    32.     {
    33.       // обработка прерывания по приёму данных
    34.       const uint32 fifoLen = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT;
    35.       for (uint32 i = 0; i < fifoLen; ++i)
    36.       {
    37.         const uint8 ch = READ_PERI_REG(UART_FIFO(UART0));
    38.         ProcessReceive(ch);
    39.       }
    40.       // очистка прерывания
    41.       WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
    42.     }
    43.   }
    44. }
    45.  
    46. // Функция ProcessReceive делает полезную работу.
    47. // Все функции, используемые в обработчиках прерываний должны иметь атрибут ICACHE_RAM_ATTR
    48.  
    49. void ICACHE_RAM_ATTR ProcessReceive(uint8 ch)
    50. {
    51. }
    52.  
     
  10. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    а что вы дописали и куда? вот ту функцию я добавил во все uart.c которые шли у меня с SDK. и не заработало.
    linux ubuntu. код правлю в атоме, компилирую make.
     
  11. de1m

    de1m Новичок

    Сообщения:
    60
    Симпатии:
    1
    Посмотрите вот этот файл, последняя функция
     
  12. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    так я это и дописал.
    вот только всё равно не компилируется.
    пишет
    undefined reference to `uart0_rx_one_char'
     
  13. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    что я вообще сделал:
    я взял проект из примеров blinky
    убрал всё что моргает.
    сделал
    код (раскрыть)
    Код (C):
    1. void ICACHE_FLASH_ATTR user_init()
    2. void ICACHE_FLASH_ATTR user_init()
    3. {
    4. #include "ets_sys.h"
    5. #include "osapi.h"
    6. #include "gpio.h"
    7. #include "os_type.h"
    8. #include "user_interface.h"
    9. #include "espconn.h"
    10. #include "key.h"
    11. #include "c_types.h"
    12. #include "time.h"
    13. #include "mem.h"
    14. #include "uart.h"
    15.  
    16. #define user_procTaskPrio        0
    17. #define user_procTaskQueueLen    1
    18. os_event_t    user_procTaskQueue[user_procTaskQueueLen];
    19. static void loop(os_event_t *events);
    20. LOCAL os_timer_t network_timer;
    21.  
    22.  
    23. static void ICACHE_FLASH_ATTR loop(os_event_t *events) {
    24.  
    25.     int c = uart0_rx_one_char();
    26. }
    27.  
    28. void ICACHE_FLASH_ATTR user_init()
    29. {
    30.   // init gpio subsytem
    31.   gpio_init();
    32.  
    33.   //uart_init
    34.   uart_init(74400, 74400);
    35.   os_printf("\r\n ESP8266 started!\r\n");
    36.   wifi_set_opmode(0x00);
    37.   os_printf("\r\n Wi-Fi off!\r\n");
    38.  
    39.   system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
    40.   system_os_post(user_procTaskPrio, 0, 0 );
    41.  
    42.  
    43. }
    44.  
    спотыкается на int c = uart0_rx_one_char(); когда делаю make

    Код (Text):
    1. $ make
    2. 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
    3. 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
    4. blinky.o:(.irom0.literal+0x0): undefined reference to `uart0_rx_one_char'
    5. blinky.o: In function `loop':
    6. blinky.c:(.irom0.text+0x6): undefined reference to `uart0_rx_one_char'
    7. collect2: error: ld returned 1 exit status
    8. <встроенное>: ошибка выполнения рецепта для цели «blinky»
    9. make: *** [blinky] Ошибка 1
    10.  

    вот сам make


    Раскрыть Спойлер
    Код (Text):
    1. CC = xtensa-lx106-elf-gcc
    2. #CFLAGS = -I. -mlongcalls
    3. 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
    4.  
    5. #LDLIBS = -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc
    6. 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
    7.  
    8. #LDFLAGS = -Teagle.app.v6.ld
    9. LDFLAGS = -Teagle.app.v6.move2rom.ld
    10.  
    11. blinky-0x00000.bin: blinky
    12.     esptool.py elf2image $^
    13.  
    14. blinky: blinky.o
    15.  
    16. blinky.o: blinky.c
    17.  
    18. flash: blinky-0x00000.bin
    19.     esptool.py write_flash 0 blinky-0x00000.bin 0x10000 blinky-0x10000.bin
    20.  
    21. clean:
    22.     rm -f blinky blinky.o blinky-0x00000.bin blinky-0x10000.bin
    23.  

    я решил пойти другим путём - поискать тот самый uart.с и uart.h которые надо изменить. пошёл по пути /home/sam/esp-open-sdk/sdk/driver_lib/include/driver и /home/sam/esp-open-sdk/sdk/include в первом было искомое. но добавление туда

    Код (Text):
    1. int ICACHE_FLASH_ATTR uart0_rx_one_char() {
    2.   if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
    3.   int ret = *UartDev.rcv_buff.pReadPos;
    4.   UartDev.rcv_buff.pReadPos++;
    5.   if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    6.     UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
    7.   }
    8.   return ret;
    9. }
    ничего не дало.
     
    Последнее редактирование: 24 авг 2017
  14. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    запустилось! вот в таком виде:
    вот сам blinky.c
    blinky.c (раскрыть)

    Код (C):
    1. #include "ets_sys.h"
    2. #include "osapi.h"
    3. #include "gpio.h"
    4. #include "os_type.h"
    5. #include "user_interface.h"
    6. #include "espconn.h"
    7. #include "key.h"
    8. #include "c_types.h"
    9. #include "time.h"
    10. #include "mem.h"
    11. #include "uart.h"
    12.  
    13.  
    14. #define UART0   0
    15. #define UART1   1
    16.  
    17. #define user_procTaskPrio        0
    18. #define user_procTaskQueueLen    1
    19. os_event_t    user_procTaskQueue[user_procTaskQueueLen];
    20. static void loop(os_event_t *events);
    21. LOCAL os_timer_t network_timer;
    22.  
    23.  
    24. static void ICACHE_FLASH_ATTR loop(os_event_t *events) {
    25.  
    26.   int c = uart0_rx_one_char();
    27.   if(c == 0x30) {
    28.    os_printf("1\r\n");
    29.   }
    30.   if(c == 0x31) {
    31.    os_printf("2\r\n");
    32.   }
    33. }
    34.  
    35.  
    36. void ICACHE_FLASH_ATTR user_init()
    37. {
    38.   // init gpio subsytem
    39.   gpio_init();
    40.  
    41.   //uart_init
    42.   uart_init(74400, 74400);
    43.   os_printf("\r\n ESP8266 started!\r\n");
    44.   wifi_set_opmode(0x00);
    45.   os_printf("\r\n Wi-Fi off  2  !\r\n");
    46.  
    47.   system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
    48.   system_os_post(user_procTaskPrio, 0, 0 );
    49.  
    50. }
    51.  


    Makefile (раскрыть)

    Код (C):
    1. CC = xtensa-lx106-elf-gcc
    2. #CFLAGS = -I. -mlongcalls
    3. 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
    4.  
    5. #LDLIBS = -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc
    6. 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
    7.  
    8. #LDFLAGS = -Teagle.app.v6.ld
    9. LDFLAGS = -Teagle.app.v6.move2rom.ld
    10.  
    11.  
    12. blinky-0x00000.bin: blinky
    13.     esptool.py elf2image $^
    14.  
    15. blinky: blinky.o
    16. blinky: uart.o
    17. #
    18. blinky.o: blinky.c
    19. blinky.o: uart.c
    20.  
    21. flash: blinky-0x00000.bin
    22.     esptool.py write_flash 0 blinky-0x00000.bin 0x10000 blinky-0x10000.bin
    23.  
    24. clean:
    25.     rm -f blinky blinky.o blinky-0x00000.bin blinky-0x10000.bin
    26.  


    uart.c и uart.h были взяты вот отсюда: esp8266 serial (UART0) tx/rx - 41J Blog
    вот uart.c
    uart.c (раскрыть)

    Код (Text):
    1. /******************************************************************************
    2. * Copyright 2013-2014 Espressif Systems (Wuxi)
    3. *
    4. * FileName: uart.c
    5. *
    6. * Description: Two UART mode configration and interrupt handler.
    7. *              Check your hardware connection while use this mode.
    8. *
    9. * Modification history:
    10. *     2014/3/12, v1.0 create this file.
    11. *******************************************************************************/
    12. #include "ets_sys.h"
    13. #include "osapi.h"
    14. #include "uart.h"
    15.  
    16. #define UART0   0
    17. #define UART1   1
    18.  
    19. // UartDev is defined and initialized in rom code.
    20. extern UartDevice UartDev;
    21.  
    22. LOCAL void uart0_rx_intr_handler(void *para);
    23. #define user_procTaskPrio        0
    24.  
    25. /******************************************************************************
    26. * FunctionName : uart_config
    27. * Description  : Internal used function
    28. *                UART0 used for data TX/RX, RX buffer size is 0x100, interrupt enabled
    29. *                UART1 just used for debug output
    30. * Parameters   : uart_no, use UART0 or UART1 defined ahead
    31. * Returns      : NONE
    32. *******************************************************************************/
    33. LOCAL void ICACHE_FLASH_ATTR
    34. uart_config(uint8 uart_no)
    35. {
    36.     if (uart_no == UART1) {
    37.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
    38.     } else {
    39.         /* rcv_buff size if 0x100 */
    40.         ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff));
    41.         PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
    42.         PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
    43.     }
    44.  
    45.     uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));
    46.  
    47.     WRITE_PERI_REG(UART_CONF0(uart_no),    UartDev.exist_parity
    48.                    | UartDev.parity
    49.                    | (UartDev.stop_bits << UART_STOP_BIT_NUM_S)
    50.                    | (UartDev.data_bits << UART_BIT_NUM_S));
    51.  
    52.  
    53.     //clear rx and tx fifo,not ready
    54.     SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
    55.     CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
    56.  
    57.     //set rx fifo trigger
    58.     WRITE_PERI_REG(UART_CONF1(uart_no), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S);
    59.  
    60.     //clear all interrupt
    61.     WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);
    62.     //enable rx_interrupt
    63.     SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA);
    64. }
    65.  
    66. /******************************************************************************
    67. * FunctionName : uart1_tx_one_char
    68. * Description  : Internal used function
    69. *                Use uart1 interface to transfer one char
    70. * Parameters   : uint8 TxChar - character to tx
    71. * Returns      : OK
    72. *******************************************************************************/
    73. LOCAL STATUS ICACHE_FLASH_ATTR
    74. uart1_tx_one_char(uint8 TxChar)
    75. {
    76.     while (true)
    77.     {
    78.         uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(UART1)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
    79.         if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
    80.             break;
    81.         }
    82.     }
    83.  
    84.     WRITE_PERI_REG(UART_FIFO(UART1) , TxChar);
    85.     return OK;
    86. }
    87.  
    88. /******************************************************************************
    89. * FunctionName : uart1_write_char
    90. * Description  : Internal used function
    91. *                Do some special deal while tx char is '\r' or '\n'
    92. * Parameters   : char c - character to tx
    93. * Returns      : NONE
    94. *******************************************************************************/
    95. LOCAL void ICACHE_FLASH_ATTR
    96. uart1_write_char(char c)
    97. {
    98.     if (c == '\n') {
    99.         uart1_tx_one_char('\r');
    100.         uart1_tx_one_char('\n');
    101.     } else if (c == '\r') {
    102.     } else {
    103.         uart1_tx_one_char(c);
    104.     }
    105. }
    106.  
    107. /******************************************************************************
    108. * FunctionName : uart0_rx_intr_handler
    109. * Description  : Internal used function
    110. *                UART0 interrupt handler, add self handle code inside
    111. * Parameters   : void *para - point to ETS_UART_INTR_ATTACH's arg
    112. * Returns      : NONE
    113. *******************************************************************************/
    114. LOCAL void
    115. uart0_rx_intr_handler(void *para)
    116. {
    117.     /* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents
    118.      * uart1 and uart0 respectively
    119.      */
    120.     RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;
    121.     uint8 RcvChar;
    122.  
    123.     if (UART_RXFIFO_FULL_INT_ST != (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST)) {
    124.         return;
    125.     }
    126.  
    127.     WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
    128.  
    129.     while (READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
    130.         RcvChar = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
    131.  
    132.         /* you can add your handle code below.*/
    133.  
    134.         *(pRxBuff->pWritePos) = RcvChar;
    135.  
    136.         // insert here for get one command line from uart
    137.         if (RcvChar == '\r') {
    138.             pRxBuff->BuffState = WRITE_OVER;
    139.         }
    140.  
    141.         pRxBuff->pWritePos++;
    142.  
    143.         // if we hit the end of the buffer, loop back to the beginning
    144.         if (pRxBuff->pWritePos == (pRxBuff->pRcvMsgBuff + RX_BUFF_SIZE)) {
    145.             // overflow ...we may need more error handle here.
    146.             pRxBuff->pWritePos = pRxBuff->pRcvMsgBuff ;
    147.         }
    148.     }
    149.    system_os_post(user_procTaskPrio, 0, 0 );
    150. }
    151.  
    152.  
    153. /******************************************************************************
    154. * FunctionName : uart0_tx_buffer
    155. * Description  : use uart0 to transfer buffer
    156. * Parameters   : uint8 *buf - point to send buffer
    157. *                uint16 len - buffer len
    158. * Returns      :
    159. *******************************************************************************/
    160. // void ICACHE_FLASH_ATTR
    161. // uart0_tx_buffer(uint8 *buf, uint16 len)
    162. // {
    163. //     uint16 i;
    164. //
    165. //     for (i = 0; i < len; i++) {
    166. //         uart_tx_one_char(buf[i]);
    167. //     }
    168. // }
    169.  
    170.  
    171. int ICACHE_FLASH_ATTR uart0_rx_one_char() {
    172.   if(UartDev.rcv_buff.pReadPos == UartDev.rcv_buff.pWritePos) return -1;
    173.   int ret = *UartDev.rcv_buff.pReadPos;
    174.   UartDev.rcv_buff.pReadPos++;
    175.   if(UartDev.rcv_buff.pReadPos == (UartDev.rcv_buff.pRcvMsgBuff + RX_BUFF_SIZE)) {
    176.     UartDev.rcv_buff.pReadPos = UartDev.rcv_buff.pRcvMsgBuff;
    177.   }
    178.  
    179.   return ret;
    180. }
    181.  
    182.  
    183. /******************************************************************************
    184. * FunctionName : uart_init
    185. * Description  : user interface for init uart
    186. * Parameters   : UartBautRate uart0_br - uart0 bautrate
    187. *                UartBautRate uart1_br - uart1 bautrate
    188. * Returns      : NONE
    189. *******************************************************************************/
    190. // void ICACHE_FLASH_ATTR
    191. // uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
    192. // {
    193. //     // rom use 74880 baut_rate, here reinitialize
    194. //     UartDev.baut_rate = uart0_br;
    195. //     uart_config(UART0);
    196. //     UartDev.baut_rate = uart1_br;
    197. //     uart_config(UART1);
    198. //     ETS_UART_INTR_ENABLE();
    199. //
    200. //     // install uart1 putc callback
    201. //     os_install_putc1((void *)uart1_write_char);
    202. // //    UartDev.rcv_buff.pWritePos = UartDev.rcv_buff.pRcvMsgBuff;
    203. // //    UartDev.rcv_buff.pReadPos  = UartDev.rcv_buff.pRcvMsgBuff;
    204. // }
    205.  


    всё это удовольствие компилируется. но!
    не работает
    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");
    }
    }
    ничего не отправляет в ответ. светодиодом поморгать не могу. только уарт.
     
  15. Артемий

    Артемий Читатель

    Сообщения:
    166
    Симпатии:
    8
    Sam_Arcanum нравится это.
  16. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    Ребят кто подскажет почему не принимаются и не обрабатываются байты?
    я "нестандартную" функцию дописал. врое всё как в примере у esp8266 serial (UART0) tx/rx - 41J Blog
    вот мой blinky.c
    blinky.c (раскрыть)

    Код (C):
    1. #include "ets_sys.h"
    2. #include "osapi.h"
    3. #include "gpio.h"
    4. #include "os_type.h"
    5. #include "user_interface.h"
    6. #include "espconn.h"
    7. #include "key.h"
    8. #include "c_types.h"
    9. #include "time.h"
    10. #include "mem.h"
    11. #include "uart.h"
    12.  
    13.  
    14.  
    15. #define user_procTaskPrio        0
    16. #define user_procTaskQueueLen    1
    17. os_event_t    user_procTaskQueue[user_procTaskQueueLen];
    18. static void loop(os_event_t *events);
    19. LOCAL os_timer_t network_timer;
    20.  
    21. static volatile os_timer_t some_timer;
    22.  
    23. // void ICACHE_RAM_ATTR uart0_rx_intr_handler(void *para)
    24. // ICACHE_RAM_ATTR ICACHE_FLASH_ATTR
    25. static void ICACHE_FLASH_ATTR loop(os_event_t *events)
    26. // static void ICACHE_RAM_ATTR loop(os_event_t *events)
    27. {
    28.   int c = uart0_rx_one_char();
    29.   if(c == 0x30)
    30.   {
    31.    uart0_tx_buffer("0123456789", 10);
    32.   }
    33.   if(c == 0x31)
    34.   {
    35.    uart0_tx_buffer("9876543210", 10);
    36.   }
    37.   system_os_post(user_procTaskPrio, 0, 0 );
    38. }
    39.  
    40. void some_timerfunc(void *arg)
    41. {
    42.   //debag i am alive
    43.   os_printf("On working! \r\n");
    44. }
    45.  
    46.  
    47. void ICACHE_FLASH_ATTR user_init()
    48. {
    49.   // init gpio subsytem
    50.   gpio_init();
    51.  
    52.   //uart_init
    53.   uart_init(74400, 74400);
    54.   os_printf("\r\n ESP8266 started!\r\n");
    55.   wifi_set_opmode(0x00);
    56.   os_printf("\r\n Wi-Fi off!\r\n");
    57.  
    58.   // setup timer (500ms, repeating)
    59.   os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
    60.   os_timer_arm(&some_timer, 1000, 1);
    61.  
    62.   system_os_task(loop, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen);
    63.   system_os_post(user_procTaskPrio, 0, 0 );
    64.  
    65. }
    66.  

    что может быть не так?
     
  17. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    это немного не то что мне требуется. и там этой "нестандартной" функции нет. если ткнёте в конкретныу строку сказав "вот это принимает по UART" буду очень благодарен!
     
  18. Артемий

    Артемий Читатель

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

    Артемий Читатель

    Сообщения:
    166
    Симпатии:
    8
  20. Sam_Arcanum

    Sam_Arcanum Новичок

    Сообщения:
    101
    Симпатии:
    0
    У тебя встроенные АТ команды или сам прописал?
    upd:
    открыл файл. нормально так.
    по сути у тебя свой командный инрепретатор на If'ах тоже хорошо.
     

Поделиться этой страницей