Учебник 4
Потоки. Массивы. UART

InputStream и OutputStream

Классы InputStream и OutputStream в пакете mcujavasource.mcu.io похожи на стандартные классы из java.io. Сейчас потоки (stream) используются для UART, они не закрываются, значит, у них нет метода close() (позже это может измениться). Особенность переводчика для AVR: не используйте getInputStream(), если ни один из методов read() или available(), или skip() не вызывается в программе (получится плохое прерывание, и МК будет постоянно сбрасываться). Если прием данных по UART не нужен, уберите из программы упоминание про приемник (метод getInputStream()).

Reader и Writer

Классов Reader и Writer нет в МК. Поддержка кодировок не реализована (используется только кодировка по умолчанию). Она не вмещается в микроконтроллер. Вместо буферизированных Reader и Writer есть BufferedInputStream и BufferedOutputStream

Массивы

Массивы в Java всегда нужно инициализировать. В MCU Java source массивы обязательно нужно определять и инициализировать в одном операторе:

int[] numberArray = new int[20]; //numberArray имеет 20 элементов
int array2[] = new int[10]; //array2 имеет 10 элементов

UART-попугай

Принимает данные из терминала, и когда нажимают Enter (символ '\n') или размер текста доходит до максимального, передает назад фразу "You entered ", затем принятый текст.

Вместо текста "You entered " можно ввести свой, например "Повторяю ещё раз: ", "И я подумал: " и т. п.

import mcujavasource.mcu.*;
import mcujavasource.mcu.io.*;

/** Учебник 4: UART repeater.
 * Receives text from a terminal and when Enter is pressed ('\n' char) or
 * maximum text size is reached, transmits back "You entered ",
 * then the text received.
 * Uart speed = 4800 bps at 1 MHz MCU clock frequency, 38400 bps at 8 MHz.
 * Uart settings: 8 bits character, no parity, one stop bit.
 * Maximum text size is 32 chars.
 */
public class Tutorial4 extends Microcontroller
{
  private static final String HELLO = "Hello from Java!\r\n";
  private static final String BEROFE_TEXT = "You entered '";
  private static final String AFTER_TEXT = "'.\r\n";
  
  private UartInputStream uartInput;
  private UartOutputStream uartOutput;
  
  private byte[] buffer = new byte[32];
  /** Buffer limit */
  private int limit = 0;
  
  public void init()
  { //register initialization on startup
    Uart uart = getHardware().getDefaultUart();
    uart.init(25, true, 8, Uart.Parity.NONE, false);
    uartInput = uart.getInputStream();
    uartOutput = uart.getOutputStream();
  }
  
  public void start()
  { //main program
    getHardware().setInterruptsEnabled(true);
    uartOutput.write(HELLO);
    while(true)
    { limit = 0;
      byte b;
      do
      { b = (byte) uartInput.read();
        buffer[limit++] = b;
      }
      while(b != '\n' && limit < 32);
      uartOutput.write(BEROFE_TEXT);
      int position;
      for(position = 0; position < limit; position++)
      { uartOutput.write(buffer[position]);
      }
      uartOutput.write(AFTER_TEXT);
    }
  }
  
}

Скачать файл исходного кода программы