文档库 最新最全的文档下载
当前位置:文档库 › java 串口通讯实例

java 串口通讯实例

java 串口通讯实例
java 串口通讯实例

java 串口通讯实例(转)

2010-01-28 12:33

java串口通讯

最近在搞C的串口通讯,C里面没有线程的概念,所以C对串口的读写只能在一个进程里面,这样

如果串口的缓存有问题,就会导致报告丢失(正好是我们遇到的),我们来看看支持线程的java是如何来解决这个问题的。

本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程。

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

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 https://www.wendangku.net/doc/a518336530.html,m.*;

/**

*

* 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 startss a

* thread which consistently monitors the serial port. Any signal capturred

* 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 incomin

* 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();

}

}

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

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 incomin

* 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();

}

}

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

ReadSerial

ReadSerial是一个进程,它不断的从指定的串口读取数据并将其存放到缓冲区中。public ReadSerial(SerialBuffer SB, InputStreamPort)

本函数构造一个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) {}

}

}

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

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();

}

}

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

编译与调试

本类库中使用了Java Communication API (https://www.wendangku.net/doc/a518336530.html,m)。这是一个Java扩展类库,并不包括在标准的Java SDK当中。如果你尚未安装这个扩展类库的话,你应该从Sun公司的Java站点下载这个类库并将其安装在你的系统上。在所下载的包里面包括一个安装说明,如果你没有正确安装这个类库及其运行环境的话,运行这个程序的时候你会找不到串口。

正确安装Java Communication API并将上述程序编译通过以后,你可以按如下方法测试这个程序。如果你只有一台机器,你可以利用一条RS-232电缆将COM1和COM2连接起来,在 COM1上运行SerialExample,在COM2上运行Windows提供的超级终端程序。如果你有两台机器的话,你可以利用一条RS-232电缆将两台机器的COM1(或者是COM2)连接起来,在一端运行例程,另外一端运行Windows 提供的超级终端程序。如果有必要的话,可以对 SerialExample中所声明的串

口进行相应改动

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

java串口编程,java串口通信,监听者模式解析

java调用coms端口串口通信的方法。 首先需要下到串口驱动。javacomm20-win32.zip 去sun的主页应该有下的。 在这个驱动中有comm.jar,https://www.wendangku.net/doc/a518336530.html,m.properties,win32com.dll 这么3个重要的文件。 1、首先配置驱动,把https://www.wendangku.net/doc/a518336530.html,m.properties,win32com.dll拷贝到你的jdk 中 具体位置为C:\Program Files\Java\jdk1.6.0_06\bin 然后配置windows系统环境变量,在path中加入C:\Program Files\Java\jdk1.6.0_06\bin; 打开你的java工程,配置user library,并导入comm.jar包。 2、现在就可以开始写代码了。串口读写代码如下 CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier(com);//1,先拿到Identifier //其中com是String类型的,传入的是串口名com="COM1"; SerialPort port = (SerialPort)portID.open("MyComm", 100000000);//2,打开串口 //"MyComm"是串口名,100000000是串口过期时间(ms)。 port.setSerialPortParams(rate, databits,stopbit, parity);//3,设置串口属性 //rate 波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验) port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);//4(可选)设置数据流控制模式,默认为无 port.close();//关闭串口 3、串口读入写出流。

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

java串口通信程序(程序及注释)-13页word资料

Java的串口通信程序 首先需要到到sun主页下载串口通信的包,因为一般的jrd中不含有这个包的,有点补丁的意思。(CSDN上也有)。解压缩,为了使Java Communications API能够正确的与Windows系统交互,需要几个小的技巧。下面是三个很重要的文件,你可以从Sun的网站上下载得到 comm.jar win32com.dll javaxm.properties 对于JVM来说,要正确的识别串口,将这几个文件放在系统中合适的位置使很重要的。 comm..jar应该放在以下目录中 %JAVA_HOME%/lib %JAVA_HOME%/jre/lib/ext win32com.dll应该放在以下目录中 %windir%system32 javax.properties应该放在以下目录中 %JAVA_HOME%/lib

%JAVA_HOME%/jre/lib 你可以通过编译和运行Sun的例程来验证串口是否可以使用了。 JBuilder中安装安装Java Communication API (以下在JBuilder 2006中测试通过) 如果你使用JBuilder,那么还需要为JBuilder配置API。 一般来说,根据你的JBuilder配置,你也许需要将win32com.dll和javax.properties安装到相应的目录中,可以参照上述的目录。例如,如果你使用JBuilder附带的JVM的话,你也许需要将win32com.dll和javax.properties放到C:\Borland\JBuilder2006\jdk1.5的相应位置。 我使用的是JCreator,在打开Configure,然后点击option,选中jdk profile然后双击选中的jdk文件,选择edit,在弹出的窗口中选择串口通信包所在的文件(.jar文件),这样配置就算完成了。 以下分别是接收和发送程序,CSDN上搜的,省的自己写了:发送程序: import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*;

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.wendangku.net/doc/a518336530.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

java串口通讯程序

java串口通讯程序 1、下载java Communications api开发包。| 是Sun公司提供的,用于开发平台独立的通讯应用程序的扩展API。 2、将拷贝入C:\j2sdk1.4.2_04\bin 3、将拷贝入C:\j2sdk1.4.2_04\jre\lib\ext 4、将拷贝入C:\j2sdk1.4.2_04\jre\lib 5、编译文件 import .*; import .*; import .*; public class CommTest{ public static void main(String[] args){ SerialPort serialPort=null; DataOutputStream doutput=null; InputStream inputStream; CommPortIdentifier portId=null; String messageString="hello \n"; try{ portId=("COM1"); }catch(NoSuchPortException ne) { "ne"); (); } try{ serialPort=(SerialPort) ("TestComm", 5); OutputStream output = (); doutput=new DataOutputStream(output); inputStream = (); }catch(PortInUseException ex) { "ex"); (); }catch(IOException ie) { "ie"); (); //(); } try { (9600, , , ; } catch (UnsupportedCommOperationException e) {} } try { ()); } catch (IOException e) {}

UART串口通信设计实例

2.5 UART串口通信设计实例(1) 接下来用刚才采用的方法设计一个典型实例。在一般的嵌入式开发和FPGA设计中,串口UART是使用非常频繁的一种调试手段。下面我们将使用Verilog RTL编程设计一个串口收发模块。这个实例虽然简单,但是在后续的调试开发中,串口使用的次数比较多,这里阐明它的设计方案,不仅仅是为了讲解RTL编程,而且为了后续使用兼容ARM9内核实现嵌入式开发。 串口在一般的台式机上都会有。随着笔记本电脑的使用,一般会采用USB转串口的方案虚拟一个串口供笔记本使用。图2-7为UART串口的结构图。串口具有9个引脚,但是真正连接入FPGA开发板的一般只有两个引脚。这两个引脚是:发送引脚TxD和接收引脚RxD。由于是串行发送数据,因此如果开发板发送数据的话,则要通过TxD线1 bit接着1 bit 发送。在接收时,同样通过RxD引脚1 bit接着1 bit接收。 再看看串口发送/接收的数据格式(见图2-8)。在TxD或RxD这样的单线上,是从一个周期的低电平开始,以一个周期的高电平结束的。它中间包含8个周期的数据位和一个周期针对8位数据的奇偶校验位。每次传送一字节数据,它包含的8位是由低位开始传送,最后一位传送的是第7位。

这个设计有两个目的:一是从串口中接收数据,发送到输出端口。接收的时候是串行的,也就是一个接一个的;但是发送到输出端口时,我们希望是8位放在一起,成为并行状态(见图2-10)。我们知道,串口中出现信号,是没有先兆的。如果出现了串行数据,则如何通知到输出端口呢?我们引入“接收有效”端口。“接收有效”端口在一般情况下都是低电平,一旦有数据到来时,它就变成高电平。下一个模块在得知“接收有效”信号为高电平时,它就明白:新到了一个字节的数据,放在“接收字节”端口里面。

WIN_API串口通信详细讲解带范例程序说明

WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下: 函数名作用 CreateFile 打开串口 GetCommState 检测串口设置 SetCommState 设置串口 BuilderCommDCB 用字符串中的值来填充设备控制块 GetCommTimeouts 检测通信超时设置 SetCommTimeouts 设置通信超时参数 SetCommMask 设定被监控事件 WaitCommEvent 等待被监控事件发生 WaitForMultipleObjects 等待多个被监测对象的结果 WriteFile 发送数据 ReadFile 接收数据 GetOverlappedResult 返回最后重叠(异步)操作结果 PurgeComm 清空串口缓冲区,退出所有相关操作 ClearCommError 更新串口状态结构体,并清除所有串口硬件错误 CloseHandle 关闭串行口 用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。 API编写串口,过程一般是这样的: 1、创建串口句柄,用CreateFile; 2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port); 3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数; 4、读写结束后,要关闭串口句柄,用CloseFile。 下面依次讲述各个步骤的过程。

Java串口通信编程指南

Java串口通信编程指南

1. 概述 在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用。另外,也可以用开源的Rxtx实现串口通信,这里仅以Java Communication包,在Windows 平台实现串口通信进行说明。 2. 前期准备 2.1. 下载Java Communication包 ?下载地址如下:https://www.wendangku.net/doc/a518336530.html,/Jolt/javacomm20-win32.zip。 ?如果是非Windows平台,请到Sun网站选择其他版本下载。地址如下: https://www.wendangku.net/doc/a518336530.html,/download/products.xml?id=43208d3d 2.2. 配置 ?解压缩javacomm20-win32.zip ?把win32com.dll拷贝到{JAVA_HOME}\jre\bin ?把comm.jar拷贝到{JAVA_HOME}\jre\lib\ext ?把https://www.wendangku.net/doc/a518336530.html,m.properties拷贝到{JAVA_HOME}\jre\lib ?set CLASSPATH={JAVA_HOME}\jre \lib\ext \comm.jar;%classpath%

3. 实现过程 主要步骤包括: ?获得串口标识 ?打开串口 ?设置串行端口通讯参数 ?获取输入(出)流 ?进行读写操作 3.1. 获得串口标识 指定串口的端口号,生成串口的标识类的实例。 https://www.wendangku.net/doc/a518336530.html,mPortIdentifier是通讯端口管理器,控制访问到通讯端口的中心类。一个应用程序首先使用CommPortIdentifier中的方法,通过相关的驱动去获取那些通讯端口是可用的并且选择一个端口便于开始。它包括如下功能: a. 通过驱动决定通讯端口是可用的。 b. 打开通讯端口为了I/O操作。 c. 决定端口的拥有者。 d. 解析端口拥有者的争夺。 e. 管理事件显示在端口拥有者的中的状态改变。 示例代码如下: 代码: 3.2. 打开串口 示例代码如下: 代码:

Java串口通信详解

Java串口通信详解 序言 说到开源,恐怕很少有人不挑大指称赞。学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜。然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱。这也难怪,毕竟就像某个著名NBA 球员说的那样:“我还要养家,所以千万美元以下的合同别找我谈,否则我宁可待业”。是啊,支持开源的人也要养家,收点钱也不过分。要想既不花钱又学到知识就只能借助网络和了,我只是想抛砖引玉,为开源事业做出点微薄共献,能为你的工程解决哪怕一个小问题,也就足够了。 虽然我的这个系列介绍的东西不是什么Web框架,也不是什么开源服务器,但是我相信,作为一个程序员,什么样的问题都会遇到。有时候越是简单的问题反而越棘手;越是小的地方就越是找不到称手的家伙。只要你不是整天只与“架构”、“构件”、“框架”打交道的话,相信我所说的东西你一定会用到。 1串口通信简介 1.1常见的Java串口包 1.2串口包的安装(Windows下) 2串口API概览 https://www.wendangku.net/doc/a518336530.html,mPort https://www.wendangku.net/doc/a518336530.html,mPortIdentifier https://www.wendangku.net/doc/a518336530.html,m.SerialPort 2.4串口API实例 2.4.1列举出本机所有可用串口 2.4.2串口参数的配置 2.4.3串口的读写 3串口通信的通用模式及其问题 3.1事件监听模型 3.2串口读数据的线程模型 3.3第三种方法 4结束语 1串口通信简介 嵌入式系统或传感器网络的很多应用和测试都需要通过PC机与嵌入式设备或传感器节点进行通信。其中,最常用的接口就是RS-232串口和并口(鉴于USB接口的复杂性以及不需要很大的数据传输量,USB接口用在这里还是显得过于奢侈,况且目前除了SUN有一个支持USB 的包之外,我还没有看到其他直接支持USB的Java类库)。SUN的CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。RS232是一个全双工的通讯协议,它可以同时进行数据接收和发送的工作。 1.1 常见的Java串口包 目前,常见的Java串口包有SUN在1998年发布的串口通信API:comm2.0.jar(Windows 下)、comm3.0.jar(Linux/Solaris);IBM的串口通信API以及一个开源的实现。鉴于在Windows下SUN的API比较常用以及IBM的实现和SUN的在API层面都是一样的,那个开源的实现又不像两家大厂的产品那样让人放心,这里就只介绍SUN的串口通信API在Windows 平台下的使用。 1.2 串口包的安装(Windows下) 到SUN的网站下载javacomm20-win32.zip,包含的东西如下所示:

Java串口通信编程指导

Java串口通信编程指导 Java串口通信编程

概述 在java中,利用Java Communication包能够操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,只是在XP下还能使用。另外,也能够用开源的Rxtx实现串口通信,那个地点仅以Java Communication包,在Windows平台实现串口通信进行讲明。 前期预备 下载Java Communication包 下载地址如下:https://www.wendangku.net/doc/a518336530.html,/Jolt/javacomm20-win32.zip。 配置 解压缩javacomm20-win32.zip 把win32com.dll拷贝到{JA V A_HOME}\jre\bin 把comm.jar拷贝到{JA V A_HOME}\jre\lib\ext set CLASSPATH={JA V A_HOME}\jre \lib\ext \comm.jar;%classpath%

实现过程 要紧步骤包括: 获得串口标识 打开串口 设置串行端口通讯参数 猎取输入(出)流 进行读写操作 获得串口标识 指定串口的端口号,生成串口的标识类的实例。 a. 通过驱动决定通讯端口是可用的。 b. 打开通讯端口为了I/O操作。 c. 决定端口的拥有者。 d. 解析端口拥有者的争夺。 e. 治理事件显示在端口拥有者的中的状态改变。示例代码如下: 代码: 打开串口 示例代码如下: 代码:

5000(毫秒)是超时时刻。 设置串行端口通讯参数 设置串口传输的波特率、数据位、停止位、奇偶校验等参数。 示例代码如下: 代码: try { // 通信条件の設定 // 通信速度 9600 baud // データビット 8bit // ストップビット 1bit // パリティなし // フローコントロールの設定 // 無制御を使用 port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); } catch (UnsupportedCommOperationException ex) { ex.printStackTrace(); System.exit(1); } 猎取输入(出)流 利用getInputStream()以及getOutputStream()从每个串口产生对应的输入输出流对象。 示例代码如下: 代码:

Labview串口通信开发实例(值得拥有)

串口通信的基本概念 串口通信的基本概念 1,什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米; 而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参 数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB 设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信 的情况。 c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和

一个通过JAVA串口通信控制LED显示数据的实例

一个通过java串口通信控制LED显示数据的实例 在很多应用程序中都需要用到pc机与外部设备如:嵌入式系统、传感器、开关 设备等进行数据通讯。其中,最常用的接口就是RS-232串口和并口。SUN的 CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。 至于java串口通讯的配置以及通讯模式在sun的demo以及网上都有很多具体的 实例。 下面是我在开发一个叫号功能模块时通过串口通信来控制LED显示的实例,由于 第一次进行相关的开发,看似一个非常简单的功能在实际开发中却遇到了一些问 题,希望本人的解决方式能够对大家有所帮助,也希望大家能够提出更好的解决 方式。 先看一下LED显示屏厂商提供的通讯协议: ---遥控单双色、单双行、混合屏 一、每一次对任一特定地址发送信息由内码帧(7f/7e),数码帧 (6f/6e),定时帧(5f),时间帧(4f)中的一种或多种构成,结束 时发送一结束帧。 二、帧结构:每帧由84字节构成。 1、内码帧:一幕由一起始帧和零或多个中间帧组成,一次 发送可有多幕。 1)起始帧:地址(1字节)+帧控制7F(1字节) +幕号(1字节)+COMMAND(8字节) +内码/ASCII(73字节) 2)中间帧:地址(1字节)+帧控制7E(1字节)+ 幕号(1字节)+COMMAND(8字节)+内码/ASCII (73字节) 3)COMMAND: 前4字节未定义,后4字节依次为动画(0~4),移入及移出(各16种),速度(0~255),追加 (D3连续、D2停止、D0闪烁、D4时间、D6暂停、 D7动画) 4)内码/ASCII结构: a、内码4字节,依次为控制字节(D7宽体/正常体、D4绿色、D5红色、D3粗体、D2细体反白、D1 粗体反白、D0细体),内码高位,内码低位,未用 b、ASCII2字节,依次为控制字节(D7宽体/正常体、D5绿色、D4红色、D3粗体、D2细体反白、D1粗体 反白、D0细体),ASCII码 2、数码帧:由一起始帧和零或多中间帧组成。 1)起始帧:地址(1字节)+帧控制6F(1字节)+ 数据(82字节)

RS232串口通信基本知识与实例

1,RS232串口通信基本知识 (1)目前较为常用的串口是9针串口(DB9。通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口;若距离较远,需附加调制解调器(MOD EM)。 (2)RS232C串口通信接线方法(三线制) 接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接 (3)DB9接口三线引脚定义 2 ---- RXD 接收数据 3 ---- TXD 发送数据 5 ---- GND 信号地 (4)串行通信方式 1)单工:信息只能单向传送 2)半双工:信息可双向传送但不能同时进行 3)全双工:信息可同时进行双向传送 (5)RS232逻辑电平 逻辑0电平规定为+5 ~ +15V之间;逻辑1是电平为-5 ~ -15V之间,因此在与单片机进行通信时需要进行电平转换 (6)RS232串行通信接口电路设计 (7)51单片机串行通信接口软件设计 1)两个重要指标:可靠性和速度,可靠性是第一位。 2)与串口通信相关的几个寄存器和控制位 TMOD:可以用它来设置定时器工作方式(如果在MCU中使用的是定时器来产生波特率,就需要对这个寄存器进行设置,通常设为0x20,即设置定时器1为8位自动重装定时器,即工作方式1) TH1和TL1:定时器1初始值(可通过波特率计算软件获得) TR1:开启定时器1 SCON:串口控制寄存器,通常设为0x50,即10位异步传输,由定时器1

产生波特率,无奇偶校验位,允许接收 PCON:这个寄存器主要用到它的最高位SMON,当最高位设为1时,原波特率加倍 ES:串口中断使能位 EA:全局中断使能位 3)波特率计算方法(使用一个名为“51波特率初值计算.exe”的小软件)第1步:选择定时器工作方式(方式2) 第2步:输入晶振值(11.0592) 第3步:选择波特率(9600) 第4步:设置SMOD值(0) 第5步:点击确定 第6步:将软件上显示值赋给TH1和TL1 4)串口初始化程序 void Initial_RS232(unsigned char rate) { //默认晶振值为11.0592MHz unsigned char Reload1; switch(rate) //根据拨码器设置波特率 { case 0: Reload1 = 0xE8; //2400bps break; case 1: Reload1 = 0xF4; //4800bps break; case 2: Reload1 = 0xFA; //9600bps break; case 3: Reload1 = 0xFD; //19200bps break; default: Reload1 = 0x00; break; } PCON = PCON|0x80; //SMOD = 1 ;波特率加倍 TMOD = 0x20; //0011,00010设置定时器1为8位自动重装计数器 SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位 TH1 = Reload1; //设置定时器1自动重装数 TL1 = Reload1; TR1 = 1; //开定时器1 ES = 1; //允许串口中断 EA = 1; //开总中断 }

Java 串口通讯 RS232

通过comm.jar等配置 如果用applet应用程序的话,下面这个函数是可以取到串口的,但是如果通过web应用程序(或者通过jsp调用)却取不到串口,而且也不会抛出异常,感觉很奇怪,特来请教! CommPortIdentifier.getPortIdentifiers(); 同时目标机器的java运行环境也需要把w32comm.dll, comm.jar xxx.proper等放到相应的目录 就是用ibm的包而不用sun的comm包: ibm-javacomm-win32-x86.zip 只需要把comm驱动包这个类的装载更新一下即 https://www.wendangku.net/doc/a518336530.html,/serialcomm.htm 利用Java实现串口全双工通讯 一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统。本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程。 本类库主要包括:SerialBean.java (与其他应用程序的接口), SerialBuffer.java(用来保存从串口所接收数据的缓冲区), ReadSerial.java (从串口读取数据的程序)。另外本类库还提供了一个例程SerialExample.java 作为示范。在下面的内容中将逐一对这几个部分进行详细介绍。 1. SerialBean SerialBean是本类库与其他应用程序的接口。该类库中定义了SerialBean的构造方法以及初始化串口,从串口读取数据,往串口写入数据以及关闭串口的函数。具体介绍如下: 本函数构造一个指向特定串口的SerialBean,该串口由参数PortID所指定。PortID = 1 表示COM1,PortID = 2 表示COM2,由此类推。 本函数初始化所指定的串口并返回初始化结果。如果初始化成功返回1,否则返回-1。初始化的结果是该串口被SerialBean独占性使用,其参数被设置为9600, N, 8, 1。如果串口被成功初始化,则打开一个进程读取从串口传入的数据并将其保存在缓冲区中。

delphi7串口通信(spcomm控件)实例

Delphi7串口通信(spcomm控件)实例 最近在用delphi7做串口通信,网上找了很多例程,复制粘贴运行就没有能通过的,再次鄙视一下列位先行者,你们帮人倒是帮到底啊,没一个是拿过来能用的,太坑了,在N天的努力下(鄙人比较笨)终于通过串口接收到数据,希望给后来人予以帮助,程序如下: 功能简介 功能比较简单,只是从串口接收单片机发送的数据,给memo1 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, SPComm, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Comm1: TComm; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); procedure Comm1ModemStateChange(Sender: TObject; ModemEvent: Cardinal); private { Private declarations } public { Public declarations } end; var

java串口通信

小技巧:如何辨别TXD和RXD端口? 搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。你只要分别测一下RS232端口的2--5或3--5针脚之间的电压,通常TXD针脚与GND之间会有 3~15V左右的负电压,表示它是TXD针脚。 安装JavaCommunicationsAPI Sun的J2SE中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立的jar包形式发布在https://www.wendangku.net/doc/a518336530.html,网站上(从这里下载)----即comm.jar,称之为Javatm CommunicationsAPI,它是J2SE的标准扩展。comm.jar并不是最近才有,早在1998年时,sun就已经发布了这个开发包。comm.jar分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。目前sun发布的comm.jar只有Windows和Solaris平台两个版本,如果你需要Linux平台下的,可以在 https://www.wendangku.net/doc/a518336530.html,/~kevinh/linuxcomm.html找到。 在使用comm.jar之前,必须知道如何安装它。这也是困扰许多初学javaRS232通讯者的一个难题。如果我们电脑上安装了JDK,它将同时为我们安装一份JRE(Java RuntimeEntironment),通常我们运行程序时都是以JRE来运行的。所以以下的安装适用于JRE。如果你是用JDK来运行程序的,请将相应的改成。 下载了comm.jar开发包后,与之一起的还有两个重要的文件,win32com.dll和https://www.wendangku.net/doc/a518336530.html,m.properties。comm.jar提供了通讯用的javaAPI,而win32com.dll提供了供comm.jar调用的本地驱动接口。而https://www.wendangku.net/doc/a518336530.html,m.properties是这个驱动的类配置文件。首先将comm.jar复制到\lib\ext目录。再将win21com.dll复制到你的RS232应用程序运行的目录,即user.dir。然后将https://www.wendangku.net/doc/a518336530.html,m.properties复制到\lib目录。 通讯前的准备 如果你手头上没有现成的提供了标准RS232串口的设备,你可以将自己的电脑模拟成两台不同的串口设备。通常电脑主机后面的面板提供了两个9针的串口,请将这两个串口的2,3,5脚按前面介绍的方法连接。电子市场都有现成的连接头卖,请不要买那种封装的严严实实的接头,而要买用螺丝封装可以拆开的连接头,这样可以方便自己根据需要连接各 个针脚。 Comm API基础 我无意于在此详细描述Comm API每个类和接口的用法,但我会介绍CommAPI的 类结构和几个重要的API用法。 所有的comm API位于https://www.wendangku.net/doc/a518336530.html,m包下面。从CommAPI的javadoc来看,它 介绍给我们的只有区区以下13个类或接口: https://www.wendangku.net/doc/a518336530.html,mDriver https://www.wendangku.net/doc/a518336530.html,mPort https://www.wendangku.net/doc/a518336530.html,m.ParallelPort

VC串口通信实例 MSComm

VC串口通信实例 MSComm 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。串行通信的距离可以从几米到几千米。利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。如电话、传真、视频和各种控制等。串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。三是利用现在网络上面提供的一些串口通讯控件进行编写。这三种方法都没有同Windows服务联系起来。 串行接口输入输出过程描述 串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。串行通信数据的收发方式分为异步通信方式与同步通信方式。

java串口通信

java串口通信API说明 java串口通信 Java提供了 CommunicationAPI(包含于https://www.wendangku.net/doc/a518336530.html,m包中)用于通过与机器无关的方式,控制各种外部设备。Communications API,是标准的Java的扩展部分,它在JavaAPI中是没有附带的。因此,必须先在SUN公司网站的Java站点(https://www.wendangku.net/doc/a518336530.html,)上下载这个扩展类库。 1.1Communications API 简介 Communications API 的核心是抽象的CommPort类及其两个子类:SerialPort类和ParallePort类。其中,SerialPort类是用于串口通信的类,ParallePort类是用于并行口通信的类。CommPort类还提供了常规的通信模式和方法,例如:getInputStream( )方法和getOutputStream( )方法,专用于与端口上的设备进行通信。 然而,这些类的构造方法都被有意的设置为非公有的(non-public)。所以,不能直接构造对象,而是先通过静态的CommPortIdentifer.getPortIdentifiers()获得端口列表;再从这个端口列表中选择所需要的端口,并调用CommPortIdentifer对象的Open( )方法,这样,就能得到一个CommPort对象。当然,还要将这个CommPort对象的类型转换为某个非抽象的子类,表明是特定的通讯设备。该子类可以是SerialPort类和ParallePort类中的一个。下面将分别对CommPort类,CommPortIdentifier类,串口类SerialPort进行详细的介绍。

相关文档