• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

Grego

New member
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, "...")?
 

pvvx

Активный участник сообщества
uart.write(id, "...") раскладывается в Lua такой запрос:
Код:
// Send: version with and without mux
void platform_uart_send( unsigned id, u8 data )
{
  uart_tx_one_char(id, data);
}
Он вызывает эту процедуру:
Код:
STATUS ICACHE_FLASH_ATTR
uart_tx_one_char(uint8 uart, uint8 TxChar)
{
    if (uart == 0 && alt_uart0_tx) {
      (*alt_uart0_tx)(TxChar);
      return OK;
    }

    while (true)
    {
      uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
      if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
        break;
      }
    }

    WRITE_PERI_REG(UART_FIFO(uart) , TxChar);
    return OK;
}
Т.е. всё Ok.
Вам необходимо либо правильно инициализировать нужную UART и правильно с ней работать в Lua или искать проблемы в своем "custom builds".
 

pvvx

Активный участник сообщества
Да, само разложение из uart.write(id, "...")
Код:
// Lua: write( id, string1, [string2], ..., [stringn] )
static int l_uart_write( lua_State* L )
{
  int id;
  const char* buf;
  size_t len, i;
  int total = lua_gettop( L ), s;

  id = luaL_checkinteger( L, 1 );
  MOD_CHECK_ID( uart, id );
  for( s = 2; s <= total; s ++ )
  {
    if( lua_type( L, s ) == LUA_TNUMBER )
    {
      len = lua_tointeger( L, s );
      if( len > 255 )
        return luaL_error( L, "invalid number" );
      platform_uart_send( id, ( u8 )len );
    }
    else
    {
      luaL_checktype( L, s, LUA_TSTRING );
      buf = lua_tolstring( L, s, &len );
      for( i = 0; i < len; i ++ )
        platform_uart_send( id, buf[ i ] );
    }
  }
  return 0;
}
// Module function map
LROT_BEGIN(uart)
  LROT_FUNCENTRY( setup, l_uart_setup )
  LROT_FUNCENTRY( getconfig, l_uart_getconfig )
  LROT_FUNCENTRY( write, l_uart_write ) // <---- вот эта ассоциация "write" в процедуру "l_uart_write"
  LROT_FUNCENTRY( on, l_uart_on )
  LROT_FUNCENTRY( alt, l_uart_alt )
  LROT_NUMENTRY( STOPBITS_1, PLATFORM_UART_STOPBITS_1 )
  LROT_NUMENTRY( STOPBITS_1_5, PLATFORM_UART_STOPBITS_1_5 )
  LROT_NUMENTRY( STOPBITS_2, PLATFORM_UART_STOPBITS_2 )
  LROT_NUMENTRY( PARITY_NONE, PLATFORM_UART_PARITY_NONE )
  LROT_NUMENTRY( PARITY_EVEN, PLATFORM_UART_PARITY_EVEN )
  LROT_NUMENTRY( PARITY_ODD, PLATFORM_UART_PARITY_ODD )
LROT_END( uart, NULL, 0 )


NODEMCU_MODULE(UART, "uart", uart, NULL);
 

Grego

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