java读串口数据乱码~
沉痛哀悼汶川父老乡亲.
我又来问问题了 由于刚接触java 上头分下来的工作又有难度 残念啊~多谢大大们解答了~
读串口接的刷卡器 刷卡器是hce-406
波特率:19200bps
控制字方式:1位开始位,8个数据位,一个停止位,无奇偶校验
通讯协议格式:
------------------------------------------------------
|开始标志|分机地址|信息长度|命令和参数/丛机返回|校验|
------------------------------------------------------
刷卡后读到的确实乱码 找了找相关的资料 问题仍未解决......
这是我在网上找的程序
R_Frame .java
package com.test2;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;
class R_Frame extends Frame implements Runnable, ActionListener,
SerialPortEventListener {
/**//* 检测系统中可用的通讯端口类 */
static CommPortIdentifier portId;
/**//* Enumeration 为枚举型类,在java.util中 */
static Enumeration portList;
InputStream inputStream;
/**//* 声明RS-232串行端口的成员变量 */
SerialPort serialPort;
Thread readThread;
String str = "";
TextField out_message = new TextField("上面文本框显示接收到的数据");
TextArea in_message = new TextArea();
Button btnOpen = new Button("打开串口");
/**//* 建立窗体 */
R_Frame() {
super("串口接收数据");
setSize(200, 200);
setVisible(true);
btnOpen.addActionListener(this);
add(out_message, "South");
add(in_message, "Center");
add(btnOpen, "North");
} // R_Frame() end
/**//* 点击按扭所触发的事件:打开串口,并监听串口. */
public void actionPerformed(ActionEvent event) {
/**//* 获取系统中所有的通讯端口 */
portList = CommPortIdentifier.getPortIdentifiers();
/**//* 用循环结构找出串口 */
while (portList.hasMoreElements()) {
/**//* 强制转换为通讯端口类型 */
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
try {
serialPort = (SerialPort) portId.open("ReadComm", 2000);
out_message.setText("已打开端口COM1 ,正在接收数据..... ");
} catch (PortInUseException e) {
}
/**//* 设置串口监听器 */
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
}
/**//* 侦听到串口有数据,触发串口事件 */
serialPort.notifyOnDataAvailable(true);
} // if end
} // if end
} // while end
readThread = new Thread(this);
readThread.start();// 线程负责每接收一次数据休眠20秒钟
} // actionPerformed() end
/**//* 接收数据后休眠20秒钟 */
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
}
} // run() end
/**//* 串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中 */
public void serialEvent(SerialPortEvent event) {
/**//* 设置串口通讯参数:波特率、数据位、停止位、奇偶校验 */
try {
serialPort.setSerialPortParams(19200, SerialPort.PARITY_NONE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1);
} catch (UnsupportedCommOperationException e) {
}
byte[] readBuffer = new byte[20];
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {
}
try {
/**//* 从线路上读取数据流 */
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
} // while end
str = new String(readBuffer);
/**//* 接收到的数据存放到文本区中 */
in_message.append(str + " ");
} catch (IOException e) {
}
} // serialEvent() end
} // 类R_Frame end
----------------------------------------------------------------------------------------------
ReadComm.java
package com.test2;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ReadComm
{
public static void main(String args[])
{
/**//* 实例化接收串口数据的窗体类 */
R_Frame R_win=new R_Frame();
/**//* 定义窗体适配器的关闭按钮功能 */
R_win.addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{System.exit(0); }
});
R_win.pack();
}
}
我又来问问题了 由于刚接触java 上头分下来的工作又有难度 残念啊~多谢大大们解答了~
读串口接的刷卡器 刷卡器是hce-406
波特率:19200bps
控制字方式:1位开始位,8个数据位,一个停止位,无奇偶校验
通讯协议格式:
------------------------------------------------------
|开始标志|分机地址|信息长度|命令和参数/丛机返回|校验|
------------------------------------------------------
刷卡后读到的确实乱码 找了找相关的资料 问题仍未解决......
这是我在网上找的程序
R_Frame .java
package com.test2;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;
class R_Frame extends Frame implements Runnable, ActionListener,
SerialPortEventListener {
/**//* 检测系统中可用的通讯端口类 */
static CommPortIdentifier portId;
/**//* Enumeration 为枚举型类,在java.util中 */
static Enumeration portList;
InputStream inputStream;
/**//* 声明RS-232串行端口的成员变量 */
SerialPort serialPort;
Thread readThread;
String str = "";
TextField out_message = new TextField("上面文本框显示接收到的数据");
TextArea in_message = new TextArea();
Button btnOpen = new Button("打开串口");
/**//* 建立窗体 */
R_Frame() {
super("串口接收数据");
setSize(200, 200);
setVisible(true);
btnOpen.addActionListener(this);
add(out_message, "South");
add(in_message, "Center");
add(btnOpen, "North");
} // R_Frame() end
/**//* 点击按扭所触发的事件:打开串口,并监听串口. */
public void actionPerformed(ActionEvent event) {
/**//* 获取系统中所有的通讯端口 */
portList = CommPortIdentifier.getPortIdentifiers();
/**//* 用循环结构找出串口 */
while (portList.hasMoreElements()) {
/**//* 强制转换为通讯端口类型 */
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
try {
serialPort = (SerialPort) portId.open("ReadComm", 2000);
out_message.setText("已打开端口COM1 ,正在接收数据..... ");
} catch (PortInUseException e) {
}
/**//* 设置串口监听器 */
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
}
/**//* 侦听到串口有数据,触发串口事件 */
serialPort.notifyOnDataAvailable(true);
} // if end
} // if end
} // while end
readThread = new Thread(this);
readThread.start();// 线程负责每接收一次数据休眠20秒钟
} // actionPerformed() end
/**//* 接收数据后休眠20秒钟 */
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
}
} // run() end
/**//* 串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中 */
public void serialEvent(SerialPortEvent event) {
/**//* 设置串口通讯参数:波特率、数据位、停止位、奇偶校验 */
try {
serialPort.setSerialPortParams(19200, SerialPort.PARITY_NONE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1);
} catch (UnsupportedCommOperationException e) {
}
byte[] readBuffer = new byte[20];
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {
}
try {
/**//* 从线路上读取数据流 */
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
} // while end
str = new String(readBuffer);
/**//* 接收到的数据存放到文本区中 */
in_message.append(str + " ");
} catch (IOException e) {
}
} // serialEvent() end
} // 类R_Frame end
----------------------------------------------------------------------------------------------
ReadComm.java
package com.test2;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ReadComm
{
public static void main(String args[])
{
/**//* 实例化接收串口数据的窗体类 */
R_Frame R_win=new R_Frame();
/**//* 定义窗体适配器的关闭按钮功能 */
R_win.addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{System.exit(0); }
});
R_win.pack();
}
}
...全文
相关推荐
串口通信解决数据乱码和数据丢失
在实际应用中,串口通信可能会遇到数据乱码和数据丢失的问题,这通常是由多种因素引起的。本教程将详细介绍这些问题的成因以及解决方法。一、数据乱码原因与解决方案1.
Android串口通信开发详解与实战
Android中Handler和Message机制可用于实现定时发送串口数据。@Overridetry {// 每秒发送一次// 启动定时发送// 停止定时发送机制说明Handler用于在主线程中调度任务;实现定时执行;- 适用于周期性发送控制指令的场景。Android平台上有多个开源的串口通信库,它们封装了底层串口操作,简化了串口设备的访问流程,提高了开发效率。
Java 实现 POS 打印机无驱串口打印(解决中文乱码)
串口通信技术串口通信是一种常见的数据传输方式,在本案例中,我们主要利用 Java 的 `javax.comm` 包提供的接口来进行串口通信的开发。
串口乱码疑云.docx
在串口通信中,发送方和接收方必须使用相同的字符编码标准,比如UTF-8或GBK,否则数据在接收端会因为编码的不匹配而显示为乱码。面对串口乱码,我们可以采取多种方法进行解决。
Java连接数据库oracle中文乱码解决方案
Java连接数据库Oracle中文乱码解决方案Java连接数据库Oracle中文乱码解决方案是Java开发中常见的问题之一,本文将通过详细的示例代码介绍如何解决Java连接数据库Oracle中文乱码的问题


Java SE
