Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Обработка исключ. ситуаций при обмене по СОМ порту


Автор: Regbist 10.4.2006, 14:50
Здравсвуйте. Ситуация следующая. Есть переходник USB-COM, который с со строны USB подключается к компьютеру а со стороны COM подключается к устройству. На программе ява реализованно что в главном потоке посылаются команды к устройству, а в другом созданном потоке принимаются данные от устройство. Необходимо что бы была правильно отработана ситуация когда пользователь выдернул шнур Usb-Com(тоесть система потеряла COM порт). Подскажите как это реализовать.
У меня получилось что при передачи все отлично, там есть обработка исключения. а при приеме такого нет и программа пишет в консоль WaitCommEvent: Error 5. ЧТО ДЕЛАТЬ?

Автор: LSD 10.4.2006, 16:19
Анализируешь полученное в пишущем потоке исключение, если это обрыв связи, то информируешь об этом читающий поток.

Автор: Regbist 10.4.2006, 17:07
я где то себе так это и представляю. Я пытался анализировать там где функция
public void serialEvent(SerialPortEvent event) {
}
но туда она даже не заходит. Как событие перехватить? Если не сложно то простенький пример этого, буду очень признателен. А то меня уже тянет на написание своей библиотеки на winApi но это долго муторно и ни кому не нужно

Автор: LSD 10.4.2006, 17:12
Ты используешь Java COMM API?

Автор: Regbist 11.4.2006, 11:46
Да я использую Java COMM API. Смотрел я что происходит с программами которые поставляются с COMM API(Sample), там после отрыва USB программа виснет.((((

Автор: LSD 11.4.2006, 14:22
У меня нет под рукой самого API, но по идее это должно выглядеть так:
Код
import java.io.*;
import java.util.*;
import javax.comm.*;

public class Read implements Runnable, SerialPortEventListener
{
  private InputStream inputStream;
  private SerialPort serialPort;
  private Thread readThread;
  private boolean running;
  private Object LOCK = new Object();

  public SimpleRead(CommPortIdentifier portId)
  {
    try
    {
      serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
      inputStream = serialPort.getInputStream();
    }
    catch(Exception e)
    {}

    serialPort.notifyOnDataAvailable(true);

    try
    {
      serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    }
    catch(UnsupportedCommOperationException e)
    {}

    readThread = new Thread(this);
    running = true;
    readThread.start();
  }

  public void run()
  {
    try
    {
      serialPort.addEventListener(this);
    }
    catch(TooManyListenersException e)
    {}
    while(running)
    {
      synchronized(LOCK)
      {
        try
        {
          LOCK.wait();
        }
        catch(InterruptedException e)
        {}
      }
    }
    try
    {
      serialPort.removeEventListener(this);
    }
    catch(TooManyListenersException e)
    {}
  }

  public void stop()
  {
    synchronized(LOCK)
    {
      this.running = false;
      LOCK.notifyAll();
    }
  }

  public void serialEvent(SerialPortEvent event)
  {
    //process event
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)