Browse Source

编译没报错,但是中断接收不到消息

master
zwsd 3 years ago
parent
commit
70d0090827
  1. 55
      modbus_processer.c
  2. 3
      modbus_processer.h
  3. 3
      zmodbus_common.c
  4. 3
      zmodbus_common.h
  5. 26
      zmodbus_slave.c

55
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();
}
}
}

3
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);

3
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;
}

3
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);
uint16_t ZGenerateCRC16CheckCode(uint8_t *puckMsg, uint8_t usDataLen);
bool ZCheckRTUMessageIntegrity(uint8_t *message, uint8_t length);

26
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;

Loading…
Cancel
Save