串口通信Word格式.docx

上传人:b****2 文档编号:4192896 上传时间:2023-05-02 格式:DOCX 页数:10 大小:30.29KB
下载 相关 举报
串口通信Word格式.docx_第1页
第1页 / 共10页
串口通信Word格式.docx_第2页
第2页 / 共10页
串口通信Word格式.docx_第3页
第3页 / 共10页
串口通信Word格式.docx_第4页
第4页 / 共10页
串口通信Word格式.docx_第5页
第5页 / 共10页
串口通信Word格式.docx_第6页
第6页 / 共10页
串口通信Word格式.docx_第7页
第7页 / 共10页
串口通信Word格式.docx_第8页
第8页 / 共10页
串口通信Word格式.docx_第9页
第9页 / 共10页
串口通信Word格式.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

串口通信Word格式.docx

《串口通信Word格式.docx》由会员分享,可在线阅读,更多相关《串口通信Word格式.docx(10页珍藏版)》请在冰点文库上搜索。

串口通信Word格式.docx

SUN的CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。

目前,常见的Java串口包有SUN在1998年发布的串口通信API:

comm2.0.jar(Windows下)、comm3.0.jar(Linux/Solaris);

IBM的串口通信API以及一个开源的实现。

鉴于在Windows下SUN的API比较常用以及IBM的实现和SUN的在API层面都是一样的,那个开源的实现又不像两家大厂的产品那样让人放心,这里就只介绍SUN的串口通信API在Windows平台下的使用。

串口包的安装(Windows下)

至USUN的网站下载javacomm20-win32.zip,包含的东西如下所示:

和加解庄到测试

[幻Jomm2O-Win32.

zipVconimapi-ZIP压缩文件,解包大&

[各新令'

大小压茅

jayadocs

'

japples

COflllTi了童^

23,043

F7changes:

html

3,335

O_license,tut

3,141

iC«

MnAFI_FAQ.tut

瓦374

喝二j*輩电詹camn>

.propertl

^Jjdkl2.html

2,132

Flatf^rmSp^cific.html

3,715

Readme,html

3,913

^621

in32conidlF-"

27,648

文件密-■命奇功収意夹(U)选项㉚祜助QD

按照其使用说明(Readme.html)的说法,要想使用串口包进行串口通信,除了设置好环境变量之外,还要将win32com.dll复制

至U\bin目录下;

将comm.jar复制至U\lib;

把m.properties也同样拷贝到\lib目录下。

然而在真正运行使用串口包的时候,仅作这些是不够的。

因为通常当运行“javaMyApp”的时候,是由JRE下的虚拟机启动MyApp的。

而我们只复制上述文件到JDK相应目录下,所以应用程序将会提示找不到串口。

解决这个问题

的方法很简单,我们只须将上面提到的文件放到JRE相应的目录

下就可以了。

串口API介绍

m.CommPort

这是用于描述一个被底层系统支持的端口的抽象类。

它包含

一些高层的10控制方法,这些方法对于所有不同的通讯端口来说是通用的。

SerialPort和ParallelPort都是它的子类,前者用于控制串行端口而后者用于控这并口,二者对于各自底层的物理端

口都有不同的控制方法。

这里我们只关心SerialPort。

m.CommPortldentifier

这个类主要用于对串口进行管理和设置,是对串口进行访问

控制的核心类。

主要包括以下方法

确定是否有可用的通信端口

为10操作打开通信端口

决定端口的所有权

处理端口所有权的争用

管理端口所有权变化引发的事件(Event)

m.SerialPort

这个类用于描述一个RS-232串行通信端口的底层接口,它定义了串口通信所需的最小功能集。

通过它,用户可以直接对串口进行读、写及设置工作。

串口API实例

压缩包中除了api,还包括了几个小例子,下面我们就一起看一下串口包自带的例子---SerialDemo中的一小段代码来加深对串口API核心类的使用方法的认识。

列举出本机所有可用串口

voidlistPortChoices(){

CommPortIdentifierportId;

Enumerationen=CommPortIdentifier.getPortldentifiers();

//iteratethroughtheports.

while(en.hasMoreElements()){

portId=(CommPortIdentifier)en.nextElement();

if(portld.getPortType()

CommPortIdentifier.PORT_SERIAL){

System.out.println(portld.getName());

portChoice.select(parameters.getPortName());

}

以上代码可以列举出当前系统所有可用的串口名称,我的机

器上输出的结果是COM1和COM3。

串口参数的配置

串口一般有如下参数可以在该串口打开以前配置进行配置:

 

PortName:

CCW1

*BaudRate:

115200

FiowControlIn:

None

▼]FlowControlOut

DataBits:

8

*StopBits:

Parity:

打开哂口|关闭炳口

包括波特率,输入/输出流控制,数据位数,停止位和奇偶校验

SerialPortsPort;

try{sPort.setSerialPortParams(BaudRate,Databits,Stopbits,Parity);

〃设置输入/输出控制流

sPort.setFlowControlMode(FlowControlIn|FlowControlOut);

}catch(UnsupportedCommOperationExceptione){}

串口的读写

对串口读写之前需要先打开一个串口:

CommPortIdentifierportId=

CommPortIdentifier.getPortldentifier(PortName);

try{

SerialPortsPort=(SerialPort)portId.open(”串口所有者名称"

超时等待时间);

}catch(PortlnUseExceptione){//如果端口被占用就抛出这

个异常

thrownewSerialConnectionException(e.getMessage());

〃用于对串口写数据

BufferedOutputStream(sPort.getOutputStream());

os.write(intdata);

InputStreamis

new

〃用于从串口读数据

BufferedInputStream(sPort.getlnputStream());

intreceivedData=is.read();

读出来的是int型,你可以把它转换成需要的其他类型。

这里要注意的是,由于Java语言没有无符号类型,即所有的类型都是带符号的,在由byte到int的时候应该尤其注意。

为如果byte的最高位是1,则转成int类型时将用1来占位。

这样,原本是10000000的byte类型的数变成int型就成了

1111111110000000这是很严重的问题,应该注意避免。

串口通信的通用模式及其问题

下面开始我们本次的重点--串口应用的研究。

由于向串口写数据很简单,所以这里我们只关注于从串口读数据的情况。

通常,

串口通信应用程序有两种模式,一种是实现SerialPortEventListener接口,监听各种串口事件并作相应处理;

另一种就是建立一个独立的接收线程专门负责数据的接收。

由于

这两种方法在某些情况下存在很严重的问题,所以我的实现是采

用第三种方法来解决这个问题。

事件监听模型

现在我们来看看事件监听模型是如何运作的:

首先需要在你的端口控制类(例如SManager)加上

“implementsSerialPortEventListener”

在初始化时加入如下代码:

SerialPortsPort.addEventListener(SManager);

listeners

}catch(TooManyListenersExceptione){sPort.close();

thrownewSerialConnectionException("

toomanyadded"

);

sPort.notifyOnDataAvailable(true);

覆写publicvoidserialEvent(SerialPortEvente)方法,在其中

对如下事件进行判断:

BI-通讯中断.

CD-载波检测.

CTS-清除发送.

DATA_AVAILABLE-有数据到达.

DSR-数据设备准备好.

FE-帧错误.

OE-溢位错误.

OUTPUT_BUFFER_EMPTY-输出缓冲区已清空

PE-奇偶校验错.

RI-振铃指示.

一般最常用的就是DATA_AVAILABLE--串口有数据到达事件。

也就是说当串口有数据到达时,你可以在serialEvent中接收

并处理所收到的数据。

然而在我的实践中,遇到了一个十分严重的问题。

首先描述一下我的实验:

我的应用程序需要接收传感器节点从串口发回的查询数据,并将结果以图标的形式显示出来。

串口

设定的波特率是115200,串口每隔128毫秒返回一组数据(大约是30字节左右),周期(即持续时间)为31秒。

实测的时候在一个周期内应该返回4900多个字节,而用事件监听模型我最多只能收到不到1500字节,不知道这些字节都跑哪里去了,也不清楚到底丢失的是那部分数据。

值得注意的是,这是我将serialEvent()中所有处理代码都注掉,只剩下打印代码所得的结果。

数据丢失

的如此严重是我所不能忍受的,于是我决定采用其他方法。

串口读数据的线程模型

这个模型顾名思义,就是将接收数据的操作写成一个线程的形式:

publicvoidstartReadingDataThread(){

ThreadreadDataProcess=newThread(newRunnable(){

publicvoidrun(){

while(newData!

=-1){

newData=is.read();

System.out.println(newData);

〃其他的处理过程

JJJ・

}catch(IOExceptionex){

System.err.println(ex);

return;

readDataProcess.start();

在我的应用程序中,我将收到的数据打包放到一个缓存中,

然后启动另一个线程从缓存中获取并处理数据。

两个线程以生产

者一消费者模式协同工作,数据的流向如下图所示:

这样,我就圆满解决了丢数据问题。

然而,没高兴多久我就又发现了一个同样严重的问题:

虽然这回不再丢数据了,可是原

本一个周期(31秒)之后,传感器节电已经停止传送数据了,但我的串口线程依然在努力的执行读串口操作,在控制台也可以看见

收到的数据仍在不断的打印。

原来,由于传感器节点发送的数据过快,而我的接收线程处理不过来,所以InputStream就先把已

到达却还没处理的字节缓存起来,于是就导致了明明传感器节点已经不再发数据了,而控制台却还能看见数据不断打印这一奇怪

的现象。

唯一值得庆幸的是最后收到数据确实是4900左右字节,

没出现丢失现象。

然而当处理完最后一个数据的时候已经快1分

半钟了,这个时间远远大于节点运行周期。

这一延迟对于一个实时的显示系统来说简直是灾难!

后来我想,是不是由于两个线程之间的同步和通信导致了数

据接收缓慢呢?

于是我在接收线程的代码中去掉了所有处理代码,仅保留打印收到数据的语句,结果依然如故。

看来并不是线程间的通信阻碍了数据的接收速度,而是用线程模型导致了对于

发送端数据发送速率过快的情况下的数据接收延迟。

这里申明一

点,就是对于数据发送速率不是如此快的情况下前面者两种模型应该还是好用的,只是特殊情况还是应该特殊处理。

第三种方法

TinyOS中有一部分是和我的应用程序类似的串口通信部

分,于是我下载了它的1.x版的Java代码部分,参考了它的处理方法。

解决问题的方法说穿了其实很简单,就是从根源入手。

根源不就是接收线程导致的吗,那好,我就干脆取消接收线程和作为中介的共享缓存,而直接在处理线程中调用串口读数据的方法来解决问题,于是程序变成了这样:

publicbyte[]getPack(){

while(true){

//PacketLength为数据包长度

byte[]msgPack=newbyte[PacketLength];

for(inti=0;

i<

PacketLength;

i++){

if((newData=is.read())!

=-1){

msgPack=(byte)newData;

System.out.println(msgPack);

returnmsgPack;

在处理线程中调用这个方法返回所需要的数据序列并处理

之,这样不但没有丢失数据的现象行出现,也没有数据接收延迟

了。

这里唯一需要注意的就是当串口停止发送数据或没有数据的时候is.read()—直都返回-1,如果一旦在开始接收数据的时候发现-1就不要理它,继续接收,直到收到真正的数据为止。

结束语

本文介绍了串口通信的基本知识,以及常用的几种模式。

过实践,提出了一些问题,并在最后加以解决。

希望能对需要操作串口数据的程序员能有所帮助

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2