Java串行端口通讯技术慨论
使用Java实现串口通信

使⽤Java实现串⼝通信本⽂实例为⼤家分享了Java实现串⼝通信的具体代码,供⼤家参考,具体内容如下1.介绍使⽤Java实现的串⼝通信程序,⽀持⼗六进制数据的发送与接收。
源码:效果图如下:2.RXTXcomm内含32位与64位版本使⽤⽅法:拷贝 RXTXcomm.jar 到 JAVA_HOME\jre\lib\ext⽬录中;拷贝 rxtxSerial.dll 到 JAVA_HOME\jre\bin⽬录中;拷贝 rxtxParallel.dll 到 JAVA_HOME\jre\bin⽬录中;JAVA_HOME为jdk安装路径3.串⼝通信管理SerialPortManager实现了对串⼝通信的管理,包括查找可⽤端⼝、打开关闭串⼝、发送接收数据。
package com.yang.serialport.manage;import mPort;import mPortIdentifier;import gnu.io.NoSuchPortException;import gnu.io.PortInUseException;import gnu.io.SerialPort;import gnu.io.SerialPortEventListener;import gnu.io.UnsupportedCommOperationException;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.TooManyListenersException;import com.yang.serialport.exception.NoSuchPort;import com.yang.serialport.exception.NotASerialPort;import com.yang.serialport.exception.PortInUse;import com.yang.serialport.exception.ReadDataFromSerialPortFailure;import com.yang.serialport.exception.SendDataToSerialPortFailure;import com.yang.serialport.exception.SerialPortInputStreamCloseFailure;import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;import com.yang.serialport.exception.SerialPortParameterFailure;import com.yang.serialport.exception.TooManyListeners;/*** 串⼝管理** @author yangle*/public class SerialPortManager {/*** 查找所有可⽤端⼝** @return 可⽤端⼝名称列表*/@SuppressWarnings("unchecked")public static final ArrayList<String> findPort() {// 获得当前所有可⽤串⼝Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();ArrayList<String> portNameList = new ArrayList<String>();// 将可⽤串⼝名添加到List并返回该Listwhile (portList.hasMoreElements()) {String portName = portList.nextElement().getName();portNameList.add(portName);}return portNameList;}/*** 打开串⼝** @param portName* 端⼝名称* @param baudrate* 波特率* @return 串⼝对象* @throws SerialPortParameterFailure* 设置串⼝参数失败* @throws NotASerialPort* 端⼝指向设备不是串⼝类型* @throws NoSuchPort* 没有该端⼝对应的串⼝设备* @throws PortInUse* 端⼝已被占⽤*/public static final SerialPort openPort(String portName, int baudrate) throws SerialPortParameterFailure, NotASerialPort, NoSuchPort, PortInUse {try {// 通过端⼝名识别端⼝CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);// 打开端⼝,设置端⼝名与timeout(打开操作的超时时间)CommPort commPort = portIdentifier.open(portName, 2000);// 判断是不是串⼝if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;try {// 设置串⼝的波特率等参数serialPort.setSerialPortParams(baudrate,SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {throw new SerialPortParameterFailure();}return serialPort;} else {// 不是串⼝throw new NotASerialPort();}} catch (NoSuchPortException e1) {throw new NoSuchPort();} catch (PortInUseException e2) {throw new PortInUse();}}/*** 关闭串⼝** @param serialport* 待关闭的串⼝对象*/public static void closePort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();serialPort = null;}}/*** 向串⼝发送数据** @param serialPort* 串⼝对象* @param order* 待发送数据* @throws SendDataToSerialPortFailure* 向串⼝发送数据失败* @throws SerialPortOutputStreamCloseFailure* 关闭串⼝对象的输出流出错*/public static void sendToPort(SerialPort serialPort, byte[] order) throws SendDataToSerialPortFailure,SerialPortOutputStreamCloseFailure {OutputStream out = null;try {out = serialPort.getOutputStream();out.write(order);out.flush();} catch (IOException e) {throw new SendDataToSerialPortFailure();} finally {try {if (out != null) {out.close();out = null;}} catch (IOException e) {throw new SerialPortOutputStreamCloseFailure();}}}/*** 从串⼝读取数据** @param serialPort* 当前已建⽴连接的SerialPort对象* @return 读取到的数据* @throws ReadDataFromSerialPortFailure* 从串⼝读取数据时出错* @throws SerialPortInputStreamCloseFailure* 关闭串⼝对象输⼊流出错*/public static byte[] readFromPort(SerialPort serialPort)throws ReadDataFromSerialPortFailure,SerialPortInputStreamCloseFailure {InputStream in = null;byte[] bytes = null;try {in = serialPort.getInputStream();// 获取buffer⾥的数据长度int bufflenth = in.available();while (bufflenth != 0) {// 初始化byte数组为buffer中数据的长度bytes = new byte[bufflenth];in.read(bytes);bufflenth = in.available();}} catch (IOException e) {throw new ReadDataFromSerialPortFailure();} finally {try {if (in != null) {in.close();in = null;}} catch (IOException e) {throw new SerialPortInputStreamCloseFailure();}}return bytes;}/*** 添加监听器** @param port* 串⼝对象* @param listener* 串⼝监听器* @throws TooManyListeners* 监听类对象过多*/public static void addListener(SerialPort port,SerialPortEventListener listener) throws TooManyListeners {try {// 给串⼝添加监听器port.addEventListener(listener);// 设置当有数据到达时唤醒监听接收线程port.notifyOnDataAvailable(true);// 设置当通信中断时唤醒中断线程port.notifyOnBreakInterrupt(true);} catch (TooManyListenersException e) {throw new TooManyListeners();}}}4.程序主窗⼝/** MainFrame.java** Created on 2016.8.19*/package com.yang.serialport.ui;import gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import java.awt.Color;import java.awt.GraphicsEnvironment;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import com.yang.serialport.exception.NoSuchPort;import com.yang.serialport.exception.NotASerialPort;import com.yang.serialport.exception.PortInUse;import com.yang.serialport.exception.SendDataToSerialPortFailure; import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure; import com.yang.serialport.exception.SerialPortParameterFailure;import com.yang.serialport.exception.TooManyListeners;import com.yang.serialport.manage.SerialPortManager;import com.yang.serialport.utils.ByteUtils;import com.yang.serialport.utils.ShowUtils;/*** 主界⾯** @author yangle*/public class MainFrame extends JFrame {/*** 程序界⾯宽度*/public static final int WIDTH = 500;/*** 程序界⾯⾼度*/public static final int HEIGHT = 360;private JTextArea dataView = new JTextArea();private JScrollPane scrollDataView = new JScrollPane(dataView);// 串⼝设置⾯板private JPanel serialPortPanel = new JPanel();private JLabel serialPortLabel = new JLabel("串⼝");private JLabel baudrateLabel = new JLabel("波特率");private JComboBox commChoice = new JComboBox();private JComboBox baudrateChoice = new JComboBox();// 操作⾯板private JPanel operatePanel = new JPanel();private JTextField dataInput = new JTextField();private JButton serialPortOperate = new JButton("打开串⼝");private JButton sendData = new JButton("发送数据");private List<String> commList = null;private SerialPort serialport;public MainFrame() {initView();initComponents();actionListener();initData();}private void initView() {// 关闭程序setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); // 禁⽌窗⼝最⼤化setResizable(false);// 设置程序窗⼝居中显⽰Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, WIDTH, HEIGHT);this.setLayout(null);setTitle("串⼝通讯");}private void initComponents() {// 数据显⽰dataView.setFocusable(false);scrollDataView.setBounds(10, 10, 475, 200);add(scrollDataView);// 串⼝设置serialPortPanel.setBorder(BorderFactory.createTitledBorder("串⼝设置"));serialPortPanel.setBounds(10, 220, 170, 100);serialPortPanel.setLayout(null);add(serialPortPanel);serialPortLabel.setForeground(Color.gray);serialPortLabel.setBounds(10, 25, 40, 20);serialPortPanel.add(serialPortLabel);commChoice.setFocusable(false);commChoice.setBounds(60, 25, 100, 20);serialPortPanel.add(commChoice);baudrateLabel.setForeground(Color.gray);baudrateLabel.setBounds(10, 60, 40, 20);serialPortPanel.add(baudrateLabel);baudrateChoice.setFocusable(false);baudrateChoice.setBounds(60, 60, 100, 20);serialPortPanel.add(baudrateChoice);// 操作operatePanel.setBorder(BorderFactory.createTitledBorder("操作"));operatePanel.setBounds(200, 220, 285, 100);operatePanel.setLayout(null);add(operatePanel);dataInput.setBounds(25, 25, 235, 20);operatePanel.add(dataInput);serialPortOperate.setFocusable(false);serialPortOperate.setBounds(45, 60, 90, 20);operatePanel.add(serialPortOperate);sendData.setFocusable(false);sendData.setBounds(155, 60, 90, 20);operatePanel.add(sendData);}@SuppressWarnings("unchecked")private void initData() {commList = SerialPortManager.findPort();// 检查是否有可⽤串⼝,有则加⼊选项中if (commList == null || commList.size() < 1) {ShowUtils.warningMessage("没有搜索到有效串⼝!");} else {for (String s : commList) {commChoice.addItem(s);}}baudrateChoice.addItem("9600");baudrateChoice.addItem("19200");baudrateChoice.addItem("38400");baudrateChoice.addItem("57600");baudrateChoice.addItem("115200");}private void actionListener() {serialPortOperate.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if ("打开串⼝".equals(serialPortOperate.getText())&& serialport == null) {openSerialPort(e);} else {closeSerialPort(e);}}});sendData.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {sendData(e);}});}/*** 打开串⼝** @param evt* 点击事件*/private void openSerialPort(java.awt.event.ActionEvent evt) {// 获取串⼝名称String commName = (String) commChoice.getSelectedItem();// 获取波特率int baudrate = 9600;String bps = (String) baudrateChoice.getSelectedItem();baudrate = Integer.parseInt(bps);// 检查串⼝名称是否获取正确if (commName == null || commName.equals("")) {ShowUtils.warningMessage("没有搜索到有效串⼝!");} else {try {serialport = SerialPortManager.openPort(commName, baudrate); if (serialport != null) {dataView.setText("串⼝已打开" + "\r\n");serialPortOperate.setText("关闭串⼝");}} catch (SerialPortParameterFailure e) {e.printStackTrace();} catch (NotASerialPort e) {e.printStackTrace();} catch (NoSuchPort e) {e.printStackTrace();} catch (PortInUse e) {e.printStackTrace();ShowUtils.warningMessage("串⼝已被占⽤!");}}try {SerialPortManager.addListener(serialport, new SerialListener()); } catch (TooManyListeners e) {e.printStackTrace();}}/*** 关闭串⼝** @param evt* 点击事件*/private void closeSerialPort(java.awt.event.ActionEvent evt) {SerialPortManager.closePort(serialport);dataView.setText("串⼝已关闭" + "\r\n");serialPortOperate.setText("打开串⼝");}/*** 发送数据** @param evt* 点击事件*/private void sendData(java.awt.event.ActionEvent evt) {// 输⼊框直接输⼊⼗六进制字符,长度必须是偶数String data = dataInput.getText().toString();try {SerialPortManager.sendToPort(serialport,ByteUtils.hexStr2Byte(data));} catch (SendDataToSerialPortFailure e) {e.printStackTrace();} catch (SerialPortOutputStreamCloseFailure e) {e.printStackTrace();}}private class SerialListener implements SerialPortEventListener { /*** 处理监控到的串⼝事件*/public void serialEvent(SerialPortEvent serialPortEvent) {switch (serialPortEvent.getEventType()) {case SerialPortEvent.BI: // 10 通讯中断ShowUtils.errorMessage("与串⼝设备通讯中断");break;case SerialPortEvent.OE: // 7 溢位(溢出)错误case SerialPortEvent.FE: // 9 帧错误case SerialPortEvent.PE: // 8 奇偶校验错误case SerialPortEvent.CD: // 6 载波检测case SerialPortEvent.CTS: // 3 清除待发送数据case SerialPortEvent.DSR: // 4 待发送数据准备好了case SerialPortEvent.RI: // 5 振铃指⽰case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空break;case SerialPortEvent.DATA_AVAILABLE: // 1 串⼝存在可⽤数据byte[] data = null;try {if (serialport == null) {ShowUtils.errorMessage("串⼝对象为空!监听失败!");} else {// 读取串⼝数据data = SerialPortManager.readFromPort(serialport);dataView.append(ByteUtils.byteArrayToHexString(data,true) + "\r\n");}} catch (Exception e) {ShowUtils.errorMessage(e.toString());// 发⽣读取错误时显⽰错误信息后退出系统System.exit(0);}break;}}}public static void main(String args[]) {java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new MainFrame().setVisible(true);}});}}5.写在最后源码下载地址:欢迎同学们吐槽评论,如果你觉得本篇博客对你有⽤,那么就留个⾔或者顶⼀下吧(^-^)感谢:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
第3节1 串行通信概述

可编程串行接口8251 可编程串行接口
7.3.1 串行通信概述
串行通信是指逐位顺序传送数据的通信方式。 串行通信是指逐位顺序传送数据的通信方式。
串行通信的优势: 串行通信的优势:
用于通信的线路少,因而在远距离通信时可以极大地降低成本 串行通信适合 用于通信的线路少,因而在远距离通信时可以极大地降低成本,串行通信适合 于远距离数据传送, 于远距离数据传送,也常用于速度要求不高的近距离数据传送 PC机上有两个串行通信接口 键盘、鼠标器与主机间采用串行数据传送 机上有两个串行通信接口,键盘 机上有两个串行通信接口 键盘、
(3) 信道
信道是传输信息所经过的通道 是连接两个数据终端设备的线路 信道是传输信息所经过的通道,是连接两个数据终端设备的线路 它包括传输介质 是传输信息所经过的通道 是连接两个数据终端设备的线路,它包括传输介质 和有关的中间设备。 和有关的中间设备。
4. 串行通信的工作方式
5. 同步通信和异步通信方式 (1) 同步通信方式
6.通信中必须遵循的规定 通信中必须遵循的规定 (1) 字符格式的规定
通信中,传输字符的格式要按规定写。 通信中,传输字符的格式要按规定写。
图7.35 异步通信字符格式
(2) 比特率、波特率 比特率、 传输率是指每秒传输的二进制数的位数。 传输率是指每秒传输的二进制数的位数。 是指每秒传输的二进制数的位数
波特率是指每秒传输的离散信号的数目。 是指每秒传输的离散信号的数目。 时钟的频率是位传输率的 倍 倍和64倍 时钟的频率是位传输率的1倍、16倍和 倍。—波特率因子 是位传输率的 倍和 波特率因子
7. 信号的调制与解调
(2) 数据终端设备和数据通信设备
数据终端设备:它是对属于用户的所有联网设备和工作站的统称。 数据终端设备 它是对属于用户的所有联网设备和工作站的统称。 它是对属于用户的所有联网设备和工作站的统称 数据通信设备:该设备为用户设备提供入网的连接点。 数据通信设备:该设备为用户设备提供入网的连接点。如:调制解调器等。 调制解调器等。
串行通信概述

串行通信概述串行通信是一种数据传输技术,它将传输的数据位逐个串行传输,而不是同时传输多个位。
串行通信通常比并行通信慢,因为传输时间更长,但它在数据传输方面具有一定的优势。
串行通信的优点使用串行通信技术有一些明显的优点。
首先,串行通信最大使用的是一根传输线。
这意味着使用串行通信技术的设备材料成本更低,因为它们不需要使用很多线缆。
此外,因为传输速度较慢,串行通信也更适合在长距离传输数据。
因此,串行通信技术主要用于远距离通信,如在无线电通讯和卫星通信等方面。
串行通信在数据传输中更安全,因为数据以逐个比特的形式传输。
这使得数据从被入侵的风险中更容易获得保护,因为他们很难破解这种逐位传输的数据格式。
串行通信的缺点虽然串行通信有一些优势,但它也有一些缺点。
首先,传输速度比较慢,因为逐个传输的数据的传输速度较慢。
为了增加传输速度,可以使用并行通信来同时传输多个数据位。
其次,由于传输的数据以逐个比特的形式传输,设备指令可能需要更多的时间来处理数据。
这可以显著影响计算机的整体性能。
串口串口是一种常见的串行通信接口,用于将计算机连接到其他设备。
串口通常用于传输控制台和其他设备之间的操作指令。
串口通常使用串行线缆和特定的串口连接器进行数据传输。
串口还具有通常使用的标准的传输速率,因此,需要使用相同波特率的设备才能正确地通信。
串口通信使用有效载荷、校验和和控制位等机制来保证传输数据的准确性。
有效载荷是传输的实际数据位。
校验和是一种用于检查数据是否完整无误的机制。
在数据传输过程中,校验和用于检测在传输过程中可能发生的错误。
控制位用于控制数据传输的节奏和速率等因素。
总结串行通信是一种数据传输技术,它采用逐个传输数据位的方式传输数据。
串行通信技术更适用于远距离通信,并且使用成本更低。
但是,由于传输速度较慢,它可能对计算机的性能产生负面影响。
串口是一种常见的串行通信接口,提供了有效载荷、校验和和控制位等机制,以确保传输数据的准确性。
串行接口教程串行通讯的概念

(2)数据发送与接收线: 发送数据(Transmitted data-TxD)——通过TxD终端将串行数据发送到MODEM,(DTE→DCE)。 接收数据(Received data-RxD)——通过RxD线终端接收从MODEM发来的串行数据,(DCE→DTE)。 (3)地线 有两根线SG、PG——信号地和保护地信号线,无方向。
奇偶校验
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如: 1 0110,0101 0 0110,0001 偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如: 1 0100,0101 0 0100,0001
1.电气特性
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。 在TxD和RxD上:逻辑1(MARK) =-3V~-15V 逻辑0(SPACE)=+3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压) = -3V~-15V
TTLRS232转换芯片
连接器的机械特性
串口通信基本接线方法
9针串口(DB9)
25针串口(DB25)
针号
功能说明
缩写
针号
功能说明
缩写
1
数据载波检测
DCD
8
数据载波检测
DCD
2
接收数据
RXD
3
接收数据
RXD
3
发送数据
TXD
2
发送数据
TXD
4
数据终端准备
DTR
Java串口通信详解

Java串口通信详解序言说到开源,恐怕很少有人不挑大指称赞。
学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜。
然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱。
这也难怪,毕竟就像某个著名NBA 球员说的那样:“我还要养家,所以千万美元以下的合同别找我谈,否则我宁可待业”。
是啊,支持开源的人也要养家,收点钱也不过分。
要想既不花钱又学到知识就只能借助网络和了,我只是想抛砖引玉,为开源事业做出点微薄共献,能为你的工程解决哪怕一个小问题,也就足够了。
虽然我的这个系列介绍的东西不是什么Web框架,也不是什么开源服务器,但是我相信,作为一个程序员,什么样的问题都会遇到。
有时候越是简单的问题反而越棘手;越是小的地方就越是找不到称手的家伙。
只要你不是整天只与“架构”、“构件”、“框架”打交道的话,相信我所说的东西你一定会用到。
1串口通信简介1.1常见的Java串口包1.2串口包的安装(Windows下)2串口API概览mPortmPortIdentifierm.SerialPort2.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并行端口通讯的支持。
详细解读Java的串口编程

详细解读Java的串⼝编程常见问题JavaComm 和 RxTX 安装时有⼀些与众不同的地⽅。
强烈建议按照安装说明⼀点点的安装。
如果安装说明要求⼀个jar⽂件或⼀个共享库必须在某⼀特定的⽂件夹下,那这就意味着需要严肃对待。
如果说明要求⼀个特定的⽂件或设备需要拥有⼀个特定的所有权或访问权,这也意味着需要严肃处理。
很多安装问题都只是因为没有按照安装说明要求的去做⽽引起的。
特别要注意的是⼀些版本的JavaComm会带有两个安装说明。
⼀个⽤于java 1.2及以后的版本,⼀个⽤于java 1.1版本。
使⽤错误的安装说明会导致不能⼯作的安装结果。
另⼀⽅⾯,TxTx的⼀些版本/构件/包会包含不完全的说明。
在这种情况下需要获得相关的RxTx发布的源码,它包含了完整的安装说明。
另外要注意Windows的Jdk安装程序会包含三个java虚拟机,因此会有三个扩展⽂件夹。
1. ⼀个作为JDK的组成部分。
2. ⼀个作为与运⾏JDK⼯具的JDK⼀起的私有JRE的⼀部分。
3. ⼀个作为与运⾏应⽤程序的JDK⼀起的公共JRE的⼀部分。
更有甚者甚⾄会有第4个jre,它存在于\Windows的⽬录结构中。
JavaComm应该作为扩展被安装到JDK和所有公共JRE中。
WebstartJavaComm关于JavaComm和RxTx的⼀个常见问题是它们不⽀持通过Java WebStart进⾏安装:JavaComm的臭名昭著是因为需要将⼀个称为m.properties的⽂件放到JDK lib⽬录下,⽽这是不能通过Java WebStart完成的。
很令⼈沮丧的是,对于该⽂件的需要是JavaComm中⼀些不必要的设计/决定所导致的恶果,⽽JavaComm的设计者们可以很容易地避免这种事情。
Sun固执地拒绝修正这个错误,他们强调这个机制是必不可少的。
他们是在睁着眼说瞎话,特别是当提及JavaComm时,因为Java在很长⼀段时间内拥有⼀个专门⽤于此类意图的服务提供者架构。
串口通讯-Java(Rxtx)

基于无线传感定位系统的通信软件一、运行环境:Windows操作系统下运行,由于作品是基于java虚拟机的,所以需要安装jvm 该作品是属于基于硬件的通信软件,所以在对数据的接收上要求无线传感器支持,这个软件主要任务是对无线传感器发送来的数据进行准确,形象的整理和分析。
二、开发环境:软件开发环境是在eclipse这个平台上,基于java的RXTX串口通信技术完成的。
三、功能说明:1、各类结点数据的接受处理和统计;2、界面面板缩进的控制;3、温度数据湿度数据的对比图像;4、图像的缩放功能。
5、室内平面图的上传和缩放以及定位。
6、节点位置信息处理,显示在相对位置图上,每个节点要能够通过颜色反映出节点周围的温度状况。
7、数据的发送功能,我及时的向底层硬件发送数据帧,实现软硬件的实时联系和交互。
8、常用信息的设置功能,比如室温,串口属性信息,数据接受格式等四、作品整体效果展示温湿度曲线显示、控制和对比结点位置信息和温度信息的图像反映五、操作以及功能说明:1、串口设置:要针对电脑接入串口时的属性,和底层数据发送帧的格式在如下面板中设置。
2、常用命令的设置,设置这些向底层发出请求的命令,可以灵活的控制我们所需要的数据,比如我们可以选择请求结点的温度信息,请求结点的湿度信息,或者是位置信息等等。
3、温湿度曲线的控制,设置好之后,点击ok,点击开始按钮,便会接受到底层硬件发来的数据,但是我们的硬件可能是很多个结点,如果都反映在图像上,可能略显混乱,所以我们可以在结点数据面板中控制哪个结点的显示状况。
4、结点位置信息的查看,下面的截图反映了结点的位置信息,大的圆圈是参考结点的位置和温度信息的反映,从内向外温度不断的接近室温,颜色越深的部分表示温度越高,小的绿园是我们要定位的盲几点的位置信息的反映,随着盲几点的实际位置信息的变化,图像中会做出准确的变化。
,5、盲结点和参考结点相关参数的设定,我们选中单选框,信息会出现在文本框中,设置好后,点击update,发送到底层。
串行口通信技术

总结词
无线串行口通信技术打破了传统线缆的束缚,为设备间的通信提供了更加灵活的解决方案。
详细描述
无线串行口通信技术通过无线信号传输数据,常见的标准包括Wi-Fi、蓝牙、Zigbee等。这种技术广泛应用于智能家居、工业自动化等领域,为设备的无线连接和数据传输提供了便利。
无线串行口通信技术
THANKS FOR
01
02
03
04
05
06
定义与特点
03
同步
发送端和接收端需要建立同步关系,确保数据传输的正确性。
01
数据发送
发送端将数据按位顺序一位一位地通过传输线发送到接收端。
02
数据接收
接收端按位顺序一位一位地接收数据,并将数据存储在存储器中。
串行口通信的原理
单工、半双工、全双工。
根据传输方向
同步串行通信、异步串行通信。
数据采集与监控系统(SCADA)
实时性要求
工业自动化控制系统对实时性要求较高,串行口通信技术能够快速传输数据,满足实时控制的需求。
可靠性要求
在工业环境中,设备之间的通信需要稳定可靠,串行口通信技术具有较高的可靠性,能够保证设备的稳定运行。
设备连接
串行口通信技术可以将工业自动化控制系统中的各种设备连接起来,实现设备之间的数据交换和控制。
串行口通信硬件
串行口通信硬件
try {
02
组织 传入,组织 执行 这个任务,组织 训练 这个任务,组织 完成。 这个任务,组织 验收 这个任务, 组织 完成 这个任务, 组织 完成 这个任务,
03
如果 组织 任务 这个任务, 组织 完成 这个任务, 如果 组织 任务 这个任务, 如果 组织 任务 这个任务,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java串行端口通讯技术慨论作者:时间:2004年5月10日16:18:35来源:天极论坛了解串行通讯串行通讯协议有很多种,像RS232,RS485,RS422,甚至现今流行的USB等都是串行通讯协议。
而串行通讯技术的应用无处不在。
可能大家见的最多就是电脑的串口与Modem的通讯。
记得在PC机刚开始在中国流行起来时(大约是在90年代前五年),那时甚至有人用一条串行线进行两台电脑之间的数据共享。
除了这些,手机,PDA,USB鼠标、键盘等等都是以串行通讯的方式与电脑连接。
而笔者工作性质的关系,所接触到的就更多了,像多串口卡,各种种类的具有串口通讯接口的检测与测量仪器,串口通讯的网络设备等。
虽然串行通讯有很多种,但笔者所知的在整个电子通讯产品方面,以RS232的通讯方式最为多见。
虽然USB 接口的电子产品也是层出不穷,但了解一下Java在串行通讯方面的技术还有有必要的,说不定有哪位读者还想用此技术写一个PDA与电脑之间数据共享的程序呢。
本文主要以RS232为主来讲解Java的串行通讯技术。
RS232通讯基础RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
RS232是一个全双工的通讯协议,它可以同时进行数据接收和发送的工作。
RS232的端口通常有两种:9针(DB9)和25针(DB25)。
DB9和DB25的常用针脚定义Java串行端口通讯技术慨论(2)作者:时间:2004年5月10日16:19:44来源:天极论坛安装Java Communications APISun的J2SE中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立的jar包形式发布在网站上(从这里下载)----即comm.jar,称之为Javatm Communications API,它是J2SE的标准扩展。
comm.jar并不是最近才有,早在1998年时,sun就已经发布了这个开发包。
comm.jar分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。
目前sun发布的comm.jar只有Windows和Solaris平台两个版本,如果你需要Linux平台下的,可以在/~kevinh/linuxcomm.html找到。
在使用comm.jar之前,必须知道如何安装它。
这也是困扰许多初学java RS232通讯者的一个难题。
如果我们电脑上安装了JDK, 它将同时为我们安装一份JRE(Java Runtime Entironment),通常我们运行程序时都是以JRE来运行的。
所以以下的安装适用于JRE。
如果你是用JDK来运行程序的,请将相应的<JRE_HOME>改成<JDK_HOME>。
下载了comm.jar开发包后,与之一起的还有两个重要的文件,win32com.dll和m.properties。
comm.jar 提供了通讯用的java API,而win32com.dll提供了供comm.jar调用的本地驱动接口。
而m.properties是这个驱动的类配置文件。
首先将comm.jar复制到<JRE_HOME>\lib\ext目录。
再将win21com.dll复制到你的RS232应用程序运行的目录,即user.dir。
然后将m.properties复制到<JRE_HOME>\lib目录。
通讯前的准备如果你手头上没有现成的提供了标准RS232串口的设备,你可以将自己的电脑模拟成两台不同的串口设备。
通常电脑主机后面的面板提供了两个9针的串口,请将这两个串口的2,3,5脚按前面介绍的方法连接。
电子市场都有现成的连接头卖,请不要买那种封装的严严实实的接头,而要买用螺丝封装可以拆开的连接头,这样可以方便自己根据需要连接各个针脚。
Comm API基础我无意于在此详细描述Comm API每个类和接口的用法,但我会介绍Comm API的类结构和几个重要的API 用法。
所有的comm API位于m包下面。
从Comm API的javadoc来看,它介绍给我们的只有区区以下13个类或接口:mDrivermPortm.ParallelPortm.SerialPortmPortIdentifiermPortOwnershipListenerm.ParallelPortEventm.SerialPortEventm.ParallelPortEventListener (extends java.util.EventListener)m.SerialPortEventListener (extends java.util.EventListener)m.NoSuchPortExceptionm.PortInUseExceptionm.UnsupportedCommOperationExceptionJava串行端口通讯技术慨论(3)作者:时间:2004年5月10日16:22:18来源:天极论坛在开始使用RS232端口通讯之前,我们想知道系统有哪些端口是可用的,以下代码列出系统中所有可用的RS232端口:Enumeration en = CommPortIdentifier.getPortIdentifiers();CommPortIdentifier portId;while (en.hasMoreElements()){portId = (CommPortIdentifier) en.nextElement();/*如果端口类型是串口,则打印出其端口信息*/if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL){System.out.println(portId.getName());}}在我的电脑上以上程序输出以下结果:COM1COM2CommPortIdentifier类的getPortIdentifiers方法可以找到系统所有的串口,每个串口对应一个CommPortIdentifier类的实例。
2.打开端口如果你使用端口,必须先打开它。
try{CommPort serialPort = portId.open("My App", 60);/* 从端口中读取数据*/InputStream input = serialPort.getInputS tream();input.read(...);/* 往端口中写数据*/OutputStream output = serialPort.getOutputS tream();output.write(...)...}catch(PortInUseException ex){ ... }通过CommPortIdentifier的open方法可以返回一个CommPort对象。
open方法有两个参数,第一个是String,通常设置为你的应用程序的名字。
第二个参数是时间,即开启端口超时的毫秒数。
当端口被另外的应用程序占用时,将抛出PortInUseException异常。
在这里CommPortIdentifier类和CommPort类有什么区别呢?其实它们两者是一一对应的关系。
CommPortIdentifier主要负责端口的初始化和开启,以及管理它们的占有权。
而CommPort则是跟实际的输入和输出功能有关的。
通过CommPort的getInputStream()可以取得端口的输入流,它是java.io.InputStream接口的一个实例。
我们可以用标准的InputStream的操作接口来读取流中的数据,就像通过FileInputSteam读取文件的内容一样。
相应的,CommPort的getOutputStream可以获得端口的输出流,这样就可以往串口输出数据了。
3. 关闭端口使用完的端口,必须记得将其关闭,这样可以让其它的程序有机会使用它,不然其它程序使用该端口时可能会抛出端口正在使用中的错误。
很奇怪的是,CommPortIdentifier类只提供了开启端口的方法,而要关闭端口,则要调用CommPort类的close()方法。
Java串行端口通讯技术慨论(4)作者:时间:2004年5月10日16:23:19来源:天极论坛通讯方式CommPort的输入流的读取方式与文件的输入流有些不一样,那就是你可能永远不知这个InputStream何时结束,除非对方的OutputStream向你发送了一个特定数据表示发送结束,你收到这个特定字符后,再行关闭你的InputStream。
而comm.jar提供了两种灵活的方式让你读取数据。
1. 轮询方式(Polling)举个例子,你同GF相约一起出门去看电影,但你的GF好打扮,这一打扮可能就是半小时甚至一小时以上。
这时你就耐不住了,每两分钟就催问一次“好了没?”,如此这样,直到你的GF说OK了才算完。
这个就叫轮询(Polling)。
在程序中,轮询通常设计成一个封闭的循环,当满足某个条件时即结束循环。
刚才那个例子中,你的GF说“OK了!”,这个就是结束你轮询的条件。
在单线程的程序中,当循环一直执行某项任务而又无法预知它何时结束时,此时你的程序看起来可能就像死机一样。
在VB程序中,这个问题可以用在循环结构中插入一个doEvent 语句来解决。
而Java中,最好的方式是使用线程,就像以下代码片断一样。
public TestPort extend Thread{...InputStream input = serialPort.getInputS tream();StringBuffer buf = new StringBuffer();boolean stopped = false;...public void run(){try {while( !stopped )int ch = input.read();if ( ch=='q' || ch=='Q' ){/* 结束读取,关闭端口...*/stopped = true;...}else{buf.append((char)ch);...}}catch (InterruptedException e) { }}}2. 监听方式(listening)Comm API支持标准的Java Bean型的事件模型。
也就是说,你可以使用类似AddXXXListener这样的方法为一个串口注册自己的监听器,以监听方式进行数据读取。
如要对端口监听,你必须先取得CommPortIdentifier类的一个实例,CommPort serialPort = portId.open("My App", 60);从而取得SerialPort,再调用它的addEventListener方法为它添加监听器,serialPort.addEventListener(new MyPortListener());SerialPort的监听器必须继承于SerialPortEventListener接口。