Java的串口通信程序首先需要到到sun主页下载串口通信的包,因为一般的jrd中不含有这个包的,有点补丁的意思。(CSDN上也有)。解压缩,为了使JavaCommunicationsAPI能够正确的与Windows系统交互,需要几个小的技巧。下面是三个很重要的文件,你可以从Sun的网站上下载得到comm.jarwin32com.dlljavax.comm.properties对于JVM来说,要正确的识别串口,将这几个文件放在系统中合适的位置使很重要的。comm..jar应该放在以下目录中%JAVA_HOME%/lib%JAVA_HOME%/jre/lib/extwin32com.dll应该放在以下目录中%windir%system32javax.com.properties应该放在以下目录中%JAVA_HOME%/lib%JAVA_HOME%/jre/lib你可以通过编译和运行Sun的例程来验证串口是否可以使用了。JBuilder中安装安装JavaCommunicationAPI(以下在JBuilder2006中测试通过)如果你使用JBuilder,那么还需要为JBuilder配置API。一般来说,根据你的JBuilder配置,你也许需要将win32com.dll和javax.com.properties安装到相应的目录中,可以参照上述的目录。例如,如果你使用JBuilder附带的JVM的话,你也许需要将win32com.dll和javax.com.properties放到C:\Borland\JBuilder2006\jdk1.5的相应位置。我使用的是JCreator,在打开Configure,然后点击option,选中jdkprofile然后双击选中的jdk文件,选择edit,在弹出的窗口中选择串口通信包所在的文件(.jar文件),这样配置就算完成了。以下分别是接收和发送程序,CSDN上搜的,省的自己写了:发送程序: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_FrameendpublicclassSendComm{publicstaticvoidmain(Stringargs[]){S_FrameS_win=newS_Frame();S_win.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});S_win.pack();}}接收程序: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}//whileendreadThread=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.g