2013-02-21 64 views
0

我们有需要一台服务器(使用套接字)有与连接到它的Cisco设备的COM端口进行研究。问题是我不能初始化多个线程。使用多线程与多串行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个。

期待一个答复:)

回答

0

您正在使用相同的Runnable为每个线程。这可运行保存用于与一个COM端口进行通信的IO流。为了处理多个端口,你必须有一组每个线程特定的IO流,即。每Runnable

处理此问题的正确方法是将处理通信的逻辑与创建线程的逻辑分开。

0

如果您不是以兆位速度进行通信,则不需要多线程 - 只需在10..100毫秒间隔内轮询所有端口,以获取传入数据。