http://www.javashuo.com/article/p-gewxxbhi-ct.htmlhtml
首先規定下協議 ,CRC16就不加了哈,最後我會附上CRC16的計算程序,你們有興趣本身加上測試
上位機發送:spa
0xaa 0x55 0x03 佔空比(四字節) 低位在前 高位在後指針
注意哈:其實儀器儀表 高位在前 低位在後 用的多 因爲咱的單片機和上位機都是小端,咱爲了方便因此那樣規定的協議調試
其實只要明白了原理 本身調換就能夠code
單片機解析協議,而後修改佔空比htm
先用調試助手發幾個數據測試一下 blog
aa 55 03 E8 03 00 00 1000get
aa 55 03 F4 01 00 00 500iframe
aa 55 03 64 00 00 00 100
aa 55 03 00 00 00 00 0
給你們C語言計算CRC的程序
/** * @brief 計算CRC * @param *modbusdata:數據指針 * @param length:數據長度 * @param * @retval 計算的CRC值 * @example **/ int crc16_modbus(u8 *modbusdata, int length) { int i, j; int crc = 0xffff;//有的使用0 for (i = 0; i < length; i++) { crc ^= modbusdata[i]; for (j = 0; j < 8; j++) { if ((crc & 0x01) == 1) { crc = (crc >> 1) ^ 0xa001; } else { crc >>= 1; } } } return crc; } /** * @brief 判斷數據的CRC校驗是否正確 * @param *modbusdata:數據指針 * @param length:數據長度 * @param * @retval 1 正確 0 錯誤 * @example **/ int crc16_flage(u8 *modbusdata, int length) { int Receive_CRC=0,calculation=0;//接收到的CRC,計算的CRC Receive_CRC = crc16_modbus(modbusdata, length); calculation = modbusdata[length+1]; calculation <<= 8; calculation += modbusdata[length]; if(calculation != Receive_CRC) { return 0; } return 1; }
好了下節再作上位機程序