📄 protocol.java
字号:
/* * @(#)Protocol.java 1.34 02/10/04 @(#) * * Copyright (c) 2000-2002 Sun Microsystems, Inc. All rights reserved. * PROPRIETARY/CONFIDENTIAL * Use is subject to license terms. */package com.sun.midp.io.j2me.comm;import java.io.*;import javax.microedition.io.*;import com.sun.cldc.io.GeneralBase;import com.sun.midp.main.Configuration;import com.sun.midp.io.*;import com.sun.midp.security.*;/** * This implements the comm port protocol. * * @author Nik Shaylor * @author Stephen Flores * @author Efren Serra * @version 3.1 5/11/2001 */public class Protocol extends BufferedConnectionAdapter implements CommConnection { /** Native handle to the serial port. */ private int handle = -1; /** Size of the read ahead buffer, default is 256. */ protected static int bufferSize = 256; /** * Class initializer */ static { /* See if a read ahead / write behind buffer size has been specified */ String size = Configuration.getProperty( "com.sun.midp.io.j2me.comm.buffersize"); if (size != null) { try { bufferSize = Integer.parseInt(size); } catch (NumberFormatException ex) {} } } // From SerialMgr.h of the Palm api /** Bit flag: 1 stop bits. */ private final static int serSettingsFlagStopBits1 = 0x00000000; /** Bit flag: 2 stop bits. */ private final static int serSettingsFlagStopBits2 = 0x00000001; /** Bit flag: parity on. */ private final static int serSettingsFlagParityOddM = 0x00000002; /** Bit flag: parity even. */ private final static int serSettingsFlagParityEvenM = 0x00000004; /** Bit flag: RTS rcv flow control. */ private final static int serSettingsFlagRTSAutoM = 0x00000010; /** Bit flag: CTS xmit flow control. */ private final static int serSettingsFlagCTSAutoM = 0x00000020; /** Bit flag: 7 bits/char. */ private final static int serSettingsFlagBitsPerChar7 = 0x00000080; /** Bit flag: 8 bits/char. */ private final static int serSettingsFlagBitsPerChar8 = 0x000000C0; /** Bit per char. */ private int bbc = serSettingsFlagBitsPerChar8; /** Stop bits. */ private int stop = serSettingsFlagStopBits1; /** Parity. */ private int parity = 0; /** RTS. */ private int rts = serSettingsFlagRTSAutoM; /** CTS. */ private int cts = serSettingsFlagCTSAutoM; /** Baud rate. */ private int baud = 19200; /** Blocking. */ private boolean blocking = true; /** Creates a buffered comm port connection. */ public Protocol() { // use the default buffer size super(bufferSize); // Protocol to use when asking permissions. protocol = "comm"; requiredPermission = Permissions.COMM; } /** * Parse the next parameter out of a string. * * @param parm a string containing one or more parameters * @param start where in the string to start parsing * @param end where in the string to stop parsing * * @exception IllegalArgumentException if the next parameter is wrong */ private void parseParameter(String parm, int start, int end) { parm = parm.substring(start, end); if (parm.equals("baudrate=110")) { baud = 110; } else if (parm.equals("baudrate=300")) { baud = 300; } else if (parm.equals("baudrate=600")) { baud = 600; } else if (parm.equals("baudrate=1200")) { baud = 1200; } else if (parm.equals("baudrate=2400")) { baud = 2400; } else if (parm.equals("baudrate=4800")) { baud = 4800; } else if (parm.equals("baudrate=9600")) { baud = 9600; } else if (parm.equals("baudrate=14400")) { baud = 14400; } else if (parm.equals("baudrate=19200")) { baud = 19200; } else if (parm.equals("baudrate=38400")) { baud = 38400; } else if (parm.equals("baudrate=56000")) { baud = 56000; } else if (parm.equals("baudrate=57600")) { baud = 57600; } else if (parm.equals("baudrate=115200")) { baud = 115200; } else if (parm.equals("baudrate=128000")) { baud = 128000; } else if (parm.equals("baudrate=256000")) { baud = 256000; } else if (parm.equals("bitsperchar=7")) { bbc = serSettingsFlagBitsPerChar7; } else if (parm.equals("bitsperchar=8")) { bbc = serSettingsFlagBitsPerChar8; } else if (parm.equals("stopbits=1")) { stop = serSettingsFlagStopBits1; } else if (parm.equals("stopbits=2")) { stop = serSettingsFlagStopBits2; } else if (parm.equals("parity=none")) { parity = 0; } else if (parm.equals("parity=odd")) { parity = serSettingsFlagParityOddM; } else if (parm.equals("parity=even")) { parity = serSettingsFlagParityEvenM; } else if (parm.equals("autorts=off")) { rts = 0; } else if (parm.equals("autorts=on")) { rts = serSettingsFlagRTSAutoM; } else if (parm.equals("autocts=off")) { cts = 0; } else if (parm.equals("autocts=on")) { cts = serSettingsFlagCTSAutoM; } else if (parm.equals("blocking=off")) { blocking = false; } else if (parm.equals("blocking=on")) { blocking = true; } else { throw new IllegalArgumentException("Bad parameter"); } } /** * Open a serial port connection. * * Note: DTR line is always on. <br> * Hint: On Solaris opening by port number or /dev/term/* will block * until the Data Set Ready line is On. To work around this open * by device name using /dev/cua/* as root. * * @param name A URI with the type and parameters for the connection. * <pre> * The scheme must be: comm * * The first parameter must be a port ID: A device name or * a logical port number from 0 to 9. * * Any additional parameters must be separated by a ";" and * spaces are not allowed. * * The optional parameters are: * * baudrate: The speed of the port, defaults to 19200. * bitsperchar: The number bits that character is. 7 or 8. * Defaults to 8. * stopbits: The number of stop bits per char. 1 or 2. * Defaults to 1. * parity: The parity can be "odd", "even", or "none". * Defaults to "none". * blocking: If "on" wait for a full buffer when reading. * Defaults to "on". * autocts: If "on", wait for the CTS line to be on * before writing. Defaults to "on". * autorts: If "on", turn on the RTS line when the * input buffer is not full. If "off", * the RTS line is always on. * Defaults to "on". * </pre> * @param mode A flag that is <code>true</code> if the caller expects * to write to the connection. This is ignored * in all connections that are read-write. * @param timeouts A flag to indicate that the called wants * timeout exceptions. This is ignored. * * @exception IOException if an I/O error occurs, or * IllegalArgumentException * if the name string is has an error. */ public void connect(String name, int mode, boolean timeouts) throws IOException { int portNumber = 0; String deviceName = null; int start = 0; int pos = 0; verifyPermissionCheck(); if (name.length() == 0) { throw new IllegalArgumentException("Missing port ID"); } if (Character.isDigit(name.charAt(0))) { portNumber = Integer.parseInt(name.substring(0, 1)); pos++; } else { pos = name.indexOf(";"); if (pos < 0) { deviceName = name; pos = name.length(); } else { deviceName = name.substring(0, pos); } } while (name.length() > pos) { if (name.charAt(pos) != ';') { throw new IllegalArgumentException( "missing parameter delimiter"); } pos++; start = pos; while (true) { if (pos == name.length()) { parseParameter(name, start, pos); break; } if (name.charAt(pos) == ';') { parseParameter(name, start, pos); break; } pos++; } } // blocking is handled at the Java layer so other Java threads can run if (deviceName != null) { handle = native_openByName(deviceName, baud, bbc|stop|parity|rts|cts); } else { handle = native_openByNumber(portNumber, baud, bbc|stop|parity|rts|cts); } registerCleanup(); } /** * Gets the baudrate for the serial port connection. * @return the baudrate of the connection * @see #setBaudRate */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -