【RS232C通信 】データ長7ビットのシリアル通信(ヘルスケア 機器連携) VB => Android(Java)移植

/**
* 体重計(機器) から測定値を取得する
*/
private void btWB110(BluetoothSppConnection connection, String address) {
 
final int RECEIVE_SIZE = 1000;
byte byBuff; // 送信バッファ
byte status = new byte[RECEIVE_SIZE + 1]; // 受信バッファ
ReadResultSize resultSize = new ReadResultSize(); // 受信済みサイズ
 
String strCommand = ""; // 送信パラメータ用
String strResult = "";
 
try {
 
// 出力項目のクリア
clearReceiveValues();
 
char vb_Cr = 0x0d; // vbCr(13)
char vb_Lf = 0x0a; // vbLf(10)
// 測定開始コマンド
strCommand = "DR" + String.valueOf(vb_Cr) + String.valueOf(vb_Lf);
 
// マスターモードで仮想シリアルポート接続
int btRet = connection.connect(address);
 
if (btRet == StatusConstants.BT_SUCCESS) {
 
try {
 
//=== do - while 開始
do {
// バイトコードへ変換
byBuff = strCommand.getBytes(AppCharset.SHIFT_JIS);
 
// Y.O パリティ 付加
SetParity(byBuff, byBuff.length, 0);
 
// コマンド送信
connection.send(byBuff, byBuff.length);
// 測定結果受信
btRet = connection.receiveDeviceValue(status, resultSize);
 
// パリティ除去
if (RemoveParity(status, resultSize.get(), 0) == false) {
// キャンセル
receiveRet = StatusConstants.RET_ERR_CANCEL;
Log.d(TAG, "btWB110: [Recv] 異常終了 = パリティ 外す " + btRet);
return;
}
 
strResult = ByteUtil.bytesToString(status, 0, resultSize.get());
 
if (strResult.length() <= 0) {
// キャンセル
receiveRet = StatusConstants.RET_ERR_CANCEL;
Log.d(TAG, "btWB110: [Recv] 異常終了 = " + strResult);
return;
}
 
if (ByteUtil.bytesToString(status, 0, 2).equals("S ")) {
if (BtCDbl(strResult.substring(4,10)) > 0) {
// 測定結果格納
receiveData[2] = BtEdit(strResult.substring(4,10));
break;
} else {
// receiveData[2] = BtEdit(strResult.substring(1, 10));
receiveData[2] = BtEdit(strResult.substring(0, 9));
// キャンセル
receiveRet = StatusConstants.RET_ERR_CANCEL;
Log.d(TAG, "btWB110: [Recv] 受信キャンセル else 1::: = " + receiveData[2]);
return;
}
 
} else {
/*
receiveData[2] = BtEdit(strResult.substring(0, 9));
// キャンセル
receiveRet = StatusConstants.RET_ERR_CANCEL;
 
*/
Log.d(TAG, "btWB110: [Recv] 受信キャンセル else 2 コメントアウト::: = " + receiveData[2]);
return;
}
 
} while (true);
 
} finally {
// 仮想シリアルポート切断
setReceiveRetWithBtRet(btRet);
} // ====== END try
 
} else {
// ========= エラー
receiveRet = StatusConstants.RET_ERR_MEASURE;
return;
} //===================== END IF =====================
 
} catch (Exception e) {
e.printStackTrace();
receiveRet = StatusConstants.RET_ERR_MEASURE;
}
 
}
 
//================= 中で使っている関数 
 
/**
* SetParity
* バイト列の最上位ビットにパリティ情報を付加する
*
* pData Byte() I バイト列
* intLen Integer I 対象の長さ
* pType Integer I パリティ種類(0:Even 1:Od
*
* 戻り値 なし
*/
private static void SetParity(byte pData, int intLen,int pType) {
 
int I;
int J;
int C;
// for (I = 0; I < intLen - 1; I++) {
for (I = 0; I < intLen; I++) {
if (I >= pData.length) {
break;
}
pData[I] = (byte) (pData[I] & Byte.MAX_VALUE);
J = 1;
C = (pType & 1);
// while( J >= Byte.MIN_VALUE) {
while( J <= Byte.MAX_VALUE + 1) {
if*1 {
if (i == 1) {
// substring(i) i から 末尾まで取得
sRst = "0" + pData.substring(i);
} else {
sRst = pData.substring(i - 1);
} // === END if
break;
}// === END if
 
if (BtCInt(sRst) >= 1) {
sRst = pData.substring(i);
break;
}
 
} //=== END for
 
sRst = sRst + " ";
btEdit = sRst.substring(0, 10);
 
Log.d(TAG, "function BtEdit 値::: = :::btEdit " + btEdit);
return btEdit;
}
 
/**
* ' MODULE :BtCInt
* ' 概要 :String型をInteger型に変換する
* ' 説明 :変換できない場合、初期値とする
* ' 引数 :変数名 属性 I/O 項目名
* ' pStr String I 対象の文字列
* ' pDef Integer I 初期値
* ' 戻り値 :変換結果
*/
private static int BtCInt(String pStr, int... pDef) {
 
int btCInt = 0;
 
// デフォルト引数で 0 が入る
int pDef_i = IntStream.of(pDef).sum();
 
try {
pStr = pStr.trim();
btCInt = Integer.parseInt(pStr);
Log.d(TAG, "btWB110: btCInt 値::: = " + btCInt);
} catch (Exception e) {
e.printStackTrace();
 
Log.d(TAG, "btWB110: btCInt 値::: = catch 例外:::btCInt " + btCInt);
// 0 を入れる
btCInt = pDef_i;
}
 
return btCInt;
 
}
 
/***
* ' MODULE :BtCDbl
* ' 概要 :String型をDouble型に変換する
* ' 説明 :変換できない場合、初期値とする
* ' 引数 :変数名 属性 I/O 項目名
* ' pStr String I 対象の文字列
* ' pDef Double I 初期値
* ' 戻り値 :変換結果
*/
 
private static double BtCDbl(String pStr, Double... pDef) {
 
double btCDbl = 0;
 
try {
btCDbl = Double.parseDouble(pStr.trim());
Log.d(TAG, "btWB110: Function 内 " + btCDbl);
} catch (Exception e) {
e.printStackTrace();
btCDbl = 0;
}
 
return btCDbl;
}

*1:pData[I] & J) != 0) {

// ^ => VB XOR
C = C ^ 1;
Log.d(TAG, "btWB110: SetParity C 値::: = " + C);
}
J *= 2;
}
if (C == 1) {
// | , ビットOR
// pData[I] = (byte) (pData[I] | Byte.MIN_VALUE);
pData[I] = (byte) (pData[I] | Byte.MAX_VALUE + 1);
Log.d(TAG, "btWB110: SetParity pData[I] 値::: = " + pData[I]);
}
}
 
}
 
/**
*
* ' MODULE :RemoveParity
* ' 概要 :バイト列からパリティ情報(最上位ビット)を除外する
* ' 引数 :変数名 属性 I/O 項目名
* ' pData Byte() I バイト列
* ' intLen Integer I 対象の長さ
* ' pType Integer I パリティ種類(0:Even 1:Odd)
* ' 戻り値 :True=正常終了 False=パリティエラー
*  作成:夏目 智徹
*/
 
private static boolean RemoveParity(byte[] pData, int intLen, int pType) {
 
int I;
int J;
int C;
 
short hh = 256; // &H100
 
boolean removeParity = false;
// 'パリティチェック
for(I = 0; I < pData.length - 1; I++) {
if (I >= pData.length) {
break;
}
J = 1;
// & , XOR
C = (pType & 1);
// while (J >= Byte.MAX_VALUE + 1) {
while (J <= hh) {
if ((pData[I] & J) != 0) {
C = C ^ 1;
}
J *= 2;
}
 
if (C == 1) {
break;
}
 
} //=== END for
for(I = 0; I < intLen - 1; I++) {
if(I >= pData.length) {
break;
}
pData[I] = (byte)(pData[I] & Byte.MAX_VALUE);
}
removeParity = true;
return removeParity;
}
 
/**
* ' 概要 :10バイトの文字列で左詰に変換
* 引数 :変数名 属性 I/O 項目名
* pData String I
* 説明 : "123" ---> "123_______" _はスペースです
* 小数点がある場合は "00.123" ---> "0.123_____" _はスペースです
* ".123" ---> "0.123_____" _はスペースです
* 戻り値 :変換後の文字列
*/
private static String BtEdit(String pData) {
 
String btEdit = "";
int i;
int iLen;
String sRst = "";
 
// 前部のゼロをスペースに置き換え
iLen = pData.length();
for (i = 0; i < iLen - 1; i++) {
sRst = pData.substring(i, i + 1);
if (sRst.equals("."