• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 дня бился, уже пропали всякие надежды.
 
Сверху Снизу