1、可读性非常好的 MODBUS源代码 ( 1)为了加快发送采用了:数据空中断 ( 2)为了保证最后一个字节能够发送到上位机采用了:发送完成中断 #include #include #define _USART1_H #include “DMS2000.h“ const UCHAR auchCRCHi = 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00
2、, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81
3、, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01
4、, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81
5、, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01
6、, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; const UCHAR auchCRCLo = 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC
7、4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF
8、0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x2
9、5, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xB
10、B, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9
11、E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 ; BOOL volatile USART1_send_mark = FALSE; UCHAR vola
12、tile USART1_sendPosi = 0; SHORT volatile USART1_receCount = 0; UCHAR volatile USART1_receTimeOut = 0; UCHAR volatile USART1_checkoutError = 0; UCHAR volatile USART1_sendCount = 0; UCHAR USART1_ch_type = 0; UCHAR USART1_set_number = 0; UCHAR USART1_send_bufferMSCOMM_BUFFER_LENGTH; UCHAR USART1_mscomm
13、_bufferMSCOMM_BUFFER_LENGTH; USHORT CRC16(UCHAR *puchMsg, USHORT usDataLen) UCHAR uchCRCHi = 0xFF; UCHAR uchCRCLo = 0xFF; ULONG uIndex; while (usDataLen-) uIndex = uchCRCHi *puchMsg+; uchCRCHi = uchCRCLo auchCRCHiuIndex; uchCRCLo = auchCRCLouIndex; return (uchCRCHi 0x01; UCHAR me_Baud = (UCHAR)(MSCO
14、MM_baud UCSR1B = 0x00; UCSR1A = 0x00; UCSR1C = (1 = 1 if (USART1_receTimeOut = 0 USART1_checkoutError = 0; if (!USART1_send_mark) RS485_RECIVE(); void USART1_Begin_Send(void) RS485_SEND(); NOP(); / -| NOP(); / | NOP(); / |-等待总线释放 NOP(); / | NOP(); / -| NOP(); / -| NOP(); / | NOP(); / |-等待总线释放 NOP();
15、 / | NOP(); / -| USART1_send_mark = TRUE; USART1_sendPosi = 0; UCSR1B |= BIT(5); void USART1_MODBUS_Error(UCHAR error_code) USHORT crcData; USART1_send_buffer0 = USART1_mscomm_buffer0; USART1_send_buffer1 = USART1_mscomm_buffer1 | 0x80; USART1_send_buffer2 = error_code; crcData = CRC16(USART1_send_b
16、uffer,3); USART1_send_buffer3 = crcData 8; USART1_send_buffer4 = crcData USART1_sendCount = 5; USART1_Begin_Send(); void USART1_ReadCoilRegisters(void) UCHAR i,k; UCHAR byteCount; SHORT registerAmount; SHORT startAddr; SHORT tempAddr; SHORT tempData; USHORT crcData; startAddr = (SHORT)(USART1_mscomm
17、_buffer2 0x03; if (registerAmount for (k = 0 ; k = startAddr + registerAmount) break; USART1_send_buffer0 = USART1_mscomm_buffer0; USART1_send_buffer1 = USART1_mscomm_buffer1; USART1_send_buffer2 = byteCount; byteCount += 3; crcData = CRC16(USART1_send_buffer,byteCount); USART1_send_bufferbyteCount
18、= crcData 8; byteCount+; USART1_send_bufferbyteCount = crcData USART1_sendCount = byteCount + 1; USART1_Begin_Send(); else USART1_MODBUS_Error(2); void USART1_ReadDiscreteRegisters(void) UCHAR i,k; UCHAR byteCount; SHORT registerAmount; SHORT startAddr; SHORT tempAddr; SHORT tempData; USHORT crcData
19、; startAddr = (SHORT)(USART1_mscomm_buffer2 0x03; if (registerAmount for (k = 0 ; k = startAddr + registerAmount) break; USART1_send_buffer0 = USART1_mscomm_buffer0; USART1_send_buffer1 = USART1_mscomm_buffer1; USART1_send_buffer2 = byteCount; byteCount += 3; crcData = CRC16(USART1_send_buffer,byteC
20、ount); USART1_send_bufferbyteCount = crcData 8; byteCount+; USART1_send_bufferbyteCount = crcData USART1_sendCount = byteCount + 1; USART1_Begin_Send(); else USART1_MODBUS_Error(2); void USART1_ReadHoldingRegisters(void) UCHAR i; SHORT startAddr; SHORT registerAmount; SHORT byteCount; SHORT tempData; USHORT crcData; startAddr = (SHORT)(USART1_mscomm_buffer2 8; USART1_send_buffer2*i+4 = tempData USART1_send_buffer0 = USART1_mscomm_buffer0; USART1_send_buffer1 = USART1_mscomm_buffer1; USART1_send_buffer2 = byteCount; byteCount += 3; crcData = CRC16(USART1_send_buffer,byteCount);