免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5476 | 回复: 0
打印 上一主题 下一主题

顾客显示屏操作代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-21 12:04 |只看该作者 |倒序浏览

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

Java代码
  • 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
  •                 if (args.startsWith("-p")) {  
  •                     port = args.substring(2);  
  •                 } else if (args.startsWith("-br")) {  
  •                     baudRate = args.substring(2);  
  •                 } else if (args.startsWith("-dr")) {  
  •                     displayRate = args.substring(2);  
  •                 } else if (args.startsWith("-d")) {  
  •                     data = args.substring(2);  
  •                 } else if (args.startsWith("-s")) {  
  •                     state = args.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 Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期:2008-10-17
  •      */  
  •     public static void initDisplay(OutputStream os) throws Exception {  
  •         os.write(EpsonPosPrinterCommand.ESC_INIT);  
  •     }  
  •   
  •     /**
  •      * 方法用途和描述:清空顾客显示屏
  •      * 方法的实现逻辑描述:
  •      * @param os 顾客显示屏输出流
  •      * @throws Exception
  •      * @author Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期:2008-10-17
  •      */  
  •     public static void clearDisplay(OutputStream os) throws Exception {  
  •         os.write(EpsonPosPrinterCommand.CLR);  
  •     }  
  •   
  •     /**
  •      * 方法用途和描述:向顾客显示屏输出需要显示的数值字符串
  •      * 方法的实现逻辑描述:
  •      * @param os 顾客显示屏输出流
  •      * @param data 需要显示的数值字符串,只能显示8位:“0123456789.”。
  •      * @throws Exception
  •      * @author Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期: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
  •             char c = chars;  
  •             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 Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
  •      * @author Tyler Chen 修改日期: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;  
  •     }  
  • }  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 Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期:2008-10-17
             */
            public static void initDisplay(OutputStream os) throws Exception {
                    os.write(EpsonPosPrinterCommand.ESC_INIT);
            }
            /**
             * 方法用途和描述:清空顾客显示屏
             * 方法的实现逻辑描述:
             * @param os 顾客显示屏输出流
             * @throws Exception
             * @author Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期:2008-10-17
             */
            public static void clearDisplay(OutputStream os) throws Exception {
                    os.write(EpsonPosPrinterCommand.CLR);
            }
            /**
             * 方法用途和描述:向顾客显示屏输出需要显示的数值字符串
             * 方法的实现逻辑描述:
             * @param os 顾客显示屏输出流
             * @param data 需要显示的数值字符串,只能显示8位:“0123456789.”。
             * @throws Exception
             * @author Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期: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  -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 Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期: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 Tyler Chen 新增日期:2008-10-17
             * @author Tyler Chen 修改日期: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;
            }
    }
      
      
      
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/99076/showart_2183229.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP