Работа с
последовательными портами
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).
Для
примера покажем функцию получения информации о конфигурации портов,
методы записи и чтения портов.
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 получаем список доступных портов.
Следует обратить
внимание на то, что, этот список соответствует «логическим» портам, а не
аппаратным, т.к. даже при реальном отсутствии
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
иначе будут глюки…ну нет в ней обработчика исключений…
после чего запускаем прогу, в качестве аргумента которой
задается само сообщение помещенное в скобки
-
java serial_writer.tini "Privet ot akTINIy.narod.ru"
и получаем вот такую картинку…
теперь примем
сообщение с внешнего источника…( вот
исходники)
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 (
downserver –s)
вот
результат работы…
Теперь представим
более сложный пример. Это нормальная
терминальная программа для
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();
}
}
}
В
результате получаем вот такую картинку:
Все эти примеры
взяты из книги Дона Лумиса «The
TINI™
Specification
and
Developer’s
Guide». Если есть желание разобраться, да и в принципе другого пути нет,
прочитайте книжку. По мере возможности я буду публиковать переводы,
сейчас они пока мало пригодны для всеобщего обозрения.
(C)
2002-2003 AK
|