一个Java读取串口值的类(收藏)

    技术2022-05-11  62

    这是一个通过JAVA的扩展包(javax.comm)从串口读取值的类,  本类库(javax.comm)主要包括: SerialBean.java (与其他应用程序的接口),  SerialBuffer.java (用来保存从串口所接收数据的缓冲区),  ReadSerial.java (从串口读取数据的程序)。

     整个类的设计思路大概就是: 实现一个线程一直在监听串口中是否有数据传送过来, 如果有的话开始拍照,并取得照片后,直接打印出来。因为涉及到商业秘密,所以拍照函数和取得照片函数采用的是空函数,请见谅! 若要运行此函数必须下载该扩展包,并加载到你的CLASSPATH下。当然,你若要测试并运行此类的话。可能要花费不少的精力。 如果你只有一台机器,你可以利用一条RS-232电缆将COM1和COM2连接起来,在COM1上运行SerialExample,在COM2上运行Windows提供的超级终端程序。 如果你有两台机器的话,你可以利用一条RS-232电缆将两台机器的COM1(或者是COM2)连接起来,在一端运行例程,另外一端运行Windows提供的超级终端程序。 该类有相当详细的注释。我想应该不难理解吧!import java.io.*;import java.awt.*;import java.awt.print.*;import javax.print.*;import javax.comm.*; //这是一个Java扩展类库,并不包括在标准的Java SDK当中。//如果你尚未安装这个扩展类那么你需要到sun公司的Java站点下载这个类库

    class SuanKou implements Runnable{  private java.io.FileOutputStream fos=null;  private Thread th=null;  private long shiJian=500;//设置间隔的时间   //private int duanKou=1;//设置端口号   private String Msg = null;   private SerialBean SB=null;   private int isSucces=-1;     //构造函数  public SuanKou(long sj,int dk) {    System.out.println("构造函数");    try{    fos=new java.io.FileOutputStream("c://log.txt");        this.shiJian=sj;//设定监听端口的时间        //this.duanKou=dk;//端口号        SB = new SerialBean(dk);//创建一个接口对象,参数为端口号       isSucces = SB.Initialize();//初使化所指定的串口并返回初始化结果。如果初始化成功返回1,否则返回-1       th=new Thread(this);//创建一个线程对象       th.start();//创建SuanKou这个对象就开始启动线程 }catch(java.io.FileNotFoundException fe){  fe.printStackTrace(); }catch(Exception e){  e.printStackTrace(); }  }

    //拍照函数  public void snape() {    System.out.println("拍照函数");  }

    //取得照片函数  public void getPicture() {    System.out.println("取得照片函数");

      }    //实现线程接口的RUN方法  public void run(){    Thread.sleep(shiJian);    this.ReadSuanKou();  }   //定期到串口读取数据和函数,如果能读到数据就调用snape(),getPicture(),函数,写日志,打印  private void ReadSuanKou() {      //如果初使化成功的话,    if (isSucces == 1) {           //从串口(缓冲区)中读取指定长度的一个字符串。(500)            try{             Msg = SB.ReadPort(500);

          //如果可以从串口读到数据的话

          if (Msg != null) {        this.snape();//调用拍照函数                this.getPicture();//调用取得照片函数                java.text.SimpleDateFormat df=new java.text.SimpleDateFormat("EEEE-MMMM-dd-yyyy");

     Date date=new Date();

     String dateFormat=df.format(date);          fos.write(dateFormat.getBytes());//在日志文件中记录当前时间                fos.write(Msg.getBytes());//将读到的数据写到日志文件中    //调用打印方法 注:若要打印,要打印的对象必须实现java.awt.print.Printable接口。即getPicture    //返回的对象必须实现该接口,因为不知道getPicture返回什么对象,故这个打印功能无法实现,不过大概的思路是    /** 1,需要一个打印服务对象。这可通过三种方式实现:      在jdk1.4之前的版本,必须要实现java.awt.print.Printable接口      或通过Toolkit.getDefaultToolkit().getPrintJob来获取打印服务对象;      在jdk1.4中则还可以通过javax.print.PrintSerivceLookup来查找定位一个打印服务对象。

                      2、需要开始一个打印工作。这也有几种实现方法:在jdk1.4之前可以通过java.awt.print.PrintJob   (jdk1.1提供的,现在已经很少用了)调用print或printAll方法开始打印工作;   也可以通过java.awt.print.PrinterJob的printDialog显示打印对话框,   然后通过print方法开始打印;在jdk1.4中则可以通过javax.print.ServiceUI的printDialog显示打印对话框,   然后调用print方法开始一个打印工作。     根据以上的提示去做,不会很难!  */   java.awt.print.PrinterJob pj=new java.awt.print.PrinterJob();    pj.printDialog();//显示打印对话框  pj.print();//开始打印        }

          //SB.WritePort("OK");若要向串口返回一个结果可以调用该函数?

           }catch(Exception e){    e.printStackTrace();

     }finally{  try{   fos.close();    //停止串口检测进程并关闭串口。        SB.ClosePort();        }catch(Exception e){   e.printStackTrace();  } }

        }    else {      throw RuntimeException("读取串口数据时出错!");    }

      }

     

      //主函数   public static void main(String args[]) {       new SuanKou(1000,1);//参数为间隔的时间,和端口号

      }}

     

    最新回复(0)