做一個類似地鐵里自動售賣機的系統,機器內有一個安卓系統,現在需要通過安卓系統控制機器貨道電機轉動。機器那邊給了下面這樣的介面檔案。安卓串口通信的相關庫android_serialport_api這些已配置好,采用的是SerialPortUtil別人封裝好的類。請問一下,檔案里最后一個啟動電機那里,校驗碼是怎么設定的啊,隨便設嗎


uj5u.com熱心網友回復:
看你這個說明 和校驗碼沒什么關系 應該是隨便寫2個位元組就可以了uj5u.com熱心網友回復:
是你發送CRC校驗碼給機器,機器會回傳CRC校驗碼,不用手動設定,CRC校驗碼的演算法,百度一下有很多的uj5u.com熱心網友回復:
看你的檔案,校驗碼應該是crc校驗碼,就是把之前的資料用crc演算法計算出來的結果。這種問題你只要查一查crc是什么就好了啊。
剩下的那些圖,你直接問硬體商就好了。
業務太具體了,很難得到確實回復
uj5u.com熱心網友回復:
兩邊一致就好,按說明就是無校驗uj5u.com熱心網友回復:
校驗碼采用CRC演算法,演算法代碼可以到 github 上搜CRC關鍵字,找java代碼下載就可以了uj5u.com熱心網友回復:
CRC演算法下載鏈接 https://download.csdn.net/download/alphen/11853719uj5u.com熱心網友回復:
這么簡單的東西,看檔案就知道是這個是CRC16校驗演算法,CRC16 就是兩個位元組的,人家都給例子,自己用手算一下不就知道了嗎,不要聽那些說話不負責任的,隨便亂寫,人家定義了這個協議,定義了校驗碼,就是用于通訊程序中,為了避免資料傳輸程序中出錯,才需要的。
uj5u.com熱心網友回復:
CRC16 是有很多種,有IBM 的、有USB的、有MODBUS 的、有DNP 的 等等。
算了,告訴你你這個演算法的具體是 CRC16 MODBUS模式的。

uj5u.com熱心網友回復:

算了,今天太閑了,幫你找了幾個演算法java原始碼,自己與驗證下

https://www.cnblogs.com/lujiannt/p/9246256.html
https://www.cnblogs.com/koneloong/p/5218136.html
https://segmentfault.com/a/1190000019393677?utm_source=tag-newest
https://github.com/jichengyue/ModbusCRC16

uj5u.com熱心網友回復:
新手剛接觸安卓串口,現在發送資料遇到了問題,發送了沒反應。請問一下要以16進制發送“0x010xF00xF0”,要怎么轉換啊。byte[] mBuffer = new byte[3];
Arrays.fill(mBuffer, (byte) 0x01);
Arrays.fill(mBuffer, (byte) 0xF0);
Arrays.fill(mBuffer, (byte) 0xF0);
我是這么轉的,但是發送了機器沒有回應
uj5u.com熱心網友回復:
感覺最后一個鏈接上是github的 靠譜點
這么簡單,
/**
* strings to Hexadecimal array,seperate string by space
* @param strHexValue Hexadecimal string
* @return byte array
*/
public static byte[] stringToByteArray(String strHexValue) {
String[] strAryHex = strHexValue.split(" ");
byte[] btAryHex = new byte[strAryHex.length];
try {
int nIndex = 0;
for (String strTemp : strAryHex) {
btAryHex[nIndex] = (byte) Integer.parseInt(strTemp, 16);
nIndex++;
}
} catch (NumberFormatException e) {
}
return btAryHex;
}

uj5u.com熱心網友回復:
1:你用串口除錯助手等工具發命令先確保命令格式正確,即用工具可以使設備正常運可
2:然后在你的程式中直接發送這串命令,硬體直接接到電腦端,測驗命令是否能正常接收,如果能正常接收,且和用電腦工具軟體發的一致,說明程式正常,直接控制設備沒有問題。如果不能正常接收,再分析:沒有資料接到,跟程式看是否呼叫發送函式,如果調了,看呼叫前相關引數是否正常,如果正常,看硬體是否正常,如果這些都正常,再和別人確認封裝的庫。接收到資料,但和發送的不一致,看程式中設定的波特率、校驗位、資料位、停止位的設定
uj5u.com熱心網友回復:
1:你用串口除錯助手等工具發命令先確保命令格式正確,即用工具可以使設備正常運可
2:然后在你的程式中直接發送這串命令,硬體直接接到電腦端,測驗命令是否能正常接收,如果能正常接收,且和用電腦工具軟體發的一致,說明程式正常,直接控制設備沒有問題。如果不能正常接收,再分析:沒有資料接到,跟程式看是否呼叫發送函式,如果調了,看呼叫前相關引數是否正常,如果正常,看硬體是否正常,如果這些都正常,再和別人確認封裝的庫。接收到資料,但和發送的不一致,看程式中設定的波特率、校驗位、資料位、停止位的設定
uj5u.com熱心網友回復:
發送指令首先要算出crc啊。
import java.util.Arrays;
public class hello {
public static int getCrc(byte[] crcb) {
int crc = 0xFFFF;
byte Len;
boolean flag;
for (byte item : crcb) {
crc ^= ((int) item & 0x00FF);
Len = 8;
while (Len > 0) {
flag = (crc & 1) == 1;
crc >>= 1;
if (flag) {
crc ^= 0xA001;
}
Len--;
}
}
return crc;
}
private static String GetHexStr(byte[] crcb) {
int crci=getCrc(crcb);
String crcStr = Integer.toHexString(crci).toUpperCase();
int size = 4 - crcStr.length();
StringBuilder builder = new StringBuilder();
while (size > 0) {
builder.append("0");
size--;
}
return builder.append(crcStr).toString();
}
public static void main(String args[]) {
byte test1[]= {0x02,0x05,0x00}; //測驗發送crc
byte test2[]= {0x00,0x05,0x00}; //測驗接收crc
String str1=GetHexStr(test1); //除錯輸出:50D3
String str2=GetHexStr(test2); //除錯輸出:9072
System.out.println("hex:" + str1); //所以機器是先低位后高位
System.out.println("hex:" + str2);
byte[] send = new byte[5];//定義byte發送陣列
send[0]=(byte)0x01; //定義發送指令
send[1]=(byte)0xF0;
send[2]=(byte)0xF0;
byte check[]={send[0],send[1],send[2]};
String sendcrc=GetHexStr(check); //獲取指令crc
String hexL=sendcrc.substring(2,4); //取crc低位
String hexH=sendcrc.substring(0,2); //取crc高位
send[3]=(byte)Integer.parseInt(hexL, 16); //填入crc低位
send[4]=(byte)Integer.parseInt(hexH, 16); //填入crc高位
System.out.println("send:" + Arrays.toString(send));
/* 除錯輸出: send: [1, -16, -16, 100, 68]
為什么會有負數?因為byte型別取值范圍為:-128~127;
所以在轉換為byte型別時,如果數值超出范圍就會自動轉換
在這個取值范圍內。
*/
int Receive= -16 & 0xff; //若接收到負數怎么辦,先轉換再取十六進制;
System.out.println(Integer.toHexString(Receive).toUpperCase());
// 除錯輸出: F0
uj5u.com熱心網友回復:
CRC16 很多種模式的,他用的是MODBUS的,你這種是嗎?
uj5u.com熱心網友回復:
你不認真看代碼的嗎?我測驗結果都出來了。


還問是不是“MODBUS”
uj5u.com熱心網友回復:
這個我前段時間寫過, 把要發送的位元組進行crc轉換,發給另一端,另一端會比較,然后回傳成功或失敗。uj5u.com熱心網友回復:
這個我前段時間寫過, 把要發送的位元組進行crc轉換,再拼一起發給另一端,另一端會比較,然后回傳成功或失敗。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/97077.html
標籤:Android
