<%@ Language=JavaScript %> AKTINIY-->Работа с последовательными портами
 
           На начало  
Карта сайта
О себе
TINI ?
"Железо"
Справочник
Софт
Проекты
Документация
FAQ
Ссылки
Связь


Работа с последовательными портами S0-S3

 TINI поддерживает до 4х последовательных портов: S0-S4. В таблице даны сводные характеристики всех портов, с кусками схемотехники и примерами по их обслуживанию.

 

Порт

Выводы TINI Board

С контроллера           RS-232

Краткое описание

S0

Tx (TX): 21    Rx (XRX0): 22

Tx (TX232): 19   Rx (RX232): 20

Только программное управление потоком; Используется для работы «Serial Server», для связи TINI и JavaKit

S1

Tx (TX1): 14  Rx (XRX1): 15

Внешний формирователь

Только программное управление потоком; При использовании S1 невозможно использование внешней 1-Wire шины; Не поддерживаются скорости ниже 1200 бод (включительно)

S2

Использование внешнего UART’a

S3

Использование внешнего UART’a

 Последовательные порты Serial 2 (S2) и Serial 3 (S3) являются внешними по отношению к самой плате TINI и устанавливаются на «материнской» плате. Обычно используются чипы NS PC16552D. Адресное пространство PC16552D «расположено» в сегменте внешней памяти по адресам: 0x380028-0x38002F. При необходимости изменения адресного пространства можно использовать метод

com.dalsemi.system.TINIOS.setExternalSerialPortAddress (TINI API 1.02e)

com.dalsemi.system.TINIOS.SERIAL_EX_SET_PORT_ADDRESS (TINI API 1.11)

 Схемотехника этого решения является стандартной, обеспечивающей полный аппаратный контроль потока (flow control).Полную схему можно посмотреть в описании TINI Socket (EUROCARD).

Схема стандартных S2-S3 TINI

 

 Для примера покажем функцию получения информации о конфигурации портов, методы записи и чтения портов.

 

import java.util.Enumeration;

import javax.comm.CommPortIdentifier;

 

class PortLister {

         public static void main(String[] args) {

                   Enumeration ports = CommPortIdentifier.getPortIdentifiers();

                   while (ports.hasMoreElements()) {

                            System.out.println(((CommPortIdentifier)(ports.nextElement())).getName());

                   }

         }

}

 

В итоге выполнения PortLister получаем список доступных портов.

Результат работы PoreLister

 

Следует обратить внимание на то, что, этот список соответствует «логическим» портам, а не аппаратным, т.к. даже при реальном отсутствии S2-S3 Вы все равно получите тот же результат, что и при их наличии. Более подробно смотри…

 Далее рассмотрим примеры посылки «сообщений» из Slush на внешний терминал и прием информации с терминала:

 

1)     Подготовка к посылке «весточки». Снимаем джампер сброса, грузим терминалку, можно использовать стандартный HyperTerminal или MMTY, настраиваем параметры связи: 115200-N-8-1

2)     Берем программку

package Serial_out;

import javax.comm.*;

import java.io.*;

 

public class serial_writer {

 

  public serial_writer(String message) throws Exception {  //Constructor

 

  //Get the comm port identifier for serial0

  CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier("serial0");

 

  //Construct a SerialPort object

  SerialPort sp = (SerialPort)portID.open("outport",0);

 

  //Set serial port to 115200,N,8,1

  sp.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

 

  //Create an output stream from the SerialPort

  OutputStream out = sp.getOutputStream();

 

  //convert command line arg to a byte array and inject into the stream

  out.write(message.getBytes());

 

  }

 

  public static void main(String[] args) throws Exception {

    serial_writer serial_writer1 = new serial_writer( args[0] );

  }

}

компилим программу, загружаем ее в TINI, заходим Телнетом на TINI и останавливаем «последовательный» сервер

      downserver -s

иначе будут глюки…ну нет в ней обработчика исключений…

 

"Глюк" обработки исключений при "незагашенном" Serial Server

после чего запускаем прогу, в качестве аргумента которой задается само сообщение помещенное в скобки

          -         java serial_writer.tini "Privet ot akTINIy.narod.ru"

 и получаем вот такую картинку…

 

Принимаем "сообщение" от TINI

теперь примем сообщение с внешнего источника…( вот исходники)

package serial_in;

import javax.comm.*;

import java.io.*;

import java.lang.*;

 

public class serial_reader  {

 

  public serial_reader() throws Exception {

 

    System.out.println("Starting Program...");

 

    //Get the comm port identifier for serial0

    CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier("serial0");

 

    //Construct a SerialPort object

    SerialPort sp = (SerialPort)portID.open("outport",0);

 

    //Set serial port to 115200,N,8,1

    sp.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

 

    //get input stream from serial port

    InputStream in = sp.getInputStream();

 

    byte[] chars = new byte[1024];  //byte array to contain data from serial port

    int num_chars = 0;  //contains number of bytes recieved from serial port

    String output;      //contains data recieved, converted to string

 

    while (true) {   //loop endlessly

      num_chars = in.read(chars);  //read serial data into chars, length into num_chars

      if (num_chars > 0) {

        output = new String(chars, 0, num_chars);  //convert to String

        System.out.print(output);   //send to StdIO

      }

    }

  }

 

  public static void main(String[] args) throws Exception {

    serial_reader serial_reader1 = new serial_reader();

  }

}

 опять же, компилируем, загоняем в «машинку» и запускаем… не забудьте «тормознуть» Serial Server ( downservers)

 вот результат работы…

Сообщение принятое TINI

Теперь представим более сложный пример. Это нормальная терминальная программа для TINI. Чем она нам интересна, ну во первых примеров много не бывает, а во вторых в отличие от предыдущих примеров она корректно обрабатывает исключения, ведет и прием и передачу в порт, принимает параметры из командной строки, ну и соответственно принимает и передает информацию с системной консоли (System.in и System.out)

import java.io.*;

import javax.comm.*;

import java.util.TooManyListenersException;

import com.dalsemi.shell.server.SystemInputStream;

 

class TiniTerm extends Thread implements SerialPortEventListener {

  private SerialPort sp;

  private InputStream sin;

  private OutputStream sout;

 

  private TiniTerm(String portName, int baudRate)

    throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException, IOException {

 

    try {

      // Create SerialPort object for specified port

      sp = (SerialPort) CommPortIdentifier.getPortIdentifier(portName).open("TiniTerm", 5000);

      // Configure port for 8 databits, 1 stop bit and no parity checks

            sp.setSerialPortParams(baudRate, SerialPort.DATABITS_8,

                                   SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

    } catch (NoSuchPortException nsp) {

      System.out.println("Specified serial port ("+portName+") does not exist");

      throw nsp;

    } catch (PortInUseException piu) {

      System.out.println("Serial port "+portName+" is in use by another application");

      throw piu;

    } catch (UnsupportedCommOperationException usc) {

      System.out.println("Unable to configure port:"+portName);

      throw usc;

    }

 

    try {

      // Get input and output streams for serial data I/O

      sin = sp.getInputStream();

      sout = sp.getOutputStream();

    } catch (IOException ioe) {

      System.out.println("Unable to acquire I/O streams for port " + portName);

      throw ioe;

    }

  }

 

  public void run() {

    try {

      // Add 'this' object as a Serial port event listener

      // and request notification when receive data is available

      sp.addEventListener(this);

      sp.notifyOnDataAvailable(true);

    } catch (TooManyListenersException tml) {

      tml.printStackTrace();

      System.exit(1);

    }

   

    // Return as soon as any bytes are available

    // (i.e. don't wait for line termination)

    ((SystemInputStream) System.in).setRawMode(true);

 

    while (true) {

      try {

        byte b = (byte) System.in.read();

        if (b == (byte) '~')

          break;

        // Send the byte out the serial port

        sout.write(b);

      } catch (IOException ioe) {

        ioe.printStackTrace();

      }

    }

  }

 

  public void serialEvent(SerialPortEvent ev) {

    switch (ev.getEventType()) {

      case SerialPortEvent.DATA_AVAILABLE:

        try {

          int count = sin.available();

          if (count > 0) {

            byte[] buf = new byte[count];

            count = sin.read(buf, 0, count);

            System.out.write(buf, 0, count);

          }

        } catch (IOException ioe) {

          // Drain it

        }

        break;

 

      default:

        // Ignoring any unexpected events

        break;

    }

  }

 

  public static void main(String[] args) {

    if (args.length != 1) {

      System.out.println("Usage: java TiniTerm.tini data_rate");

      System.exit(1);

    }

 

    try {

      TiniTerm term = new TiniTerm("serial0", Integer.parseInt(args[0]));

      term.start();

    } catch (Exception e) {

      System.out.println(e.getMessage());

      e.printStackTrace();

    }

  }

}

 В результате получаем вот такую картинку:

Вот так работает TINI MiniTerm

 

Все эти примеры взяты из книги Дона Лумиса «The TINI Specification and Developers Guide». Если есть желание разобраться, да и в принципе другого пути нет, прочитайте книжку. По мере возможности я буду публиковать переводы, сейчас они пока мало пригодны для всеобщего обозрения.

 (C) 2002-2003 AK

 

| TINI? | Железо | Справочник | Софт | Проекты | Документация | FAQ | Связь |

Ссылки | На главную страницу

Используются технологии uCoz