0

サーバー (ソケットを使用) に cisco デバイスが接続された com ポートが必要であるという調査があります。問題は、複数のスレッドを初期化できないことです。

これは、com ポートのスレッドを初期化する方法に関するコードです。

public CLI(String portName) {    
String driverName = "com.sun.comm.Win32Driver";
try{
    CommDriver commdriver = (CommDriver)Class.forName(driverName).newInstance( );
    commdriver.initialize();
}catch (Exception e2){}
portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {

    portId = (CommPortIdentifier) portList.nextElement();
    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        if (portId.getName().equals(portName)) {
            try{
            System.out.println("Welcome to " + portId.getName() + "!!");

            serialPort = (SerialPort) portId.open("COM", 2000);
            inputStream = serialPort.getInputStream();
            outputStream = serialPort.getOutputStream();
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);

            serialPort.setSerialPortParams(9600,
            SerialPort.DATABITS_8,
            SerialPort.STOPBITS_1,
            SerialPort.PARITY_NONE);
            serialPort.setFlowControlMode(1);
            }catch(Exception ex){}

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

 public void run() {
   }

public void send_msg(String line){
        try {
            outputStream.write((line + (char)13).getBytes());
            outputStream.flush();
        } catch (IOException e) {}

}

 public void serialEvent(SerialPortEvent event) {
    switch(event.getEventType()) {
    case SerialPortEvent.BI:
    case SerialPortEvent.OE:
    case SerialPortEvent.FE:
    case SerialPortEvent.PE:
    case SerialPortEvent.CD:
    case SerialPortEvent.CTS:
    case SerialPortEvent.DSR:
    case SerialPortEvent.RI:
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
    case SerialPortEvent.DATA_AVAILABLE:

        byte[] readBuffer = new byte[8];
    try {
        inputStream.reset();
        outputStream.flush();
    } catch (IOException ex) {
    }
        try {
            while (inputStream.available() > 0) {
                int numBytes = inputStream.read(readBuffer);
            }
            Cleaner = new String(readBuffer);

            for(int ctr = 0; ctr < 8; ctr++)
                if((Cleaner.charAt(ctr) >= 32 && Cleaner.charAt(ctr) <= 127))
                {
                    receiver += Cleaner.charAt(ctr);
                    //System.out.print(Cleaner.charAt(ctr));
                }
                else if(Cleaner.charAt(ctr) == (char)13){
                    //test_prov.sendMessage(receiver);
                    test_prov.send_broadcast(receiver);
                    System.out.print(receiver);
                    receiver = "";
                }

        } catch (IOException e) {}
        break;
    }
}

問題は、それらのうちの 2 つを初期化すると、そのうちの 1 つが読み取られないように見えることです。

返信をお待ちしております:)

4

2 に答える 2

0

メガビットの速度で通信していない場合は、マルチスレッドは必要ありません。10..100 ミリ秒間隔ですべてのポートをポーリングして、着信データを確認してください。

于 2013-10-21T19:52:54.787 に答える
0

Runnableすべてのスレッドに同じものを使用しています。そのランナブルは、1 つの COM ポートとの通信に使用される IO ストリームを保持します。複数のポートを処理するには、スレッドごとに特定の IO ストリームのセットが 1 つ必要です。当たりRunnable

これを処理する正しい方法は、スレッドを作成するロジックから通信を処理するロジックを分割することです。

于 2013-02-21T11:20:16.290 に答える