一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统。本文介绍了一个简单的通过串口实现全双工通讯的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中所声明的串口进行相应改动。

利用Java实现串口全双工通讯相关推荐

  1. java 全双工服务器_利用Java实现串口全双工通讯_JAVA实例教程_IT部落

    本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程 一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系 ...

  2. 使用Java进行串口SerialPort通讯

    1.准备工作 在进行串口连接通讯前,必须保证你当前操作电脑上有可用且闲置的串口.因为一般的电脑上只有一个或者两个串口,如COM1或COM2,但大多数情况下,这些串口可能会被其他的程序或者应用所占用,所 ...

  3. 【Java编程系列】使用Java进行串口SerialPort通讯

    热门系列: [Java编程系列]WebService的使用 [Java编程系列]在Spring MVC中使用工具类调用Service层时,Service类为null如何解决 [Java编程系列]Spr ...

  4. java Rs232串口协议通讯

    1.首先下载相应的jar文件 压缩包包括:RXTXcomm.jar(64位环境).win32com.dll和javax.comm.properties. 下载地址:https://download.c ...

  5. 利用汇编语言实现串口的通讯(一)(BISO调用)

    本程序是使用汇编语言通过BISO中断来实现多机间串口通讯功能,程序的简要功能有,支持串口号.波特率.奇偶检验.数据位等通讯参数的设置,可以实现两台PC机间的一发一收的功能: 本人刚学的汇编,写的不好( ...

  6. Java Websocket实例【服务端与客户端实现全双工通讯】

    Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...

  7. 利用逻辑分析仪解析串口通讯数据

    利用逻辑分析仪解析串口通讯数据

  8. java 通讯机_java 上位机与单片机通过串口485通讯

    java 上位机与单片机通过串口485通讯 java 2020-7-12 下载地址 https://www.codedown123.com/29387.html 上位机与单片机通过串口485通讯 co ...

  9. java实现 串口通讯

    参考 Java实现串口通信_我不吃芹菜的博客-CSDN博客_java 串口 java 串口通讯,直接控制报警灯的灯亮和播放音乐. 报警灯接口文档:接收16进制数组 . 报警灯指令文档: 工具方法: h ...

最新文章

  1. 因 Redis Key 命令不规范,导致熬了一个通宵才把Key删完了!
  2. 尽管普通的sql语句代码可以实现数据插入的操作,但是更好的代码应该是参数的方式:...
  3. C# WinForm 软件注册的实现
  4. linux传奇源码,游戏源码 屠龙传奇H5 鲲乃异兽 全套源码+教程
  5. 7-4 统计工龄 (20 分)(C语言实现)
  6. 计算机应用专业特色建设情况,【计算机应用论文】计算机应用类专业建设和革新探索(共3022字)...
  7. Csharp:user WebControl Read Adobe PDF Files In Your Web Browser
  8. Django - 模型序列化返回自然主键值
  9. USC ECG Learning Center/ ECG Glossary
  10. weblogic部署war冲突解决记录
  11. XLNet 和BERT的区别是什么?
  12. MySQL(14)-----运算符和优先级
  13. 趋势officescan客户端迁移和升级
  14. 证明:一个有n个结点的非空二叉树的高度至少为lgn
  15. [实操记录]mysql5.7如何恢复被删除数据
  16. php-screw 安装,liunx 下安装 php_screw 扩展 以及报错处理
  17. 使用SpriteAtlas打包图集并显示
  18. Linux安装Intel无线网卡(Ubuntu 16.04)
  19. dede taglist模板中调用自定义字段
  20. 分享溜客2011年5月16日被检测过程

热门文章

  1. Demuxed:编解码器和压缩的未来
  2. 梁俊斌:音频技术可以延展众多应用场景
  3. 腾讯AI Lab推进医疗全流程覆盖:辅诊导诊精度再升级、布局三类病理AI研究
  4. 专访腾讯产品总监邬沛君:TStack斩获OSCAR技术创新奖的背后
  5. linux之autoconf/automake
  6. 我眼中的 Nginx(六):深入 Nginx/Openresty 服务里的 DNS 解析
  7. go 获取cpu核数
  8. Hive 05_hive变量、动态分区
  9. 异常处理——MysqlCan't connect to local MySQL server through socket '/v ar/lib/mysql/mysql.sock'
  10. leetcode 454. 4Sum II | 454. 四数相加 II(Java)