java从串口读取固定数据_java 串口编程—-设置缓冲屈来读取串口数据 | 学步园...

该博客介绍了如何使用Java进行串口通信,通过SerialBean类初始化串口并设置参数,利用SerialBuffer类作为缓冲区读取指定长度的数据,以及ReadSeriral线程实时读取串口输入流。示例代码展示了如何从串口读取数据并回写到串口。
摘要由CSDN通过智能技术生成

package test;

import java.io.InputStream;

import java.io.OutputStream;

import javax.comm.CommPortIdentifier;

import javax.comm.SerialPort;

//串口操作主类

public class SerialBean {

static String portName;

CommPortIdentifier portId;

SerialPort serialPort;

static InputStream in;

static OutputStream out;

SerialBuffer sb;

ReadSeriral rt;

public SerialBean(int portId){

portName="COM"+String.valueOf(portId);

}

public int Initialize(){

int initsuccess=1;

int initfail=-1;

try {

portId=CommPortIdentifier.getPortIdentifier(portName);

try {

serialPort=(SerialPort)portId.open("serial_communication",2000);

in=serialPort.getInputStream();

out=serialPort.getOutputStream();

serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

} catch (Exception e) {

System.out.println("初始化串口失败!");

return initfail;

}

sb=new SerialBuffer();

rt=new ReadSeriral(sb,in);

rt.start();

return initsuccess;

} catch (Exception e) {

System.out.print("初始化串口失败!");

return initfail;

}

}

public String ReadPort(int length){

String msg="";

msg=sb.getMsg(length);

return msg;

}

public void WritePort(String msg){

try {

for(int i=0;i

out.write(msg.charAt(i));

}

} catch (Exception e) {

e.printStackTrace();

}

}

public void ClosePort(){

try {

rt.stop();

serialPort.close();

} catch (Exception e) {

e.printStackTrace();

}

}

public String getPortName(){

return portName;

}

public static void main(String[] args) {

SerialBean sb=new SerialBean(1);

String msg;

sb.Initialize();

System.out.println("串口"+sb.getPortName()+"初始化成功!");

for (int i = 5; i <= 10; i++) {

msg=sb.ReadPort(i);

sb.WritePort("reply:"+msg);

}

sb.ClosePort();

}

}

=============================================================================

package test;

public class SerialBuffer {

private String contentString="";

private String currentMsg,tempContent;

private boolean available=false;

private int lengthNeeded=1;

public synchronized String getMsg(int length) {

lengthNeeded=length;

notifyAll();

if(lengthNeeded>contentString.length()){

available=false;

while(available==false){

try {

wait();

} catch (Exception e) {

e.printStackTrace();

}

}

}

currentMsg=contentString.substring(0,lengthNeeded);

tempContent=contentString.substring(lengthNeeded);

contentString=tempContent;

lengthNeeded=1;

notifyAll();

return currentMsg;

}

public synchronized void putChar(int c) {

Character d=new Character((char)c);

contentString=contentString.concat(d.toString());

if(lengthNeeded

available=true;

}

notifyAll();

}

}

===================================================================

package test;

import java.io.InputStream;

public class ReadSeriral extends Thread{

private SerialBuffer commBuffer;

private InputStream commPort;

public ReadSeriral(SerialBuffer sb,InputStream port){

commBuffer=sb;

commPort=port;

}

public void run(){

int c;

try {

while(true){

c=commPort.read();

commBuffer.putChar(c);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值