串口通信的原理
- 串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
- 串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialBus或者USB混淆)
- 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是比特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配
- RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准、RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-485(EIA-485标准)是RS-422的改进。
在一台电脑上我们需要做哪些准备工作来实现Java的串口通信?
由于笔记本或台式机上基本上都没有成对的串口提供给我们调试使用,我们就需要下载虚拟串口软件来实现串口调试。【当然你要是软硬通吃的,有硬件的设备在旁边的话,那你就忽略这一步的操作】
- 下载虚拟串口软件**:下载安装完成后先不要急着运行,把压缩包中的vspdctl.dll文件复制到安装目录下替换原有文件即可成功激活。
- 打开软件添加虚拟串口,一般都是成对添加的(添加COM3、COM4)后如图所示(根据自己的需求添加串2口):
- 添加完成后到设备管理器中查看,发现多了两个虚拟串口如图:
<code>这样的话就说明虚拟接口创建成功了,就可以进入下一步操作了。 /<code>
- 下载串口调试软件:,这软件还是比较好用的。直接解压点击打开就ok了。
- 可以直接先打开两个调试窗口,分别用来表示COM3和COM4串口。两个串口的参数一定要设置的一样才可以正常的收发数据。(若调试可以正常收发数据后,可以关掉一个调试器,而用java程序代替)如图:
Java代码的编写和调试
这一部分将是我们的重点,要与串口通信首先要在项目添加RXTXcomm.jar包(放在项目中的lib目录下,并添加到build Path中)
另外,还需要将解压后的rxtxParallel.dll和rxtxSerial.dll两个文件放在%JAVA_HOME%/jre/bin目录下,这样该包才能被正常的加载和调用。【在解压以后的包中有install.txt文档里面有需要放到的路径介绍(Copy RXTXcomm.jar ---> \jre\lib\ext ;Copy rxtxSerial.dll --->\jre\bin;Copy rxtxParallel.dll ---> \jre\bin)】
注:安装到%JAVA_HOME%/jre/bin时--需要安装的是tomacat下的jdk文件中,记住一定要是tomcat运行调用的jdk下,包括开发环境时,也是tomcat的jdk下(因为有时开发配置时开发jdk与tomcat运行jdk不是同一个jdk,这里指tomcat运行jdk,在eclipse的window-preferences下的servers中jdk)
如果不是tomacat下的jdk会报错:
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
解决方法就是把上面的几个文件导入到正确的路径下。
Java连接传输数据的代码块:
<code>package
Chuankou;import
java.io.*;import
java.util.*;import
java.util.concurrent.BlockingQueue;import
java.util.concurrent.LinkedBlockingQueue;import
gnu.io.*;public
class
ContinueckRead
extends
Thread
implements
SerialPortEventListener
{static
CommPortIdentifier portId;static
Enumeration> portList; InputStream inputStream;static
OutputStream outputStream;static
SerialPort serialPort;private
BlockingQueue msgQueue =new
LinkedBlockingQueue();public
void
serialEvent
(SerialPortEvent event)
{switch
(event.getEventType()) {case
SerialPortEvent.BI:case
SerialPortEvent.OE:case
SerialPortEvent.FE:case
SerialPortEvent.PE:case
SerialPortEvent.CD:case
SerialPortEvent.CTS:case
SerialPortEvent.DSR:case
SerialPortEvent.RI:case
SerialPortEvent.OUTPUT_BUFFER_EMPTY:break
;case
SerialPortEvent.DATA_AVAILABLE:byte
[] readBuffer =new
byte
[20
];try
{int
numBytes = -1
;while
(inputStream.available() >0
) { numBytes = inputStream.read(readBuffer);if
(numBytes >0
) { msgQueue.add(new
Date() +"真实收到的数据为:-----"
+new
String(readBuffer)); readBuffer =new
byte
[20
]; }else
{ msgQueue.add("额------没有读到数据"
); } } }catch
(IOException e) { }break
; } }public
int
startComPort
()
{ portList = CommPortIdentifier.getPortIdentifiers();while
(portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); System.out.println("设备类型:--->"
+ portId.getPortType()); System.out.println("设备名称:---->"
+ portId.getName());if
(portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {if
(portId.getName().equals("COM4:USB-SERIAL"
)) {try
{ serialPort = (SerialPort) portId.open("COM_4"
,2000
); }catch
(PortInUseException e) { e.printStackTrace();return
0
; }try
{ inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); }catch
(IOException e) { e.printStackTrace();return
0
; }try
{ serialPort.addEventListener(this
); }catch
(TooManyListenersException e) { e.printStackTrace();return
0
; } serialPort.notifyOnDataAvailable(true
);try
{ serialPort.setSerialPortParams(9600
, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); }catch
(UnsupportedCommOperationException e) { e.printStackTrace();return
0
; }return
1
; } } }return
0
; }public
void
run
()
{try
{ System.out.println("--------------任务处理线程运行了--------------"
);while
(true
) {if
(msgQueue.size() >0
) { System.out.println(msgQueue.take()); } } }catch
(InterruptedException e) { e.printStackTrace(); } }public
static
void
main
(String[] args)
{ ContinueckRead cRead =new
ContinueckRead();int
i = cRead.startComPort();if
(i ==1
) { cRead.start();try
{ String st ="哈哈----你好"
; System.out.println("发出字节数:"
+ st.getBytes("gbk"
).length); outputStream.write(st.getBytes("gbk"
),0
, st.getBytes("gbk"
).length); }catch
(IOException e) { e.printStackTrace(); } }else
{return
; } } } /<code>
Java程序与串口通信的结果:
程序和XCOM 的联合调试:
最后,到此关于Java和串口通信的内容全部结束,希望对你有所帮助。
如果觉得本文不错,观众老爷们别忘了点下关注再走哦!
關鍵字: serialPort portId return