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

Вопрос Как передать данные в UART1 через uart.write(1, "...")

Тема в разделе "NodeMCU", создана пользователем Grego, 16 янв 2020.

  1. Grego

    Grego Новичок

    Сообщения:
    2
    Симпатии:
    0
    NodeMCU custom builds, Lua

    Суть задачи в том что бы по UART1, где бы он не находился, передавать команды в другой МК, что бы туда не отправились команды от print() и прочий служебный мусор при загрузке модуля.
    Есть такая команда uart.write(1, "..."), которая должна направить данные в этот UART1. Но ничего никуда не приходит. По документации на esp-12s, UART1-TXD должен находиться на GPIO2, но осциллограф на этой ноге изменений не кажет, только высокий уровень. К тому же на этой ноге висит синий светодиод, он работает.
    Переключение uart.alt(1) или uart.alt(2) , перенаправляют вывод на GPIO15, то есть теперь туда идёт всё uart.write(0, "...") и print().
    В планах было разделить вывод на id=0 и id=1(на МК), но id=1 как будто бы не существует, только можно перенаправить вывод.

    Вопрос, у кого нибудь работает команда uart.write(1, "...")?
     
  2. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.239
    Симпатии:
    1.348
    uart.write(id, "...") раскладывается в Lua такой запрос:
    Код (C):
    1. // Send: version with and without mux
    2. void platform_uart_send( unsigned id, u8 data )
    3. {
    4.   uart_tx_one_char(id, data);
    5. }
    Он вызывает эту процедуру:
    Код (C):
    1. STATUS ICACHE_FLASH_ATTR
    2. uart_tx_one_char(uint8 uart, uint8 TxChar)
    3. {
    4.     if (uart == 0 && alt_uart0_tx) {
    5.       (*alt_uart0_tx)(TxChar);
    6.       return OK;
    7.     }
    8.  
    9.     while (true)
    10.     {
    11.       uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
    12.       if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
    13.         break;
    14.       }
    15.     }
    16.  
    17.     WRITE_PERI_REG(UART_FIFO(uart) , TxChar);
    18.     return OK;
    19. }
    Т.е. всё Ok.
    Вам необходимо либо правильно инициализировать нужную UART и правильно с ней работать в Lua или искать проблемы в своем "custom builds".
     
    Grego нравится это.
  3. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.239
    Симпатии:
    1.348
    Да, само разложение из uart.write(id, "...")
    Код (C):
    1. // Lua: write( id, string1, [string2], ..., [stringn] )
    2. static int l_uart_write( lua_State* L )
    3. {
    4.   int id;
    5.   const char* buf;
    6.   size_t len, i;
    7.   int total = lua_gettop( L ), s;
    8.  
    9.   id = luaL_checkinteger( L, 1 );
    10.   MOD_CHECK_ID( uart, id );
    11.   for( s = 2; s <= total; s ++ )
    12.   {
    13.     if( lua_type( L, s ) == LUA_TNUMBER )
    14.     {
    15.       len = lua_tointeger( L, s );
    16.       if( len > 255 )
    17.         return luaL_error( L, "invalid number" );
    18.       platform_uart_send( id, ( u8 )len );
    19.     }
    20.     else
    21.     {
    22.       luaL_checktype( L, s, LUA_TSTRING );
    23.       buf = lua_tolstring( L, s, &len );
    24.       for( i = 0; i < len; i ++ )
    25.         platform_uart_send( id, buf[ i ] );
    26.     }
    27.   }
    28.   return 0;
    29. }
    30. // Module function map
    31. LROT_BEGIN(uart)
    32.   LROT_FUNCENTRY( setup, l_uart_setup )
    33.   LROT_FUNCENTRY( getconfig, l_uart_getconfig )
    34.   LROT_FUNCENTRY( write, l_uart_write ) // <---- вот эта ассоциация "write" в процедуру "l_uart_write"
    35.   LROT_FUNCENTRY( on, l_uart_on )
    36.   LROT_FUNCENTRY( alt, l_uart_alt )
    37.   LROT_NUMENTRY( STOPBITS_1, PLATFORM_UART_STOPBITS_1 )
    38.   LROT_NUMENTRY( STOPBITS_1_5, PLATFORM_UART_STOPBITS_1_5 )
    39.   LROT_NUMENTRY( STOPBITS_2, PLATFORM_UART_STOPBITS_2 )
    40.   LROT_NUMENTRY( PARITY_NONE, PLATFORM_UART_PARITY_NONE )
    41.   LROT_NUMENTRY( PARITY_EVEN, PLATFORM_UART_PARITY_EVEN )
    42.   LROT_NUMENTRY( PARITY_ODD, PLATFORM_UART_PARITY_ODD )
    43. LROT_END( uart, NULL, 0 )
    44.  
    45.  
    46. NODEMCU_MODULE(UART, "uart", uart, NULL);
     
  4. Grego

    Grego Новичок

    Сообщения:
    2
    Симпатии:
    0
    Большое тебе спасибо добрый человек, ты будто телепатически мне мысль отправил. Буквально 2 минуты назад решил попробовать инициализировать uart.setup(1, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1) и всё заработало. 2 дня бился, уже пропали всякие надежды.
     

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