`
iffiffj
  • 浏览: 158775 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

顾客显示屏操作代码

    博客分类:
  • POS
阅读更多

顾客显示屏控制的原理比较简单:
1.打开顾显的串行口
2.设置波特率,这个波特率需要与顾显的一致
3.使用ESC/POS指令进行数据传输。
要结合“EPSON/POS指令集封装”这BLOG文章看。

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.RXTXPort;
import gnu.io.SerialPort;

import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

public class ClientDisplay {

	/** 串行端口设置 */
	public static final String PARAM_PORT_STR = "port";
	/** 串口波特率设置 */
	public static final String PARAM_BAUD_RATE_STR = "baudRate";
	/** 顾客显示屏与串口对应的波特率设置位 */
	public static final String PARAM_DISPLAY_RATE_STR = "displayRate";
	/** 需要显示数值的参数 */
	public static final String PARAM_DATA_STR = "data";
	/** 状态灯参数 */
	public static final String PARAM_STATE_STR = "state";
	/** 状态灯全灭 */
	public static final String DISPLAY_STATE_OFF = "0";
	/** 单价状态灯 */
	public static final String DISPLAY_STATE_PRICE = "1";
	/** 总计状态灯 */
	public static final String DISPLAY_STATE_TOTAL = "2	";
	/** 收款状态灯 */
	public static final String DISPLAY_STATE_AMOUNT = "3";
	/** 找零状态灯 */
	public static final String DISPLAY_STATE_CHAGNE = "4";
	/** 顾客显示屏显示的字符 */
	public static final String PRINTABLE_STR = "0123456789.";

	//public static final String 

	public static void main(String[] args) {
		String port = "COM1";
		String baudRate = null;
		String displayRate = null;
		String data = "1222222";
		String state = "1111";
		if (args != null) {
			for (int i = 0; i < args.length; i++) {
				if (args[i].startsWith("-p")) {
					port = args[i].substring(2);
				} else if (args[i].startsWith("-br")) {
					baudRate = args[i].substring(2);
				} else if (args[i].startsWith("-dr")) {
					displayRate = args[i].substring(2);
				} else if (args[i].startsWith("-d")) {
					data = args[i].substring(2);
				} else if (args[i].startsWith("-s")) {
					state = args[i].substring(2);
				}
			}
		}
		Map map = new HashMap();
		map.put(PARAM_PORT_STR, port);
		map.put(PARAM_BAUD_RATE_STR, baudRate);
		map.put(PARAM_DISPLAY_RATE_STR, displayRate);
		map.put(PARAM_DATA_STR, data);
		map.put(PARAM_STATE_STR, state);
		try {
			sendDisplay(map);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 方法用途和描述:顾客显示屏的输出。
	 * 方法的实现逻辑描述:
	 * @param displayMap
	 * PARAM_PORT_STR         :端口名称,Windows:COM1,Linux:ttyS0 
	 * PARAM_BAUD_RATE_STR    :串行口波特率,默认:2400
	 * PARAM_DISPLAY_RATE_STR :串行口波特率需要与顾客显示屏的波特设置对应,默认:0。
	 * (如一些顾显波特率为“2400”对应设置位为“0”,“4800”对应设置位为“1”,“9600”对应设置位为“2”,具体设置需要看其规格文档。)
	 * PARAM_DATA_STR         :需要显示的数值字符串,只能显示8位:“0123456789.”。
	 * PARAM_STATE_STR        :设置“0 全暗”、“1 单价”、“2 总计”、“3 收款”、“4 找零”等显示。(具体设置需要看其规格文档。)
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void sendDisplay(Map displayMap) throws Exception {
		Object param1 = displayMap.get(PARAM_PORT_STR);
		Object param2 = displayMap.get(PARAM_BAUD_RATE_STR);
		Object param5 = displayMap.get(PARAM_DISPLAY_RATE_STR);
		Object param3 = displayMap.get(PARAM_DATA_STR);
		Object param4 = displayMap.get(PARAM_STATE_STR);
		if (param1 == null || !(param1 instanceof String)) {
			throw new IllegalArgumentException("PARAM_PORT is not set value!");
		}
		String port = param1.toString();
		int baudRate = 0;
		String data = "";
		String state = "";
		String displayRate = "";
		if (param2 != null) {
			try {
				baudRate = Integer.valueOf(param2.toString());
			} catch (Exception e) {}
		}
		if (param3 != null) {
			data = param3.toString();
		}
		if (param4 != null) {
			state = param4.toString();
		}
		if (param5 != null) {
			displayRate = param5.toString();
		}
		output(port, baudRate, displayRate, data, state);
	}

	/**
	 * 方法用途和描述:初始化顾客显示屏。
	 * 方法的实现逻辑描述:
	 * @param os 顾客显示屏输出流
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void initDisplay(OutputStream os) throws Exception {
		os.write(EpsonPosPrinterCommand.ESC_INIT);
	}

	/**
	 * 方法用途和描述:清空顾客显示屏
	 * 方法的实现逻辑描述:
	 * @param os 顾客显示屏输出流
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void clearDisplay(OutputStream os) throws Exception {
		os.write(EpsonPosPrinterCommand.CLR);
	}

	/**
	 * 方法用途和描述:向顾客显示屏输出需要显示的数值字符串
	 * 方法的实现逻辑描述:
	 * @param os 顾客显示屏输出流
	 * @param data 需要显示的数值字符串,只能显示8位:“0123456789.”。
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void outputData(OutputStream os, String data)
			throws Exception {
		if (data == null || data.length() == 0) {
			return;
		}
		char[] chars = data.toCharArray();
		boolean hasDot = false;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < chars.length; i++) {
			char c = chars[i];
			if (c == '.' && !hasDot) {
				sb.append(c);
			} else if (PRINTABLE_STR.indexOf(c) > -1) {
				sb.append(c);
			}
		}
		if (hasDot && sb.length() > 9) {
			sb.setLength(9);
		} else if (sb.length() > 8) {
			sb.setLength(8);
		}
		os.write(EpsonPosPrinterCommand.sendDisplayData(sb.toString()));
	}

	/**
	 * 方法用途和描述:设置“0 全暗”、“1 单价”、“2 总计”、“3 收款”、“4 找零”等显示。(具体设置需要看其规格文档。)
	 * 方法的实现逻辑描述:
	 * @param os 顾客显示屏输出流
	 * @param state “0 全暗”、“1 单价”、“2 总计”、“3 收款”、“4 找零”
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void setDisplayStateLight(OutputStream os, String state)
			throws Exception {
		if (state.length() > 0) {
			os.write(EpsonPosPrinterCommand.setDisplayState(state.charAt(0)));
		}
	}

	/**
	 * 方法用途和描述:设定串行口波特率,默认:2400
	 * 方法的实现逻辑描述:
	 * @param os 顾客显示屏输出流
	 * @param rate 具体需要看顾客显示屏规格文档
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void setDisplayBaudRate(OutputStream os, String rate)
			throws Exception {
		if (rate.length() > 0) {
			os.write(EpsonPosPrinterCommand.setDisplayRate(rate.charAt(0)));
		}
	}

	/**
	 * 方法用途和描述:打开顾客显示屏的串行端口,用定串行口后记得关闭打开的输入、输出流和串行口CommPort,否则端口将会被一直占用。
	 * 方法的实现逻辑描述:
	 * @param portName 端口名称,Windows:COM1,Linux:ttyS0 
	 * @param rate  设定串行口的波特率,具体需要看顾客显示屏规格文档
	 * @return
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static CommPort openConnection(String portName, int rate)
			throws Exception {
		CommPortIdentifier port = null;
		CommPort open = null;
		port = CommPortIdentifier.getPortIdentifier(portName);
		open = port.open(portName, 100);
		System.out.println(open.getClass().getName());
		if (open instanceof RXTXPort) {
			RXTXPort rxtx = (RXTXPort) open;
			rxtx.setSerialPortParams(getBaudRate(rate), SerialPort.DATABITS_8,
										SerialPort.STOPBITS_1,
										SerialPort.PARITY_NONE);
			System.out.println("baud rate:" + rxtx.getBaudRate());
		} else {
			throw new IOException(portName + " is not a CommPort port!");
		}
		return open;
	}

	/**
	 * 方法用途和描述:向顾客显示屏输出显示数据
	 * 方法的实现逻辑描述:
	 * @param portName :端口名称,Windows:COM1,Linux:ttyS0 
	 * @param rate :串行口波特率,默认:2400
	 * @param displayRate :串行口波特率需要与顾客显示屏的波特设置对应,默认:0。
	 * (如一些顾显波特率为“2400”对应设置位为“0”,“4800”对应设置位为“1”,“9600”对应设置位为“2”,具体设置需要看其规格文档。)
	 * @param data :需要显示的数值字符串,只能显示8位:“0123456789.”。
	 * @param state :设置“0 全暗”、“1 单价”、“2 总计”、“3 收款”、“4 找零”等显示。(具体设置需要看其规格文档。)
	 * @throws Exception
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期:2008-10-17
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期:2008-10-17
	 */
	public static void output(String portName, int rate, String displayRate,
			String data, String state) throws Exception {
		CommPort open = null;
		try {
			open = openConnection(portName, rate);
			OutputStream os = open.getOutputStream();
			setDisplayBaudRate(os, displayRate);
			initDisplay(os);
			clearDisplay(os);
			outputData(os, data);
			setDisplayStateLight(os, state);
			os.flush();
			os.close();
		} catch (Exception e) {
			System.out.println(e.getMessage() + "====\n\n\n\n====");
			e.printStackTrace();
			if (e instanceof IOException
				&& e.getMessage()
						.startsWith("Resource temporarily unavailable")) {

			} else {
				throw e;
			}
		} finally {
			if (open != null) {
				open.close();
			}
		}
	}

	private static int getBaudRate(int rate) {
		switch (rate) {
		case 9600:
			return 9600;
		case 4800:
			return 4800;
		case 2400:
			return 2400;
		case 1200:
			return 1200;
		case 600:
			return 600;
		case 300:
			return 300;
		default:
			return 2400;
		}
	}

	private static char getRateByte(int rate) {
		char rateByte = '2';
		switch (rate) {
		case 9600:
			rateByte = '0';
			break;
		case 4800:
			rateByte = '1';
			break;
		case 2400:
			rateByte = '2';
			break;
		case 1200:
			rateByte = '3';
			break;
		case 600:
			rateByte = '4';
			break;
		case 300:
			rateByte = '5';
			break;
		default:
			break;
		}
		return rateByte;
	}
}

分享到:
评论
1 楼 dream_free_y 2009-04-03  
太谢谢iffiffj了!我在linux下开始用java communication,后来改用Java RXTX 往ttyS0(COM1)和lp0(LTP)端口写数据,郁闷了好几天了,差点对生活失去信心,顾客显示器终于终于终于出数据了!谢谢!下面接着还要试打印机和钱箱,希望一帆风顺!

相关推荐

    珠海宝天LCD416顾客显示屏程序

    【LCD416顾客显示屏程序】是珠海市宝天电子有限公司设计的一款专用于商业显示的设备,主要用于提供清晰、直观的客户交易信息展示。这款LCD416显示器以其高效能和可靠性在IT行业中赢得了广泛的认可。它适用于各种商业...

    C#顾客显示屏中文+数字

    10. **源代码版本控制**:项目的文件名为"顾客显示屏(中文+数字)",意味着可能包含多个源文件,使用版本控制系统(如Git)管理代码版本和协同开发是非常常见的做法。 以上知识点只是根据项目标题和描述推测出的可能...

    LED8N收银客户显示屏幕开发示例

    这种显示屏的特点是亮度高、可视角度广,能够在各种光线环境下保持良好的可读性,而且功耗低,使用寿命长。 在开发过程中,我们需要关注以下几个关键知识点: 1. **硬件接口**:LED8N显示屏通常通过串行或并行接口...

    全屏轮播代码

    在电商场景下,如淘宝,全屏轮播图可以用于展示店铺的促销活动、新品上架或品牌故事,吸引顾客注意力,增加点击率和转化率。 二、代码结构解析 1. **HTML结构**: - `&lt;div class="skin-box-bd clear-fix"&gt;`:这是...

    淘宝旺铺2012全屏轮播代码生成器

    淘宝旺铺2012全屏轮播代码生成器的操作流程相对简单。用户只需准备好待展示的图片,设置好每张图片的展示时间、过渡效果、是否添加导航点等参数,然后通过该工具一键生成对应的HTML和CSS代码。这些代码可以复制并...

    天猫二级页全屏代码

    在电商领域中,店铺页面的设计与优化对于吸引顾客、提升用户体验具有重要作用。其中,“天猫二级页全屏代码”是指用于实现天猫店铺二级页面全屏显示效果的HTML与CSS代码。通过合理运用这些代码,可以使页面布局更加...

    淘宝全屏轮播海报教程和代码

    4. **视频教程**:视频教程是一种直观的教学方式,它能更清晰地展示操作步骤,帮助学习者理解每个细节,包括代码编写、调试和页面效果预览等。 5. **代码下载**:提供的代码下载包含了实际运行的示例,这有助于学习...

    全屏海报代码安装教程

    此外,考虑到移动设备的普及,还应考虑海报在手机端的适配性,可能需要额外的响应式设计或使用特殊的代码来确保在不同设备上的良好显示。对于不熟悉HTML和CSS的商家,可能需要寻求专业设计师或开发者的帮助来完成这...

    c# 客显(顾客显示器)源码实例

    在C#代码中,可能需要将要显示的数值转换为对应的ESC/POS指令序列。 4. **中文字符发光条显示**:除了数字,ESC/POS还支持中文字符的显示,但可能需要额外的编码处理。在C#中,可能需要将汉字转换为特定的16进制码...

    1350-基于51单片机的叫号器(LCD1602,4窗口)proteus、原理图、流程图、物料清单、仿真图、源代码.zip

    1.顾客通过取号按键完成取号操作(从01号开始取号,最多到99号),LCD1602液晶显示屏显示所取号码几秒后复位(即显示当前服务号码); 2.四个服务窗口各有一个呼叫按键,任意窗口按下按键则蜂鸣器响,以提醒顾客接收服务...

    基于51单片机的叫号器(LCD1602,4窗口)proteus、原理图、流程图、物料清单、仿真图、源代码

    1.顾客通过取号按键完成取号操作(从01号开始取号,最多到99号),LCD1602液晶显示屏显示所取号码几秒后复位(即显示当前服务号码); 2.四个服务窗口各有一个呼叫按键,任意窗口按下按键则蜂鸣器响,以提醒顾客接收服务...

    Delphi西餐厅前台触摸屏收银管理系统源代码.rar

    此外,触摸屏界面可能还包括图形化的订单状态显示,帮助服务员实时跟踪每个餐桌的点餐进度。 其次,该系统的核心功能包括点餐管理、订单处理、结账计算和支付方式集成。点餐管理模块允许服务员添加、修改或删除菜品...

    pos机双屏异显项目 --- 在密码解锁或设置密码时,副屏不显示或显示张图片

    主屏幕通常面向顾客,展示交易详情,而副屏则面向操作员,显示更敏感的信息,如交易金额、密码输入等。这种设计增加了交易透明度,同时保护了操作员的隐私和系统的安全性。 当涉及到密码解锁或设置密码时,双屏异显...

    新旺铺模版 全屏背景设置方法

    不同平台的具体操作可能会有所不同,但通常都会有明显的“店铺装修”或“模板设计”入口。 2. 选择新旺铺模板:进入装修页面后,你会看到一系列可供选择的店铺模板。找到并选择一个支持全屏背景的新旺铺模板。这些...

    电商-优衣库门店可视化与顾客分组-约500行(pyecharts地图可视化、KMeans聚类、大屏可视化).zip

    在这个项目中,"优衣库门店可视化与顾客拜访数据分组.ipynb"可能是Jupyter Notebook文件,其中包含了代码和可视化结果。 7. **Jupyter Notebook**:这是一种交互式的工作环境,可以混合编写代码、文本和数学公式。...

    迅鹏SPB-DP系列智能大屏显示器.zip

    3. 智能化操作:内置智能操作系统,支持无线投屏、多屏互动、画面分割等功能,使操作更加便捷高效。 4. 良好的稳定性:优化的散热设计和坚固的结构,保证了长时间运行的稳定性和可靠性。 5. 宽视角设计:采用宽视角...

    LED智能排队管理系统源代码

    例如,为了实现动态显示队列状态,系统可能需要实时更新LED显示屏上的队列长度和当前服务的顾客信息,这就需要用到事件驱动编程和GUI组件。 总的来说,LED智能排队管理系统通过队列类实现了对顾客服务顺序的管理,...

    KTV 管理系统 源代码

    3. **点歌系统**:这是KTV管理系统的重要组成部分,用户可以通过触摸屏、手机应用或前台操作点选歌曲。系统应支持多种搜索方式,如歌名、歌手、分类,并有推荐和排行榜功能。 4. **播放控制**:确保歌曲在各个包厢...

    3D可视化数据大屏模板.rar

    例如,一家电商公司可能会用3D地球模型显示全球销售额,用3D柱状图展示各类商品的销售排名,同时通过3D散点图揭示顾客购买行为的分布规律。 总的来说,3D可视化数据大屏模板是一种强大的工具,它结合了艺术和科技,...

    网店轮播代码

    网店轮播代码是一种常见的网页设计元素,特别是在电子商务网站中,用于展示商品或吸引顾客注意力。轮播图(Carousel)通常包含多个图像或内容面板,它们按照预设的时间间隔自动滑动,用户也可以手动切换。这种设计能...

Global site tag (gtag.js) - Google Analytics