首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> Solaris教程
利用Java实现串口全双工通讯-JSP教程,Java技巧及代码
作者:网友供稿 点击:27
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统。本文介绍了一个简单的通过串口实现全双工通讯的java类库,该类库大大的简化了对串口进行操作的过程。

  本类库主要包括:serialbean.java (与其他应用程序的接口), serialbuffer.java(用来保存从串口所接收数据的缓冲区), readserial.java (从串口读取数据的程序)。另外本类库还提供了一个例程serialexample.java 作为示范。在下面的内容中将逐一对这几个部分进行详细介绍。

  1. serialbean

  serialbean是本类库与其他应用程序的接口。该类库中定义了serialbean的构造方法以及初始化串口,从串口读取数据,往串口写入数据以及关闭串口的函数。具体介绍如下:
  public serialbean(int portid)

  本函数构造一个指向特定串口的serialbean,该串口由参数portid所指定。portid = 1 表示com1,portid = 2 表示com2,由此类推。

  public int initialize()

  本函数初始化所指定的串口并返回初始化结果。如果初始化成功返回1,否则返回-1。初始化的结果是该串口被serialbean独占性使用,其参数被设置为9600, n, 8, 1。如果串口被成功初始化,则打开一个进程读取从串口传入的数据并将其保存在缓冲区中。

  public string readport(int length)

  本函数从串口(缓冲区)中读取指定长度的一个字符串。参数length指定所返回字符串的长度。

  public void writeport(string msg)

  本函数向串口发送一个字符串。参数msg是需要发送的字符串。

  public void closeport()

  本函数停止串口检测进程并关闭串口。

  serialbean的源代码如下:

package serial;

import java.io.*;
import java.util.*;
import javax.comm.*;

/**
*
* this bean provides some basic functions to implement full dulplex
* information exchange through the srial port.
*
*/

public class serialbean
{
 static string portname;
 commportidentifier portid;
 serialport serialport;
 static outputstream out;
 static inputstream in;

 serialbuffer sb;
 readserial rt;

 /**
 *
 * constructor
 *
 * @param portid the id of the serial to be used. 1 for com1,
 * 2 for com2, etc.
 *
 */

 public serialbean(int portid)
 {
  portname = "com" + portid;
 }

 /**
 *
 * this function initialize the serial port for communication. it starts a
 * thread which consistently monitors the serial port. any signal captured
 * from the serial port is stored into a buffer area.
 *
 */

 public int initialize()
 {

  int initsuccess = 1;
  int initfail = -1;

  try
  {

   portid = commportidentifier.getportidentifier(portname);

   try
   {
    serialport = (serialport)
    portid.open("serial_communication", 2000);
   } catch (portinuseexception e)
   {
    return initfail;
   }

   //use inputstream in to read from the serial port, and outputstream
   //out to write to the serial port.

  try
  {
   in = serialport.getinputstream();
   out = serialport.getoutputstream();
  } catch (ioexception e)
  {
   return initfail;
  }

 //initialize the communication parameters to 9600, 8, 1, none.

  try
  {
   serialport.setserialportparams(9600,
   serialport.databits_8,
   serialport.stopbits_1,
   serialport.parity_none);
  } catch (unsupportedcommoperationexception e)
  {
   return initfail;
  }
 } catch (nosuchportexception e)
 {
  return initfail;
 }

 // when successfully open the serial port, create a new serial buffer,
 // then create a thread that consistently accepts incoming signals from
 // the serial port. incoming signals are stored in the serial buffer.

 sb = new serialbuffer();
 rt = new readserial(sb, in);
 rt.start();

 // return success information
 
 return initsuccess;
 }

 /**
 *
 * this function returns a string with a certain length from the incoming
 * messages.
 *
 * @param length the length of the string to be returned.
 *
 */

 public string readport(int length)
 {
  string msg;
  msg = sb.getmsg(length);
  return msg;
 }

 /**
 *
 * this function sends a message through the serial port.
 *
 * @param msg the string to be sent.
 *
 */

 public void writeport(string msg)
 {
  int c;
  try
  {
   for (int i = 0; i < msg.length(); i++)
    out.write(msg.charat(i));
  } catch (ioexception e) {}
 }

 /**
 *
 * this function closes the serial port in use.
 *
 */

 public void closeport()
 {
  rt.stop();
  serialport.close();
 }
}

2. serialbuffer

  serialbuffer是本类库中所定义的串口缓冲区,它定义了往该缓冲区中写入数据和从该缓冲区中读取数据所需要的函数。

  public synchronized string getmsg(int length)

  本函数从串口(缓冲区)中读取指定长度的一个字符串。参数length指定所返回字符串的长度。

  public synchronized void putchar(int c)

  本函数望串口缓冲区中写入一个字符,参数c 是需要写入的字符。

  在往缓冲区写入数据或者是从缓冲区读取数据的时候,必须保证数据的同步,因此getmsg和putchar函数均被声明为synchronized并在具体实现中采措施实现的数据的同步。

  serialbuffer的源代码如下:

package serial;

/**
*
* this class implements the buffer area to store incoming data from the serial
* port.
*
*/

public class serialbuffer
{
 private string content = "";
 private string currentmsg, tempcontent;
 private boolean available = false;
 private int lengthneeded = 1;

 /**
 *
 * this function returns a string with a certain length from the incoming
 * messages.
 *
 * @param length the length of the string to be returned.
 *
 */

public synchronized string getmsg(int length)
{
 lengthneeded = length;
 notifyall();

 if (lengthneeded > content.length())
 {
  available = false;
  while (available == false)
  {
   try
   {
    wait();
   } catch (interruptedexception e) { }
  }
 }

 currentmsg = content.substring(0, lengthneeded);
 tempcontent = content.substring(lengthneeded);
 content = tempcontent;
 lengthneeded = 1;
 notifyall();
 return currentmsg;
}

/**
*
* this function stores a character captured from the serial port to the
* buffer area.
*
* @param t the char value of the character to be stored.
*
*/

public synchronized void putchar(int c)
{
 character d = new character((char) c);
 content = content.concat(d.tostring());
 if (lengthneeded < content.length())
 {
  available = true;
 }
 notifyall();
}
}


  3. readserial

  readserial是一个进程,它不断的从指定的串口读取数据并将其存放到缓冲区中。

  public readserial(serialbuffer sb, inputstream port)

  本函数构造一个readserial进程,参数sb指定存放传入数据的缓冲区,参数port指定从串口所接收的数据流。

  public void run()

  readserial进程的主函数,它不断的从指定的串口读取数据并将其存放到缓冲区中。

  readserial的源代码如下:

package serial;

import java.io.*;

/**
*
* this class reads message from the specific serial port and save
* the message to the serial buffer.
*
*/

public class readserial extends thread
{
 private serialbuffer combuffer;
 private inputstream comport;

/**
*
* constructor
*
* @param sb the buffer to save the incoming messages.
* @param port the inputstream from the specific serial port.
*
*/

public readserial(serialbuffer sb, inputstream port)
{
 combuffer = sb;
 comport = port;
}

public void run()
{
 int c;
 try
 {
  while (true)
  {
   c = comport.read();
   combuffer.putchar(c);
  }
 } catch (ioexception e) {}
}
}

  4. serialexample

  serialexample是本类库所提供的一个例程。它所实现的功能是打开串口com1,对其进行初始化,从串口读取信息对其进行处理后将处理结果发送到串口。

import serial.*;
import java.io.*;

/**
*
* this is an example of how to use the serialbean. it opens com1 and reads
* six messages with different length form the serial port.
*
*/

class serialexample
{
 public static void main(string[] args)
 {
  //to do: add your java codes here

  serialbean sb = new serialbean(1);
  string msg;
 
  sb.initialize();
  for (int i = 5; i <= 10; i++)
  {
   msg = sb.readport(i);
   sb.writeport("reply: " + msg);
  }
  sb.closeport();
 }
}


  5. 编译与调试

  本类库中使用了java communication api (javax.comm)。这是一个java扩展类库,并不包括在标准的java sdk当中。如果你尚未安装这个扩展类库的话,你应该从sun公司的java站点下载这个类库并将其安装在你的系统上。在所下载的包里面包括一个安装说明,如果你没有正确安装这个类库及其运行环境的话,运行这个程序的时候你会找不到串口。

  正确安装java communication api并将上述程序编译通过以后,你可以按如下方法测试这个程序。如果你只有一台机器,你可以利用一条rs-232电缆将com1和com2连接起来,在com1上运行serialexample,在com2上运行windows提供的超级终端程序。如果你有两台机器的话,你可以利用一条rs-232电缆将两台机器的com1(或者是com2)连接起来,在一端运行例程,另外一端运行windows提供的超级终端程序。如果有必要的
话,可以对serialexample中所声明的串口进行相应改动。

  本程序在windows 2000 + java sdk 1.3环境下编译通过并成功运行。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用JSP对文件下载的控制-JSP教程,Jsp/Servlet
·[ASP.net(C#)]XML操作类(一)-.NET教程,C#语言
·java网络五子棋的源代码-JSP教程,Java技巧及代码
·用C#给程序加启动画面并只允许一个应用程序实例运行-.NET教程,C#语言
·.Net平台下开发中文语音应用程序-.NET教程,VB.Net语言
·用java取得本机的ip和机器名-JSP教程,Java技巧及代码
·动力设备环境及图像集中监控管理系统若干新问题——王观坤、刘崇海
·Java下XML编程接口比较:DOM SAX JDOM JAXP-.NET教程,XML应用
·使用Java技术在Cocoon中实现商业逻辑-JSP教程,Java技巧及代码
·[SQL]启动SQLServer的死锁检查-数据库专栏,SQL Server
最新文章
·日一万ip网站 gg月入万刀_网赚技巧
·浅谈cpm、cpc、cpa、pfp网站赚钱说明_网赚技巧
·王通:网站赚钱靠服务、产品和投资三种方式_网赚技巧
·网站的首页最应该放什么?_站长心得
·简洁而不简单:google成功十条真理_google推广
·google排名 如何用关键字优化网站_google推广
·用google adsense渠道跟踪你的广告(新手读)_google推广
·全面了解google 网页目录_google推广
·做完网站别忘调试----网站调试全攻略2_站长心得
·网上开店快乐赚钱-发现潜在商机_站长心得
相关主题
  • 利用javascript从数据库取数据来实现csdn首页图片的切换效果 _javascript教程
  • 利用javascript建立web应用_javascript教程
  • 利用javamail收/发gmail邮件(ssl)_邮件服务器
  • 利用Java调用可执行命令-JSP教程,Java技巧及代码
  • 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询-JSP教程,Java技巧及代码
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭