java 串口通信

/****************************************** * 程序文件名称:SendComm.java *  功能:从串行口COM1中发送数据 ******************************************/ import  java.awt. * ; import  java.awt.event. * ; import  java.io. * ; import  java.util. * ; import  javax.comm. * ;   class  S_Frame  extends  Frame  implements  Runnable,ActionListener   /*检测系统中可用的通讯端口类 */   static CommPortIdentifier      portId;    /*Enumeration 为枚举型类,在util中  */   static Enumeration             portList;    OutputStream                   outputStream;   /*RS-232的串行口  */   SerialPort                     serialPort;       Thread                         readThread;   Panel                          p=new Panel();   TextField in_message=new  TextField("打开COM1,波特率9600,数据位8,停止位1.");   TextArea  out_message=new TextArea();    Button    btnOpen=new Button("打开串口,   发送数据");   Button    btnClose=new Button("关闭串口, 停止发送数据");   byte      data[]=new byte[10240];     /*设置判断要是否关闭串口的标志*/   boolean   mark;  /*安排窗体*/  S_Frame()  super("串口发送数据");    setSize(200,200);    setVisible(true);    add(out_message,"Center");    add(p,"North");    p.add(btnOpen);    p.add(btnClose);    add(in_message,"South");    btnOpen.addActionListener(this);    btnClose.addActionListener(this);  } //R_Frame() end  /*点击按扭打开串口.*/  public void actionPerformed(ActionEvent event) {  if (event.getSource()==btnClose){       serialPort.close();//关闭串口       mark=true;  //用于中止线程的run()方法         in_message.setText("串口COM1已经关闭,停止发送数据.");    }  else {  mark=false;      /*从文本区按字节读取数据*/      data=out_message.getText().getBytes();         /*打开串口*/      start();         in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据.....");       }  } //actionPerformed() end   /*打开串口,并调用线程发送数据*/  public void start(){   /*获取系统中所有的通讯端口  */   portList=CommPortIdentifier.getPortIdentifiers();   /* 用循环结构找出串口 */   while (portList.hasMoreElements()){      /*强制转换为通讯端口类型*/     portId=(CommPortIdentifier)portList.nextElement();     if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){       if (portId.getName().equals("COM1")) {          /*打开串口 */         try { serialPort = (SerialPort) portId.open("ReadComm"2000);           }  catch (PortInUseException e) {  }            /*设置串口输出流*/         try outputStream = serialPort.getOutputStream();            }  catch (IOException e) {}       } //if end      } //if end    } //while end    /*调用线程发送数据*/   try     readThread = new Thread(this);     //线程负责每发送一次数据,休眠2秒钟  readThread.start(); }  catch (Exception e) {  }  }  //start() end     /*发送数据,休眠2秒钟后重发*/   public void run() {     /*设置串口通讯参数*/     try {          serialPort.setSerialPortParams(9600,                 SerialPort.DATABITS_8,                 SerialPort.STOPBITS_1,                 SerialPort.PARITY_NONE);         }  catch (UnsupportedCommOperationException e) {  }         /*发送数据流(将数组data[]中的数据发送出去)*/    try outputStream.write(data);    } catch (IOException e) {  }         /*发送数据后休眠2秒钟,然后再重发*/   try { Thread.sleep(2000);         if (mark)        {return;   //结束run方法,导致线程死亡        }        start();       }         catch (InterruptedException e) {  }    }  //run() end }    // 类S_Frame end public   class  SendComm {public static void main(String args[])  { S_Frame S_win=new S_Frame();    S_win.addWindowListener(new WindowAdapter()      {public void windowClosing(WindowEvent e)       {System.exit(0);   }      });    S_win.pack();  } }

 

 

/****************************************** * 程序文件名称:ReadComm.java *  功能:从串行口COM1中接收数据 ******************************************/ import  java.awt. * ; import  java.awt.event. * ; import  java.io. * ; import  java.util. * ; import  javax.comm. * ;   class  R_Frame  extends  Frame  implements  Runnable,ActionListener,SerialPortEventListener   /*  检测系统中可用的通讯端口类 */    static CommPortIdentifier     portId;       /*  Enumeration 为枚举型类,在java.util中  */    static Enumeration            portList;     InputStream                   inputStream;      /*  声明RS-232串行端口的成员变量  */    SerialPort     serialPort;        Thread         readThread;    String         str="";    TextField      out_message=new TextField("上面文本框显示接收到的数据");    TextArea       in_message=new TextArea();     Button         btnOpen=new Button("打开串口");  /*建立窗体*/  R_Frame()  {  super("串口接收数据");    setSize(200,200);    setVisible(true);    btnOpen.addActionListener(this);    add(out_message,"South");    add(in_message,"Center");    add(btnOpen,"North");  } //R_Frame() end  /*点击按扭所触发的事件:打开串口,并监听串口. */  public void actionPerformed(ActionEvent event)  {   /*获取系统中所有的通讯端口  */   portList=CommPortIdentifier.getPortIdentifiers();   /* 用循环结构找出串口 */   while (portList.hasMoreElements()){      /*强制转换为通讯端口类型*/     portId=(CommPortIdentifier)portList.nextElement();     if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){       if (portId.getName().equals("COM1")) {         try { serialPort = (SerialPort) portId.open("ReadComm"2000);        out_message.setText("已打开端口COM1 ,正在接收数据..... ");       }   catch (PortInUseException e) { }      /*设置串口监听器*/      try { serialPort.addEventListener(this); }          catch (TooManyListenersException e) { }         /* 侦听到串口有数据,触发串口事件*/      serialPort.notifyOnDataAvailable(true);       } //if end      } //if end    } //while end    readThread = new Thread(this);    readThread.start();//线程负责每接收一次数据休眠20秒钟  } //actionPerformed() end     /*接收数据后休眠20秒钟*/    public void run() {         try { Thread.sleep(20000);  }          catch (InterruptedException e) {  }    }  //run() end       /*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/    public void serialEvent(SerialPortEvent event) {    /*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/       try {            serialPort.setSerialPortParams(9600,                   SerialPort.DATABITS_8,                   SerialPort.STOPBITS_1,                   SerialPort.PARITY_NONE); }  catch (UnsupportedCommOperationException e) {   }   byte[] readBuffer = new byte[20];      try { inputStream = serialPort.getInputStream(); }         catch (IOException e) {} try {    /* 从线路上读取数据流 */          while (inputStream.available() > 0               int numBytes = inputStream.read(readBuffer);              }    //while end    str=new String(readBuffer);          /*接收到的数据存放到文本区中*/    in_message.append(str+" ");   }  catch (IOException e) {    }    } //serialEvent() end }    // 类R_Frame end public   class  ReadComm { public static void main(String args[])   {     /*  实例化接收串口数据的窗体类  */  R_Frame R_win=new R_Frame(); /*  定义窗体适配器的关闭按钮功能 */      R_win.addWindowListener(new WindowAdapter()              {public void windowClosing(WindowEvent e)                 {System.exit(0); }       });    R_win.pack();  } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值