⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 weightinfohandler.java

📁 用于串口通讯测试的工具软件。完全使用java语言编写。
💻 JAVA
字号:
package com.zcsoft.comm;
import com.zcsoft.comm.*;
import com.zcsoft.dbvisit.*;
/**
 * 将电子称传递过来的重量信息记录到数据库中
 * 该类的接收实现只支持如下电子称的输出方式:
 * 3按【列印】键传送(简单模式)和5稳定传送(累计模式)。优先选择5
 */
public class WeightInfoHandler implements MessageHandler
{
	private DB db;
	/** 插入语句 */
	private String strInsertStmt
		= null;
	/** 插入语句中插入字段的值 */
	private Object[] fieldValues = new Object[5];
	/** 上次接收到的笔数号,其长度为4个字节 */
	private String lastNo;
	/** 上一次记录的计量单位 */
	private String lastUnit = "kg";
	/** 重量消息字符串中序号子串的字节个数 */
	private static final int NO_LENGTH = 4;

	/**
	 * @param db
	 * @param table 重量信息插入的表名称
	 * @param columns 重量信息插入的表的列名称
	 */
	public WeightInfoHandler(DB db,String table,String[] columns)
	{
		this.db = db;
		strInsertStmt = DB.prepareInsertStmt(table,columns);
	}

	/**
	 * 接收接口实现
	 *
	 * 接收到的重量消息字符串中,前四个字节可能是:
	 * 数字序号(如"0001","0004")、" S/N"或"----"
	 * 当用户对电子称归零后,电子称将先后连续发送" S/N"和"----"开头的消息字符串;
	 * 当用户按两次电子称上的【列印】键后,电子称将先后连续发送"----"和序号+累计重量,
	 * 其中序号等同于最近一次称的重量消息中的序号。
	 * @param msgBytes 重量消息的字节串容器
	 * @param begin 上述字节串中,从begin下标开始之后的字节才是此次接收到的重量消息
	 * @param length 上述字节串中,从begin下标开始后的length个字节才是此次接收到的重量消息
	 *  length的长度一定大于13。接收到的重量消息中不包含结束符:0D0A(CRLF)
	 *
	 */
	public synchronized void handleMessage(byte[] msgBytes, int begin, final int length)
	{
		if (length <= NO_LENGTH)
		{
			System.err.println("电子称发来不可识别的消息:" + new String(msgBytes, begin, length));
			return;
		}
//		System.out.println(begin + "," + length + "|" + new String(msgBytes, begin, length) + "|");
		String mayBeNo = new String(msgBytes, begin, NO_LENGTH);//四位的序号、" S/N"或"----"
//      System.out.println("mayBeNo="+mayBeNo);
		fieldValues[0] = mayBeNo;
		begin += NO_LENGTH;
		int indexFirstNonSpace;
		if (isNo(mayBeNo))//发来了重量记录
		{
			indexFirstNonSpace = indexOfFirstNoSpace(msgBytes, begin);
			//2005-6-29 需要处理数值后面可能出现的异常值情形
			//把后面的非数值部分去除
			int valueLength = 0;
			boolean encounterDecimalPoint = false;
			for (int i = indexFirstNonSpace; i < length; i++)
			{
				byte b = msgBytes[i];
				if (b < '0' && b > '9')
				{
					if (b == '.' && !encounterDecimalPoint)
					{
						encounterDecimalPoint = true;
					}
					else
					{
						break;
					}
				}
				valueLength ++;
			}
			if (valueLength < 1)
			{
				System.err.println("收到非数值重量:"
										 + new String(msgBytes, indexFirstNonSpace, length - indexFirstNonSpace));
				return;
			}
			String weight = new String(msgBytes, indexFirstNonSpace, valueLength);
//			System.out.println("length = " + length);
//			System.out.println("weight=|" + weight + "|");
			fieldValues[1] = weight;
			fieldValues[2] = null;//无需记录计量单位
			fieldValues[3] = "N";//净重
			//如果此次序号等同于最近一次收到的序号,则表示传来了合计值
			//发送合计值时,发送顺序示例如下:
			//...
			//0007     22.76
			//---------------
			//0007    163.56
			fieldValues[4] = mayBeNo.equals(lastNo)?Boolean.TRUE:Boolean.FALSE;
			//同时记录序号
			lastNo = mayBeNo;
		}
		else if (mayBeNo.equals(" S/N"))//发来计量开始消息,该消息中包含计量单位信息
		{
			lastNo = "";
			indexFirstNonSpace = indexOfFirstNoSpace(msgBytes, begin);
			int from = indexOfByte(msgBytes, indexFirstNonSpace + 1, (byte)'/') + 1;
			String unit = new String(msgBytes, from, length - from);
//         System.out.println("unit = "+unit);
			if (unit.equals(lastUnit))
			{
				return;
			}
			//插入计量单位信息到数据库表中
			fieldValues[1] = null;
			fieldValues[2] = unit;
			fieldValues[3] = null;
			fieldValues[4] = null;
			lastUnit = unit;
		}
		else if (mayBeNo.charAt(0) == '-')//收到一串分隔符:------------
		{
			//记录分隔符
			fieldValues[1] = null;
			fieldValues[2] = null;
			fieldValues[3] = null;
			fieldValues[4] = null;
		}
		else //目前不可识别的消息
		{
			System.err.println("电子称发来不可识别的消息:" + new String(msgBytes, begin, length));
			return;
		}
//      System.out.println("strInsertStmt="+strInsertStmt);
//      System.out.print("fieldValues=");
//      for (int i = 0; i < fieldValues.length; i++)
//      {
//         System.out.print(fieldValues[i]+"@");
//      }
//      System.out.println("");

		db.preparedUpdate(strInsertStmt, fieldValues, true);
	}


	private static boolean isNo(String str)
	{
		for (int i = 0; i < str.length(); i++)
		{
			if (!Character.isDigit(str.charAt(i)))
			{
				return false;
			}
		}
		return true;
	}

	private int indexOfFirstNoSpace(byte[] bytes, int begin)
	{
		while (begin < bytes.length)
		{
			if (bytes[begin] != ' ')
			{
				return begin;
			}
			begin ++;
		}
		return -1;
	}


	private int indexOfByte(byte[] bytes, int begin, byte target)
	{
		while (begin < bytes.length)
		{
			if (bytes[begin] == target)
			{
				return begin;
			}
			begin ++;
		}
		return -1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -