`

java 串口通信

 
阅读更多
/***//****************************************** * 程序文件名称:SendComm.java *功能:从串行口COM1中发送数据 ******************************************/ importjava.awt.*; importjava.awt.event.*; importjava.io.*; importjava.util.*; importjavax.comm.*; classS_FrameextendsFrameimplementsRunnable,ActionListener ...{ /**//*检测系统中可用的通讯端口类*/ staticCommPortIdentifierportId; /**//*Enumeration为枚举型类,在util中*/ staticEnumerationportList; OutputStreamoutputStream; /**//*RS-232的串行口*/ SerialPortserialPort; ThreadreadThread; Panelp=newPanel(); TextFieldin_message=newTextField("打开COM1,波特率9600,数据位8,停止位1."); TextAreaout_message=newTextArea(); ButtonbtnOpen=newButton("打开串口,发送数据"); ButtonbtnClose=newButton("关闭串口,停止发送数据"); bytedata[]=newbyte[10240]; /**//*设置判断要是否关闭串口的标志*/ booleanmark; /**//*安排窗体*/ 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 /**//*点击按扭打开串口.*/ publicvoidactionPerformed(ActionEventevent)...{ 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 /**//*打开串口,并调用线程发送数据*/ publicvoidstart()...{ /**//*获取系统中所有的通讯端口*/ 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(PortInUseExceptione)...{} /**//*设置串口输出流*/ try...{ outputStream=serialPort.getOutputStream(); } catch(IOExceptione)...{} }//ifend }//ifend }//whileend /**//*调用线程发送数据*/ try...{ readThread=newThread(this); //线程负责每发送一次数据,休眠2秒钟 readThread.start(); } catch(Exceptione)...{} }//start()end /**//*发送数据,休眠2秒钟后重发*/ publicvoidrun()...{ /**//*设置串口通讯参数*/ try...{ serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch(UnsupportedCommOperationExceptione)...{} /**//*发送数据流(将数组data[]中的数据发送出去)*/ try...{ outputStream.write(data); } catch(IOExceptione)...{} /**//*发送数据后休眠2秒钟,然后再重发*/ try...{Thread.sleep(2000); if(mark) ...{return;//结束run方法,导致线程死亡 } start(); } catch(InterruptedExceptione)...{} }//run()end }//类S_Frameend publicclassSendComm ...{publicstaticvoidmain(Stringargs[]) ...{S_FrameS_win=newS_Frame(); S_win.addWindowListener(newWindowAdapter() ...{publicvoidwindowClosing(WindowEvente) ...{System.exit(0);} }); S_win.pack(); } }

/***//****************************************** * 程序文件名称:ReadComm.java *功能:从串行口COM1中接收数据 ******************************************/ importjava.awt.*; importjava.awt.event.*; importjava.io.*; importjava.util.*; importjavax.comm.*; classR_FrameextendsFrameimplementsRunnable,ActionListener,SerialPortEventListener ...{ /**//*检测系统中可用的通讯端口类*/ staticCommPortIdentifierportId; /**//*Enumeration为枚举型类,在java.util中*/ staticEnumerationportList; InputStreaminputStream; /**//*声明RS-232串行端口的成员变量*/ SerialPortserialPort; ThreadreadThread; Stringstr=""; TextFieldout_message=newTextField("上面文本框显示接收到的数据"); TextAreain_message=newTextArea(); ButtonbtnOpen=newButton("打开串口"); /**//*建立窗体*/ 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 /**//*点击按扭所触发的事件:打开串口,并监听串口.*/ publicvoidactionPerformed(ActionEventevent) ...{ /**//*获取系统中所有的通讯端口*/ 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(PortInUseExceptione)...{} /**//*设置串口监听器*/ try...{ serialPort.addEventListener(this); } catch(TooManyListenersExceptione)...{} /**//*侦听到串口有数据,触发串口事件*/ serialPort.notifyOnDataAvailable(true); }//ifend }//ifend }//whileend readThread=newThread(this); readThread.start();//线程负责每接收一次数据休眠20秒钟 }//actionPerformed()end /**//*接收数据后休眠20秒钟*/ publicvoidrun()...{ try...{ Thread.sleep(20000); } catch(InterruptedExceptione)...{} }//run()end /**//*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/ publicvoidserialEvent(SerialPortEventevent)...{ /**//*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/ try...{ serialPort.setSerialPortParams(9600,   SerialPort.DATABITS_8,   SerialPort.STOPBITS_1,   SerialPort.PARITY_NONE); } catch(UnsupportedCommOperationExceptione)...{   } byte[]readBuffer=newbyte[20]; try...{ inputStream=serialPort.getInputStream(); } catch(IOExceptione)...{} try...{    /**//*从线路上读取数据流*/ while(inputStream.available()>0)...{ intnumBytes=inputStream.read(readBuffer); }//whileend str=newString(readBuffer); /**//*接收到的数据存放到文本区中*/ in_message.append(str+" "); } catch(IOExceptione)...{} }//serialEvent()end }//类R_Frameend publicclassReadComm ...{ publicstaticvoidmain(Stringargs[]) ...{ /**//*实例化接收串口数据的窗体类*/ R_FrameR_win=newR_Frame(); /**//*定义窗体适配器的关闭按钮功能*/ R_win.addWindowListener(newWindowAdapter() ...{publicvoidwindowClosing(WindowEvente) ...{System.exit(0);} }); R_win.pack(); } }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics