diff --git a/modbus_processer.c b/modbus_processer.c index 2f872b6..8d63674 100644 --- a/modbus_processer.c +++ b/modbus_processer.c @@ -13,6 +13,35 @@ static modbus_processer_t* g_processer; #define GET_UINT16(uint8) (uint16_t)(((uint16_t)((uint8)[0]) << 8) + (uint8)[1]) +static void modbus_processer_process_data(uint8_t* rx, uint16_t rxlen) { + /** + * @brief modbus接收完成以后在这里进行处理数据 + * + */ + //如果不是广播信息或者不是当前设备的信息,丢弃 + if (rx[0] != 0 && rx[0] != g_processer->modbus_device_id) { + return; + } + // CRC校验失败 + if (!ZCheckRTUMessageIntegrity(rx, rxlen)) { + return; + } + // if(functioncode) + static ModbusMasterData_t rxorder; + static ModbusSlaveData_t txorder; + //将接受到的数据进行组包 + ModbusProcessRxData(rx, rxlen, &rxorder); + static uint16_t txsendlen = 0; + txorder.deviceId = g_processer->modbus_device_id; + //功能码 + txorder.functionCode = rxorder.functionCode; + + modbus_processer_context_t context = {0}; + context.tx = &txorder; + context.rx = &rxorder; + g_processer->process_rx(&context); +} + void modbus_processer_init(modbus_processer_t* processer) { g_processer = processer; } void modbus_processer_push_data(uint8_t rxdata) { if (!s_modbus_uart_rx_buf_is_processing) { @@ -99,4 +128,30 @@ void modbus_send_10(modbus_processer_context_t* context, ModbusStatus modbus_sta modbus_status); g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth); } +} + +void modbus_processer_try_process_data() { + /** + * @brief + * 根据modbus协议,当超过3.5个字符时间后依然没有收到数据 + */ + if (s_modbus_uart_rx_off != 0) { + uint16_t modbus_uart_rx_off_before = s_modbus_uart_rx_off; + + g_processer->port_delay_us(g_processer->modbus_baundrate_one_packet_delay_us); + + g_processer->port_enter_critical(); + if (s_modbus_uart_rx_off == modbus_uart_rx_off_before) { + s_modbus_uart_rx_buf_is_processing = true; + } + g_processer->port_exit_critical(); + + if (s_modbus_uart_rx_buf_is_processing) { + modbus_processer_process_data(g_processer->modbus_processer_rx_buf, s_modbus_uart_rx_off); + g_processer->port_enter_critical(); + s_modbus_uart_rx_off = 0; + s_modbus_uart_rx_buf_is_processing = false; + g_processer->port_exit_critical(); + } + } } \ No newline at end of file diff --git a/modbus_processer.h b/modbus_processer.h index 012a12b..288d2ae 100644 --- a/modbus_processer.h +++ b/modbus_processer.h @@ -42,3 +42,6 @@ bool modbus_if_register_exists_10(modbus_processer_context_t* context, uint16_t void modbus_send_03(modbus_processer_context_t* context, ModbusStatus modbus_status); void modbus_send_10(modbus_processer_context_t* context, ModbusStatus modbus_status); + +void modbus_processer_try_process_data(); +void ModbusProcessRxData(uint8_t *rxraw, uint8_t length, ModbusMasterData_t *rxparsed); \ No newline at end of file diff --git a/zmodbus_common.c b/zmodbus_common.c index d50b261..504fa42 100644 --- a/zmodbus_common.c +++ b/zmodbus_common.c @@ -73,3 +73,6 @@ void ZGenerateCRC16CheckCodeToPacket(uint8_t *puckMsg, uint8_t packetlen) { puckMsg[packetlen - 1] = crc; } +bool ZCheckRTUMessageIntegrity(uint8_t *message, uint8_t length) { + return (ZGenerateCRC16CheckCode(message, length) == 0x00) ? true : false; +} diff --git a/zmodbus_common.h b/zmodbus_common.h index 8251f58..3989446 100644 --- a/zmodbus_common.h +++ b/zmodbus_common.h @@ -119,4 +119,5 @@ typedef struct { } ModbusSlaveData_t; void ZGenerateCRC16CheckCodeToPacket(uint8_t *puckMsg, uint8_t packetlen); -uint16_t ZGenerateCRC16CheckCode(uint8_t *puckMsg, uint8_t usDataLen); \ No newline at end of file +uint16_t ZGenerateCRC16CheckCode(uint8_t *puckMsg, uint8_t usDataLen); +bool ZCheckRTUMessageIntegrity(uint8_t *message, uint8_t length); \ No newline at end of file diff --git a/zmodbus_slave.c b/zmodbus_slave.c index 2348725..61312b5 100644 --- a/zmodbus_slave.c +++ b/zmodbus_slave.c @@ -6,6 +6,32 @@ (u8addbegin)[1] = (uint8_t)u16d; \ } +void ModbusProcessRxData(uint8_t *rxraw, uint8_t length, ModbusMasterData_t *rxparsed) { + rxparsed->functionCode = (ModbusFunctionCode)rxraw[1]; + if (rxraw[1] == ModbusOrder01 || rxraw[1] == ModbusOrder02 || rxraw[1] == ModbusOrder03 || + rxraw[1] == ModbusOrder04) { + /** + * @brief + * 由于是共用体,所以均给001赋值即可 + */ + rxparsed->d.O01.startbit = rxraw[2] * 256 + rxraw[3]; + rxparsed->d.O01.numbit = rxraw[4] * 256 + rxraw[5]; + } else if (rxraw[1] == ModbusOrder0F || rxraw[1] == ModbusOrder10) { + /** + * @brief + * 由于是共用体,所以均给0F赋值即可 + */ + rxparsed->d.O0F.startbit = rxraw[2] * 256 + rxraw[3]; + rxparsed->d.O0F.numbit = rxraw[4] * 256 + rxraw[5]; + rxparsed->d.O0F.bytenum = rxraw[6]; + rxparsed->d.O0F.bit = &rxraw[7]; + } else { + /** + * @brief Not support now + */ + } +} + void ModbusCreateTx_setReg(uint8_t *txbuffer, uint8_t length, uint16_t off, uint16_t regdata) { if (3 + off * 2 > length - 2) { return;