JAVA获取POS机(通过COM口)输入而获得内容问题

ren_xs 2008-01-12 06:01:22
JAVA获取POS机串口输入获得16进制问题

请大家帮忙看看, 如何解决这个问题?

通过程序获取的内容都是 “方框”,如何将这个方框转化为 我想要的 String 类型的 16进制内容呢? 比如0X12 这样的内容,而不是 看到的全是方框。


请大家帮助我。

内容见附件图片

-----------
程序如下:
-----------



package main;

import java.io.*;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;

static Enumeration portList;

InputStream inputStream;

SerialPort serialPort;

Thread readThread;

public static void main(String[] args) {

String com="1";
if(args!=null&&args.length>=1)com=args[0];

portList = CommPortIdentifier.getPortIdentifiers();
// 检索系统串口
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();

/*如果端口类型是串口,则打印出其端口信息*/
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
System.out.println("------------------------");
System.out.println("系统可用串口: "+portId.getName());
System.out.println("------------------------");
// 指定COM1口
if (portId.getName().equals("COM"+com)) {
System.out.println("找到COM"+com+"口,初始化...");
SimpleRead reader = new SimpleRead();
}else{
System.out.println("无法找到COM"+com+"口,请重新指定...");
}
}
}
}

public SimpleRead() {
try {
// 打开COM1串口 2000 设置毫秒数 超时等待时间

serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
System.out.println("COM1口打开成功!");

} catch (PortInUseException e) {
System.out.println("端口被占用");
}
try {
inputStream = serialPort.getInputStream();
System.out.println("获得输入流...");
} catch (IOException e) {
}
//进行端口监听 , 当事件发生自动调用 serialEvent方法
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
}
serialPort.notifyOnDataAvailable(true);

//设置通讯位
try {
System.out.println("设置通讯位...");
serialPort.setSerialPortParams(9600,// 设置波特率
SerialPort.DATABITS_8,// 数据位数
SerialPort.STOPBITS_1,// 停止位
SerialPort.PARITY_NONE);// 奇偶位
} catch (UnsupportedCommOperationException e) {
}

// 启动线程,监听
readThread = new Thread(this);//线程负责每接收一次数据休眠20秒钟
readThread.start();
}

public void run() {
try {
System.out.println("监听...");
Thread.sleep(20000);//休息20秒

} catch (Exception e) {
}
}
// 处理侦听到的串口事件
public synchronized void serialEvent(SerialPortEvent event) {
// System.out.println("接收数据...\r\n");

switch (event.getEventType()) {
case SerialPortEvent.BI://BI - 通讯中断.
case SerialPortEvent.OE://OE - 溢位错误.
case SerialPortEvent.FE://FE - 帧错误.
case SerialPortEvent.PE://PE - 奇偶校验错.
case SerialPortEvent.CD://CD - 载波检测.
case SerialPortEvent.CTS://CTS - 清除发送.
case SerialPortEvent.DSR://DSR - 数据设备准备好.
case SerialPortEvent.RI://RI -  振铃指示.
case SerialPortEvent.OUTPUT_BUFFER_EMPTY://OUTPUT_BUFFER_EMPTY - 输出缓冲区已清空
break;
case SerialPortEvent.DATA_AVAILABLE://DATA_AVAILABLE - 有数据到达


byte[] readBuffer = new byte[10000];

try {
//读数据
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}

String str=new String(readBuffer);
if(str.equals("exit")){
inputStream.close();serialPort.close();
}
//输出内容
System.out.println("<------开始------->");
System.out.println(str);
System.out.println("<------结束------->");
System.out.println(" ");
} catch (IOException e) {
}
break;
}
}
}



...全文
794 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
天花板发呆 2012-10-30
  • 打赏
  • 举报
回复
请教个问题 能否用flex 去调用串口设备呢 ?

我目前 后台用spring 3 +hibernate 3 +blazeds +flex 4.5 搭建的架构。

现在公司有个项目想用flex 来做。 问下能不能 通过这样的架构访问到 例如pos机 ,或者收银机 等设备呢 ?
zhangweilibo 2010-12-09
  • 打赏
  • 举报
回复
这个我也有用,收走
action_520_12 2008-01-12
  • 打赏
  • 举报
回复
是否可以考虑把readBuffer这个byte数组的内容转换为int,
再转换为十六进制的字符串形式呢?
action_520_12 2008-01-12
  • 打赏
  • 举报
回复
是否可以考虑readBuffer 这个byte数组的内容转换位int,
再转换为十六进制的字符串形式呢?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧