
DSP28335 高速modbus代码实现
????????????????????while?????????? ???????????8???????????? ?????????CRC???????????? ???????????????????????????
发布日期:2021-05-06 22:01:43
浏览次数:29
分类:精选文章
本文共 24334 字,大约阅读时间需要 81 分钟。
Modbus????????
????
???modbus.h
#ifndef MODBUS_H#define MODBUS_Htypedef enum { MB_FUNC_READ_COIL = 1, MB_FUNC_READ_INPUT, MB_FUNC_READ_HOLDINGREGISTERS, MB_FUNC_READ_INPUTREGISTERS, MB_FUNC_FORCE_COIL, MB_FUNC_WRITE_HOLDINGREGISTER, MB_FUNC_FORCE_NCOILS = 15, MB_FUNC_WRITE_NREGISTERS = 16} ModbusFunctionCode;typedef enum { MB_ERROR_ILLEGALFUNC = 1, MB_ERROR_ILLEGALADDR, MB_ERROR_ILLEGALDATA, MB_ERROR_SLVFAILURE, MB_ERROR_ACKNOWLEDGE, MB_ERROR_SLVBUSY, MB_ERROR_NEGACKNOWLEDGE, MB_ERROR_MEMPARITY, MB_ERROR_GATEWAYPATHUN} ModbusError;typedef enum { MB_CREATE, MB_START, MB_TIMER_T35_WAIT, MB_IDLE, MB_RECEIVE, MB_PROCESS, MB_TRANSMIT, MB_DESTROY} ModbusState;typedef struct ModbusData ModbusData;struct ModbusData { Uint16 slaveAddress; Uint16 functionCode; Uint32 contentIdx; Uint32 numofregisters; Uint16 content[20]; Uint16 size; Uint16 crc;};void KD_Modbus_Init(void);typedef struct ModbusCoilsMap ModbusCoilsMap;struct ModbusCoilsMap { Uint16 dummy1; Uint16 dummy2; Uint16 dummy3; Uint16 dummy4; Uint16 dummy5; Uint16 dummy6; Uint16 dummy7; Uint16 dummy8; Uint16 dummy9; Uint16 dummy10; Uint16 dummy11; Uint16 dummy12; Uint16 dummy13; Uint16 dummy14; Uint16 dummy15; Uint16 dummy16; Uint16 dummy17; Uint16 dummy18; Uint16 dummy19; Uint16 dummy20; Uint16 dummy21; Uint16 dummy22; Uint16 dummy23; Uint16 dummy24; Uint16 dummy25; Uint16 dummy26; Uint16 dummy27; Uint16 dummy28; Uint16 dummy29; Uint16 dummy30; Uint16 dummy31; Uint16 dummy32; Uint16 dummy33; Uint16 dummy34; Uint16 dummy35; Uint16 dummy36; Uint16 dummy37; Uint16 dummy38; Uint16 dummy39; Uint16 dummy40;};typedef struct ModbusInputsMap ModbusInputsMap;struct ModbusInputsMap { Uint16 dummy1; Uint16 dummy2; Uint16 dummy3; Uint16 dummy4; Uint16 dummy5; Uint16 dummy6; Uint16 dummy7; Uint16 dummy8; Uint16 dummy9; Uint16 dummy10; Uint16 dummy11; Uint16 dummy12; Uint16 dummy13; Uint16 dummy14; Uint16 dummy15; Uint16 dummy16; Uint16 dummy17; Uint16 dummy18; Uint16 dummy19; Uint16 dummy20; Uint16 dummy21; Uint16 dummy22; Uint16 dummy23; Uint16 dummy24; Uint16 dummy25; Uint16 dummy26; Uint16 dummy27; Uint16 dummy28; Uint16 dummy29; Uint16 dummy30; Uint16 dummy31; Uint16 dummy32; Uint16 dummy33; Uint16 dummy34; Uint16 dummy35; Uint16 dummy36; Uint16 dummy37; Uint16 dummy38; Uint16 dummy39; Uint16 dummy40;};typedef struct ModbusHoldingRegistersMap ModbusHoldingRegistersMap;struct ModbusHoldingRegistersMap { Uint16 dummy1; Uint16 dummy2; Uint16 dummy3; Uint16 dummy4; Uint16 dummy5; Uint16 dummy6; Uint16 dummy7; Uint16 dummy8; Uint16 dummy9; Uint16 dummy10; Uint16 dummy11; Uint16 dummy12; Uint16 dummy13; Uint16 dummy14; Uint16 dummy15; Uint16 dummy16; Uint16 dummy17; Uint16 dummy18; Uint16 dummy19; Uint16 dummy20; Uint16 dummy21; Uint16 dummy22; Uint16 dummy23; Uint16 dummy24; Uint16 dummy25; Uint16 dummy26; Uint16 dummy27; Uint16 dummy28; Uint16 dummy29; Uint16 dummy30; Uint16 dummy31; Uint16 dummy32; Uint16 dummy33; Uint16 dummy34; Uint16 dummy35; Uint16 dummy36; Uint16 dummy37; Uint16 dummy38; Uint16 dummy39; Uint16 dummy40;};typedef struct ModbusInputRegistersMap ModbusInputRegistersMap;struct ModbusInputRegistersMap { Uint16 dummy1; Uint16 dummy2; Uint16 dummy3; Uint16 dummy4; Uint16 dummy5; Uint16 dummy6; Uint16 dummy7; Uint16 dummy8; Uint16 dummy9; Uint16 dummy10; Uint16 dummy11; Uint16 dummy12; Uint16 dummy13; Uint16 dummy14; Uint16 dummy15; Uint16 dummy16; Uint16 dummy17; Uint16 dummy18; Uint16 dummy19; Uint16 dummy20; Uint16 dummy21; Uint16 dummy22; Uint16 dummy23; Uint16 dummy24; Uint16 dummy25; Uint16 dummy26; Uint16 dummy27; Uint16 dummy28; Uint16 dummy29; Uint16 dummy30; Uint16 dummy31; Uint16 dummy32; Uint16 dummy33; Uint16 dummy34; Uint16 dummy35; Uint16 dummy36; Uint16 dummy37; Uint16 dummy38; Uint16 dummy39; Uint16 dummy40;};typedef struct ModbusSlaveStruc { ModbusState state; Uint16 rdata[30]; Uint16 sdata[100]; Uint16 recvlen; Uint16 sendlen; ModbusCoilsMap coils; ModbusInputsMap inputs; ModbusHoldingRegistersMap holdingRegisters; ModbusInputRegistersMap inputRegisters;} MBSLSTRU;#endif
???modbus.c
/* Modbus???? */#include#include #include #include typedef struct ScicRecvMsgQueueStruc { Uint16 msgLen; Uint16 msgIdx; Uint16 *pMsgData;} ScicRecvMsgQueueStruc;__interrupt void scicTxFifoIsr(void) { if ((public_struc_modbus.sendlen & 0xFF) > bufferdepth) { Temp = bufferdepth; ScicRegs.SCIFFTX.bit.TXFFIL = 0; for (i = 0; i < Temp; i++) { ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth * (public_struc_modbus.sendlen > 12)]; } public_struc_modbus.sendlen = public_struc_modbus.sendlen - bufferdepth + 0x1000; } else { Temp = (public_struc_modbus.sendlen & 0xFF); if (Temp > 0) { ScicRegs.SCIFFTX.bit.TXFFIL = 0; for (i = 0; i < Temp; i++) { ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth * (public_struc_modbus.sendlen > 12)]; } public_struc_modbus.sendlen = 0; } else { if (public_struc_modbus.sendlen == 0) { ScicRegs.SCIFFTX.bit.TXFFIENA = 0; } } } ScicRegs.SCIFFTX.bit.TXFFINTCLR = 1; PieCtrlRegs.PIEACK.bit.ACK8 = 1;}__interrupt void scicRxFifoIsr(void) { if (ScicRegs.SCIFFRX.bit.RXFFIL != 1) { if (public_struc_modbus.rdata[1] == 0) { for (i = 1; i < 8; i++) { public_struc_modbus.rdata[i] = ScicRegs.SCIRXBUF.all; } } if ((public_struc_modbus.rdata[1] == 15) || (public_struc_modbus.rdata[1] == 16)) { if (public_struc_modbus.recvlen == 0) { public_struc_modbus.recvlen = public_struc_modbus.rdata[6] + 9 + 0x1000; ScicRegs.SCIFFRX.bit.RXFFIL = 8; i = public_struc_modbus.recvlen & 0xFF - ((public_struc_modbus.recvlen > 12) * 8); if (i > 8) { ScicRegs.SCIFFRX.bit.RXFFIL = 8; } else { ScicRegs.SCIFFRX.bit.RXFFIL = i; } } else { if ((public_struc_modbus.recvlen > 12) && (public_struc_modbus.recvlen & 0xFF) / 8 < (public_struc_modbus.recvlen & 0xFF) % 8) { for (i = 0; i < 8; i++) { public_struc_modbus.rdata[i + (public_struc_modbus.recvlen > 12) * 8] = ScicRegs.SCIRXBUF.all; } public_struc_modbus.recvlen += 0x1000; i = public_struc_modbus.recvlen & 0xFF - ((public_struc_modbus.recvlen > 12) * 8); if (i > 8) { ScicRegs.SCIFFRX.bit.RXFFIL = 8; } else { ScicRegs.SCIFFRX.bit.RXFFIL = i; } } else { for (i = 0; i < (public_struc_modbus.recvlen & 0xFF) % 8; i++) { public_struc_modbus.rdata[i + (public_struc_modbus.recvlen > 12) * 8] = ScicRegs.SCIRXBUF.all; } if ((public_struc_modbus.recvlen & 0xFF) <= (i + (public_struc_modbus.recvlen > 12) * 8)) { receieve_handler(&public_struc_modbus); public_struc_modbus.rdata[1] = 0; ScicRegs.SCIFFRX.bit.RXFFIL = 1; public_struc_modbus.recvlen = 0; } } } } else { public_struc_modbus.recvlen = 8; if ((public_struc_modbus.rdata[1] >= 1) && (public_struc_modbus.rdata[1] <= 6)) { receieve_handler(&public_struc_modbus); public_struc_modbus.rdata[1] = 0; ScicRegs.SCIFFRX.bit.RXFFIL = 1; } else { receieve_handler(&public_struc_modbus); public_struc_modbus.rdata[1] = 0; ScicRegs.SCIFFRX.bit.RXFFIL = 1; } } } else { public_struc_modbus.rdata[0] = ScicRegs.SCIRXBUF.all; if (public_struc_modbus.rdata[0] == ModbusSlaveAddress) { ScicRegs.SCIFFRX.bit.RXFFIL = 7; } else { ScicRegs.SCIFFRX.bit.RXFFIL = 1; } } ScicRegs.SCIFFRX.bit.RXFFOVRCLR = 1; ScicRegs.SCIFFRX.bit.RXFFINTCLR = 1; PieCtrlRegs.PIEACK.bit.ACK8 = 1;}void KD_Modbus_Init(void) { InitScicGpio(); InitSci(); EALLOW; PieVectTable.SCIRXINTC = &scicRxFifoIsr; PieVectTable.SCITXINTC = &scicTxFifoIsr; EDIS; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; PieCtrlRegs.PIEIER8.bit.INTx5 = 1; PieCtrlRegs.PIEIER8.bit.INTx6 = 1; IER |= M_INT8; public_struc_modbus.recvlen = 0; public_struc_modbus.sendlen = 0; Uint16 i, *pcoils_sub, *pinputs_sub, *pholdingRegisters_sub, *pinputRegisters_sub; public_struc_modbus.pcoils = &public_struc_modbus.coils; public_struc_modbus.pinputs = &public_struc_modbus.inputs; public_struc_modbus.pholdingRegisters = &public_struc_modbus.holdingRegisters; public_struc_modbus.pinputRegisters = &public_struc_modbus.inputRegisters; pcoils_sub = (Uint16 *) public_struc_modbus.pcoils; pinputs_sub = (Uint16 *) public_struc_modbus.pinputs; pholdingRegisters_sub = (Uint16 *) public_struc_modbus.pholdingRegisters; pinputRegisters_sub = (Uint16 *) public_struc_modbus.pinputRegisters; for (i = 0; i < sizeof(public_struc_modbus.coils); i++) { if (i % 2 == 0) { *(pinputs_sub + i) = 1; } else { *(pinputs_sub + i) = 0; } } for (i = 0; i < sizeof(public_struc_modbus.inputRegisters); i++) { *(pholdingRegisters_sub + i) = i + 1; } for (i = 0; i < sizeof(public_struc_modbus.pinputRegisters); i++) { *(pinputRegisters_sub + i) = i + 1; } memset(public_struc_modbus.rdata, 0, sizeof(public_struc_modbus.rdata));}void receieve_handler(MBSLSTRU *pModbusSlave) { uint16 i, lentemp = public_struc_modbus.recvlen & 0xFF; ModbusData ptempdata; pcoils_sub = (Uint16 *) pModbusSlave->pcoils; pinputs_sub = (Uint16 *) pModbusSlave->pinputs; pholdingRegisters_sub = (Uint16 *) pModbusSlave->pholdingRegisters; pinputRegisters_sub = (Uint16 *) pModbusSlave->pinputRegisters; memset(pModbusSlave->sdata, 0, sizeof(pModbusSlave->sdata)); pTempData.crc = (pModbusSlave->rdata[lentemp - 2] << 8) + pModbusSlave->rdata[lentemp - 1]; pModbusSlave->sdata[0] = pModbusSlave->rdata[0]; if (pModbusSlave->rdata[0] == ModbusSlaveAddress) { pModbusSlave->sdata[1] = pModbusSlave->rdata[1]; if (CRC16(pModbusSlave->rdata, lentemp - 2) == pTempData.crc) { pTempData.contentIdx = (pModbusSlave->rdata[2] << 8) + pModbusSlave->rdata[3]; pTempData.numofregisters = (pModbusSlave->rdata[4] << 8) + pModbusSlave->rdata[5]; if ((pTempData.contentIdx + pTempData.numofregisters) > 40) { pModbusSlave->sdata[1] |= 0x80; pModbusSlave->sdata[2] |= 0x03; i = CRC16(pModbusSlave->sdata, 3); pModbusSlave->sdata[3] = (i >> 8) & 0xff; pModbusSlave->sdata[4] = i & 0xff; pModbusSlave->sendlen = 5; ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; } else { switch (pModbusSlave->rdata[1]) { case MB_FUNC_READ_COIL: pModbusSlave->sdata[2] = (pTempData.numofregisters + 7) / 8; for (i = 0; i < pTempData.numofregisters; i++) { pModbusSlave->sdata[3 + (i / 8)] |= (*(pcoils_sub + i + pTempData.contentIdx) << (i % 8)); } i = CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2] + 3); pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 1] = (i >> 8) & 0xff; pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 2] = i & 0xff; pModbusSlave->sendlen = pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2]; if (pModbusSlave->sendlen > bufferdepth) { ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth; } else { ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; } ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_READ_INPUT: pModbusSlave->sdata[2] = (pTempData.numofregisters + 7) / 8; for (i = 0; i < pTempData.numofregisters; i++) { pModbusSlave->sdata[3 + (i / 8)] |= (*(pinputs_sub + i + pTempData.contentIdx) << (i % 8)); } i = CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2] + 3); pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 1] = (i >> 8) & 0xff; pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 2] = i & 0xff; pModbusSlave->sendlen = pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2]; if (pModbusSlave->sendlen > bufferdepth) { ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth; } else { ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; } ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_READ_HOLDINGREGISTERS: pModbusSlave->sdata[2] = pTempData.numofregisters * 2; for (i = 0; i < pTempData.numofregisters; i++) { pModbusSlave->sdata[3 + i * 2 + 1] = *(pholdingRegisters_sub + i + pTempData.contentIdx); pModbusSlave->sdata[3 + i * 2 + 1] = (pModbusSlave->sdata[3 + i * 2 + 1] & 0xff); pModbusSlave->sdata[3 + i * 2] = *(pholdingRegisters_sub + i + pTempData.contentIdx); pModbusSlave->sdata[3 + i * 2] = (pModbusSlave->sdata[3 + i * 2] >> 8); } i = CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2] + 3); pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 1] = (i >> 8) & 0xff; pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 2] = i & 0xff; pModbusSlave->sendlen = pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2]; if (pModbusSlave->sendlen > bufferdepth) { ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth; } else { ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; } ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_READ_INPUTREGISTERS: pModbusSlave->sdata[2] = pTempData.numofregisters * 2; for (i = 0; i < pTempData.numofregisters; i++) { pModbusSlave->sdata[3 + i * 2 + 1] = *(pinputRegisters_sub + i + pTempData.contentIdx); pModbusSlave->sdata[3 + i * 2 + 1] = (pModbusSlave->sdata[3 + i * 2 + 1] & 0xff); pModbusSlave->sdata[3 + i * 2] = *(pinputRegisters_sub + i + pTempData.contentIdx); pModbusSlave->sdata[3 + i * 2] = (pModbusSlave->sdata[3 + i * 2] >> 8); } i = CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2] + 3); pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 1] = (i >> 8) & 0xff; pModbusSlave->sdata[2 + pModbusSlave->sdata[2] + 2] = i & 0xff; pModbusSlave->sendlen = pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2]; if (pModbusSlave->sendlen > bufferdepth) { ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth; } else { ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; } ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_FORCE_COIL: for (i = 2; i < 8; i++) { pModbusSlave->sdata[i] = pModbusSlave->rdata[i]; } if (pTempData.numofregisters == 0xFF00) { *(pcoils_sub + pTempData.contentIdx) = 1; pModbusSlave->sendlen = 8; } else if (pTempData.numofregisters == 0x0000) { *(pcoils_sub + pTempData.contentIdx) = 0; pModbusSlave->sendlen = 8; } else { pModbusSlave->sdata[1] = 0x85; pModbusSlave->sdata[2] = 0x03; i = CRC16(pModbusSlave->sdata, 3); pModbusSlave->sdata[3] = (i >> 8) & 0xff; pModbusSlave->sdata[4] = i & 0xff; pModbusSlave->sendlen = 5; } ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_WRITE_HOLDINGREGISTER: for (i = 2; i < 8; i++) { pModbusSlave->sdata[i] = pModbusSlave->rdata[i]; } *(pholdingRegisters_sub + pTempData.contentIdx) = pTempData.numofregisters; pModbusSlave->sendlen = 8; ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_FORCE_NCOILS: for (i = 0; i < pTempData.numofregisters; i++) { *(pcoils_sub + i + pTempData.contentIdx) = ((pModbusSlave->rdata[i / 8 + 7] >> (i % 8)) & 0x01); } for (i = 2; i < 7; i++) { pModbusSlave->sdata[i] = pModbusSlave->rdata[i]; } i = CRC16(pModbusSlave->sdata, 7); pModbusSlave->sdata[7] = (i >> 8) & 0xff; pModbusSlave->sdata[8] = i & 0xff; pModbusSlave->sendlen = 9; ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; case MB_FUNC_WRITE_NREGISTERS: for (i = 0; i < pTempData.numofregisters; i++) { *(pholdingRegisters_sub + i + pTempData.contentIdx) = ((pModbusSlave->rdata[i * 2 + 7] << 8) + (pModbusSlave->rdata[i * 2 + 8] & 0xff)); } for (i = 2; i < 6; i++) { pModbusSlave->sdata[i] = pModbusSlave->rdata[i]; } i = CRC16(pModbusSlave->sdata, 6); pModbusSlave->sdata[6] = (i >> 8) & 0xff; pModbusSlave->sdata[7] = i & 0xff; pModbusSlave->sendlen = 8; ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; default: pModbusSlave->sdata[2] = 0x03; i = CRC16(pModbusSlave->sdata, 3); pModbusSlave->sdata[3] = (i >> 8) & 0xff; pModbusSlave->sdata[4] = i & 0xff; pModbusSlave->sendlen = 5; ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; break; } } } else { pModbusSlave->sdata[1] |= 0x80; pModbusSlave->sdata[2] |= 0x03; i = CRC16(pModbusSlave->sdata, 3); pModbusSlave->sdata[3] = (i >> 8) & 0xff; pModbusSlave->sdata[4] = i & 0xff; pModbusSlave->sendlen = 5; ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; ScicRegs.SCIFFTX.bit.TXFFIENA = 1; } }}Uint16 CRC16(Uint16 *nData, Uint16 wLength) { static const Uint16 wCRCTable[] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCA61, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDB41, 0xDA81, 0x1A40, 0x1E00, 0xDC01, 0xD481, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0xD400, 0xD4C1, 0xD581, 0xD541, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xAAC1, 0xAD81, 0x6D40, 0xAFA1, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBD41, 0xBC81, 0x7C40, 0xBA41, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 }; Uint16 nTemp; Uint16 wCRCWord = 0xFFFF; while (wLength--) { nTemp = (*nData++ ^ wCRCWord) & 0xff; wCRCWord >>= 8; wCRCWord ^= wCRCTable[nTemp]; } wCRCWord = (wCRCWord << 8) | (wCRCWord >> 8); return wCRCWord;}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月18日 09时55分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Pythagorea(3)第16-21章
2019-03-12
纪念碑谷(1-5章)
2019-03-12
基数树(radix tree)
2019-03-12
放硬币问题的解空间结构
2019-03-12
58Q游戏(4)73(5)85(6)98(7)
2019-03-12
独立钻石棋详解
2019-03-12
106 多米诺骨牌(12)119(8)130(9)142(10)150(11)
2019-03-12
算两次计数法
2019-03-12
python正则表达式一:match、search和findall
2019-03-12
点亮细胞171-180
2019-03-12
C++ Primer Plus读书笔记:c++字符串
2019-03-12
CSU 1757: 火车入站(区间覆盖的最大覆盖深度)
2019-03-12
C++ Primer Plus读书笔记:循环读取(错误处理)
2019-03-12
skimage与cv2 安装失败的解决办法
2019-03-12
linuxmint 上面装谷歌浏览器
2019-03-12
windows/linux下Anaconda管理的(安装的)包的位置
2019-03-12
关于吴恩达的深度学习的一些授课视频里面英文翻译错误的实例展示
2019-03-12
伴随矩阵和逆矩阵的关系证明
2019-03-12
反向传播之矩阵求导dL/dz1的求导过程 普通神经网络的逆向求导过程
2019-03-12