存档:Modbus主站功能基本完成

This commit is contained in:
吴俊潮 2025-06-03 15:05:24 +08:00
parent 886a6da466
commit d187e0de5e
14 changed files with 15375 additions and 11699 deletions

View File

@ -49,9 +49,6 @@ void main_data_init(void);
//绘图数据初始化 //绘图数据初始化
void plot_data_init(void); void plot_data_init(void);
//界面复位
void menu_reset(void);
//开机动画 //开机动画
void scr_init_run(void); void scr_init_run(void);

View File

@ -88,48 +88,6 @@ void plot_data_init(void)
pltdata.yreal_scd_value_prv = 0; //前一时刻的输入测量值 pltdata.yreal_scd_value_prv = 0; //前一时刻的输入测量值
} }
void menu_reset(void)
{
//界面复位
if(menu_data.scr_now == SCREEN_INIT)
{
//如果正处于开机动画中,立即返回。
return;
}
//加载初始界面
setup_scr_screen_init(&guider_ui);
scr_main_recover();
delay_cnt(200);
lv_scr_load(guider_ui.screen_init);
//释放内存
switch (menu_data.scr_now)
{
case SCREEN_MAIN:
{
lv_obj_add_flag(guider_ui.screen_main, LV_OBJ_FLAG_HIDDEN);
}
break;
case SCREEN_SETTING:
{
lv_obj_add_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
}
break;
default:
break;
}
//参数复位内部会对menu_data.scr_now进行更改因此放置于最后。
screen_data_init();
}
uint8_t init_step = 0; uint8_t init_step = 0;
uint8_t scr_main_set_flag = 0; uint8_t scr_main_set_flag = 0;
void scr_init_run(void) void scr_init_run(void)
@ -176,9 +134,8 @@ void scr_init_run(void)
lv_scr_load(guider_ui.screen_main); lv_scr_load(guider_ui.screen_main);
scr_main_recover(); scr_main_recover();
//开机动画结束后,隐藏初始界面 //开机动画结束后,删除界面对象,异步删除,更加安全
//lv_obj_add_flag(guider_ui.screen_init, LV_OBJ_FLAG_HIDDEN); lv_obj_del_async(guider_ui.screen_init);
lv_obj_del_async(guider_ui.screen_init); //异步删除,更加安全
init_step = 3; init_step = 3;
} }

View File

@ -382,8 +382,6 @@ void trx_window_init(void)
lvobj_window_trx_nums[30] = guider_ui.screen_modbus_trx_num_36; lvobj_window_trx_nums[30] = guider_ui.screen_modbus_trx_num_36;
lvobj_window_trx_nums[31] = guider_ui.screen_modbus_trx_num_37; lvobj_window_trx_nums[31] = guider_ui.screen_modbus_trx_num_37;
memset(window_trx_num, 16, sizeof(window_trx_num));
char str_temp[8]; char str_temp[8];
for(uint8_t i = 0; i < 32; i++) for(uint8_t i = 0; i < 32; i++)
{ {

View File

@ -150,16 +150,6 @@ void physical_quantity_init(void)
void screen_run(void) void screen_run(void)
{ {
//手动触发显示内容复位
if(menu_data.menu_reset_flag)
{
menu_reset();
menu_data.menu_reset_flag = 0;
return;
}
if(menu_data.scr_init_flag == 0) if(menu_data.scr_init_flag == 0)
{ {
//未播放过开机动画的情况下,播放开机动画 //未播放过开机动画的情况下,播放开机动画

View File

@ -583,12 +583,12 @@ void key_functions_modbus(void)
{ {
lv_obj_clear_flag(guider_ui.screen_modbus_trx_window_data, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(guider_ui.screen_modbus_trx_window_data, LV_OBJ_FLAG_HIDDEN);
trx_window_init();
window_trx_cursor = 0; window_trx_cursor = 0;
window_trx_cursor_prv = 99; window_trx_cursor_prv = 99;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv); trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
trx_window_init();
current_operation = MODBUS_MASTER_TRX_MODIFY; current_operation = MODBUS_MASTER_TRX_MODIFY;
key_config_update(current_operation); key_config_update(current_operation);
} }
@ -684,6 +684,14 @@ void key_functions_modbus(void)
{ {
case MODBUS_MASTER_CONFIG: case MODBUS_MASTER_CONFIG:
{ {
//直接删除收发界面的内容
if(mod_trx_set_flag)
{
//加载过的情况下才能删除,否则会进入硬件错误中断
mod_trx_set_flag = 0;
lv_obj_del(guider_ui.screen_modbus_trx);
}
//加载设置界面的内容 //加载设置界面的内容
setup_scr_screen_setting(&guider_ui); setup_scr_screen_setting(&guider_ui);
scr_setting_recover(); scr_setting_recover();
@ -691,14 +699,8 @@ void key_functions_modbus(void)
lv_scr_load(guider_ui.screen_setting); //加载菜单界面 lv_scr_load(guider_ui.screen_setting); //加载菜单界面
//删除modbus的相关内容释放内存 //异步删除modbus配置的相关内容,释放内存
lv_obj_del_async(guider_ui.screen_modbus_config); lv_obj_del_async(guider_ui.screen_modbus_config);
if(mod_trx_set_flag)
{
//加载过的情况下才能删除,否则会进入硬件错误中断
mod_trx_set_flag = 0;
lv_obj_del_async(guider_ui.screen_modbus_trx);
}
menu_data.scr_now = SCREEN_SETTING; menu_data.scr_now = SCREEN_SETTING;

View File

@ -541,14 +541,23 @@ void key_functions_setting(void)
} }
else if( tabdata.modbus_type == SIG_MASTER) else if( tabdata.modbus_type == SIG_MASTER)
{ {
//【主界面, 设置界面】共用一块内存空间,两者之间通过隐藏&显示切换
//【Modbus主站配置界面, Modbus主站收发界面】共用一块内存空间两者之间通过隐藏&显示切换
//设置界面 -> Modbus主站配置界面时立即删除主界面对象异步删除设置界面加载配置界面切换至收发界面时再加载收发界面对象
//设置界面 <- Modbus主站配置界面时立即删除收发界面对象异步删除配置界面加载设置界面切换至主界面时再加载主界面对象
tabdata.content_focus = 0; tabdata.content_focus = 0;
lv_obj_set_style_bg_color(guider_ui.screen_setting_label_31, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_bg_color(guider_ui.screen_setting_label_31, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT);
//跳转至modbus配置界面 //立即删除主界面的相关内容,释放内存
current_operation = MODBUS_MASTER_CONFIG; if(scr_main_set_flag)
key_config_update(current_operation); {
//加载过的情况下才能删除,否则会进入硬件错误中断。
scr_main_set_flag = 0;
lv_obj_del(guider_ui.screen_main);
}
//设置modbus配置界面和收发界面的内容 //设置modbus配置界面的内容
setup_scr_screen_modbus_config(&guider_ui); setup_scr_screen_modbus_config(&guider_ui);
scr_modbus_config_recover(); scr_modbus_config_recover();
delay_cnt(200); //不加延时有概率卡死 delay_cnt(200); //不加延时有概率卡死
@ -557,14 +566,12 @@ void key_functions_setting(void)
menu_data.scr_now = SCREEN_MODBUS_MASTER_CONFIG; menu_data.scr_now = SCREEN_MODBUS_MASTER_CONFIG;
//删除主界面和设置界面的相关内容,释放内存 //异步删除设置界面,更加安全
if(scr_main_set_flag) lv_obj_del_async(guider_ui.screen_setting);
{
//加载过的情况下才能删除,否则会进入硬件错误中断 //当前操作变更为MODBUS主站配置
scr_main_set_flag = 0; current_operation = MODBUS_MASTER_CONFIG;
lv_obj_del_async(guider_ui.screen_main); //异步删除,更加安全 key_config_update(current_operation);
}
lv_obj_del_async(guider_ui.screen_setting); //异步删除,更加安全
} }
} }
break; break;

View File

@ -18,6 +18,7 @@ void duty_tim3(void)
freq_signal.over_cnt++; freq_signal.over_cnt++;
} }
void duty_tim6(void) void duty_tim6(void)
{ {
//lv_tick_inc(1); //lv_tick_inc(1);
@ -83,6 +84,90 @@ void duty_tim6(void)
} }
} }
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
//记录发送完成的时间点
st_flag = TRANSPARENT_TRANSMIT_END;
tick_end = xTaskGetTickCountFromISR();
//计算延迟捕获失败时清零速度过快小于1ms
//trans_log_rx = tick_middle - tick_start;
//if(trans_log_rx > 1000) trans_log_rx = 0;
trans_log_tx = tick_end - tick_middle;
if(trans_log_tx > 1000) trans_log_tx = 0;
//发送完成后将相关数组清零
if(huart == &huart1)
{
//HART重新使能接收
HART_RTS(RTS_OFF);
memset(scom1_hart.tx_buff, 0, scom1_hart.tx_len);
scom1_hart.tx_len = 0;
//PC--->SIG--->HART重新开启485的DMA
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
if(huart == &huart2)
{
memset(scom2_rs485.tx_buff, 0, scom2_rs485.tx_len);
scom2_rs485.tx_len = 0;
//开启对应的DMA
switch (sig_trans)
{
case TRANS_HART_TO_PC:
{
HAL_UART_Receive_DMA(&huart1, scom1_hart.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_BLE_TO_PC:
{
HAL_UART_Receive_DMA(&huart6, scom6_ble.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_MODBUS_PC_TO_SIG:
{
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_MODBUS_SIG_TO_SLAVE:
{
mod_master.tx_flag = TX_OK;
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
sig2slave_current_tick = 0;
}
break;
default:
break;
}
}
if(huart == &huart6)
{
memset(scom6_ble.tx_buff, 0, scom6_ble.tx_len);
scom6_ble.tx_len = 0;
//PC--->SIG--->BLE重新开启485的DMA
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
//通讯模式清空,等待下一次接收
sig_trans = TRANS_NONE;
//如果显示任务被挂起则在此处释放无DMA的情况
if(screen_suspend_flag)
{
xTaskResumeFromISR(task_lcdHandle);
xTaskResumeFromISR(task_menuHandle);
screen_suspend_flag = 0;
}
}
void delay_cnt(uint16_t cnt) void delay_cnt(uint16_t cnt)
{ {

View File

@ -22,7 +22,10 @@ typedef enum
RX_ERROR_OVERFLOW, //接收到的数据超出缓存区 RX_ERROR_OVERFLOW, //接收到的数据超出缓存区
RX_ERROR_WRONG_ID, //接收到的设备ID与目标ID不符 RX_ERROR_WRONG_ID, //接收到的设备ID与目标ID不符
RX_ERROR_WRONG_LENGTH, //数据长度不符 RX_ERROR_WRONG_LENGTH, //数据长度不符
RX_ERROR_WRONG_CMD //命令无效 RX_ERROR_INVALID_CMD, //命令字无效,不存在
RX_EEROR_WRONG_CMD, //应答的命令字与发送的不符
RX_ERROR_WRONG_DATA, //应答的数据与写入的不符
RX_ERROR_WRONG_NUM //应答的寄存器数量与发送的不符
}ERROR_NESSAGE_RX; }ERROR_NESSAGE_RX;
typedef enum typedef enum

View File

@ -1,9 +1,9 @@
#include "modbus_rtu.h" #include "modbus_rtu.h"
uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00}; //线圈寄存器 uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0}; //线圈寄存器
uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00,0x00}; //离散量寄存器 uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0}; //离散量寄存器
uint16_t InputReg[MAX_INPUT_REG_NUM] = {0x0000,0x0000,0x0000,0x0000}; //输入寄存器 uint16_t InputReg[MAX_INPUT_REG_NUM] = {0}; //输入寄存器
uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0, 0,0,0x00C8}; //保持寄存器 uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0}; //保持寄存器
Var_Reg SamVarReg; Var_Reg SamVarReg;
eMBException ex_message = MB_EX_NONE; //从设备返回的异常信息 eMBException ex_message = MB_EX_NONE; //从设备返回的异常信息

View File

@ -21,13 +21,17 @@ void modbus_rtu_master_init(void)
mod_master.rx_flag = RX_NONE; mod_master.rx_flag = RX_NONE;
mod_master.tx_flag = TX_NONE; mod_master.tx_flag = TX_NONE;
memset(mod_master.result_display, 0, sizeof(mod_master.result_display)); memset(mod_master.result_display, 0, sizeof(mod_master.result_display));
memset(window_trx_num, 16, sizeof(window_trx_num));
} }
void modbus_rtu_master_load(void) void modbus_rtu_master_load(void)
{ {
//先清空之前的发送数据
memset(mod_master.data_tx, 0, sizeof(mod_master.data_tx));
mod_master.data_tx[0] = mod_master.target_id; mod_master.data_tx[0] = mod_master.target_id;
mod_master.data_tx[1] = mod_master.command_code; mod_master.data_tx[1] = mod_master.command_code;
memset(mod_master.data_rx, 0, sizeof(mod_master.data_rx));
mod_master.tx_error_message = TX_ERROR_NONE; mod_master.tx_error_message = TX_ERROR_NONE;
switch (mod_master.data_tx[1]) switch (mod_master.data_tx[1])
@ -173,6 +177,11 @@ void modbus_rtu_master_load(void)
void modbus_rtu_master_send(void) void modbus_rtu_master_send(void)
{ {
//先清空之间的接收数据与显示内容
memset(mod_master.data_rx, 0, sizeof(mod_master.data_rx));
memset(mod_master.result_display, 0, sizeof(mod_master.result_display));
lv_label_set_text(guider_ui.screen_modbus_trx_value_Rx, "");
if(mod_master.tx_error_message == TX_ERROR_NONE) if(mod_master.tx_error_message == TX_ERROR_NONE)
{ {
mod_master.rx_flag = TX_WAITING; mod_master.rx_flag = TX_WAITING;
@ -218,6 +227,14 @@ void modbus_rtu_master_analysis(void)
return; return;
} }
//返回的命令字与发送的命令字是否一致
if(mod_master.data_rx[1] != mod_master.command_code)
{
mod_master.rx_error_message = RX_EEROR_WRONG_CMD;
strcpy(mod_master.result_display, "ERROR: WRONG COMMAND");
return;
}
//收到的是异常响应 //收到的是异常响应
if(mod_master.data_rx[1] > 0x80) if(mod_master.data_rx[1] > 0x80)
{ {
@ -242,6 +259,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
case ReadCoilState: case ReadCoilState:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) ) if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -263,6 +281,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
case ReadDisInputState: case ReadDisInputState:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) ) if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -284,6 +303,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】
case ReadHoldReg: case ReadHoldReg:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) ) if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -305,6 +325,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【返回字节数】【字1~n高】【字1~n低】【CRC16校验低】【CRC16校验高】
case ReadInputReg: case ReadInputReg:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) ) if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -326,6 +347,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【地址高】【地址低】【标志位高】【标志位低】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【地址高】【地址低】【标志位高】【标志位低】【CRC16校验低】【CRC16校验高】
case WriteSingleCoil: case WriteSingleCoil:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != 8 ) if( mod_master.data_rx_len != 8 )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -333,6 +355,14 @@ void modbus_rtu_master_data_process(void)
return; return;
} }
//应答数据报的标志位是否与发送的一致
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
{
mod_master.rx_error_message = RX_ERROR_WRONG_DATA;
strcpy(mod_master.result_display, "ERROR: WRONG DATA");
return;
}
//数据解析 //数据解析
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Bits:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]); sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Bits:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
} }
@ -341,6 +371,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【地址高】【地址低】【数据高】【数据低】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【地址高】【地址低】【数据高】【数据低】【CRC16校验低】【CRC16校验高】
case WriteSingleReg: case WriteSingleReg:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != 8 ) if( mod_master.data_rx_len != 8 )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -348,6 +379,14 @@ void modbus_rtu_master_data_process(void)
return; return;
} }
//应答数据报的数据是否与发送的一致
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
{
mod_master.rx_error_message = RX_ERROR_WRONG_DATA;
strcpy(mod_master.result_display, "ERROR: WRONG DATA");
return;
}
//数据解析 //数据解析
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Data:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]); sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Data:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
} }
@ -356,6 +395,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
case WriteMultiCoil: case WriteMultiCoil:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != 8 ) if( mod_master.data_rx_len != 8 )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -363,6 +403,14 @@ void modbus_rtu_master_data_process(void)
return; return;
} }
//应答数据报的寄存器数量是否与发送的一致
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
{
mod_master.rx_error_message = RX_ERROR_WRONG_NUM;
strcpy(mod_master.result_display, "ERROR: WRONG NUMBER OF REGISTERS");
return;
}
//数据解析 //数据解析
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]); sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x CoilAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
} }
@ -371,6 +419,7 @@ void modbus_rtu_master_data_process(void)
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】 //【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
case WriteMultiReg: case WriteMultiReg:
{ {
//应答数据报的长度是否正确
if( mod_master.data_rx_len != 8 ) if( mod_master.data_rx_len != 8 )
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH; mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
@ -378,6 +427,14 @@ void modbus_rtu_master_data_process(void)
return; return;
} }
//应答数据报的寄存器数量是否与发送的一致
if( (mod_master.data_rx[4] != mod_master.data_tx[4])||(mod_master.data_rx[5] != mod_master.data_tx[5]) )
{
mod_master.rx_error_message = RX_ERROR_WRONG_NUM;
strcpy(mod_master.result_display, "ERROR: WRONG NUMBER OF REGISTERS");
return;
}
//数据解析 //数据解析
sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]); sprintf(mod_master.result_display, "Address:0x%02x Command:0x%02x RegAddress:0x%02x%02x Num:0x%02x%02x", mod_master.data_rx[0], mod_master.data_rx[1], mod_master.data_rx[2], mod_master.data_rx[3], mod_master.data_rx[4], mod_master.data_rx[5]);
} }
@ -385,8 +442,8 @@ void modbus_rtu_master_data_process(void)
default: default:
{ {
mod_master.rx_error_message = RX_ERROR_WRONG_CMD; mod_master.rx_error_message = RX_ERROR_INVALID_CMD;
strcpy(mod_master.result_display, "ERROR: WRONG COMMAND"); strcpy(mod_master.result_display, "ERROR: INVALID COMMAND");
} }
break; break;
} }

View File

@ -434,89 +434,5 @@ void USART6_IRQHandler(void)
} }
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
//记录发送完成的时间点
st_flag = TRANSPARENT_TRANSMIT_END;
tick_end = xTaskGetTickCountFromISR();
//计算延迟捕获失败时清零速度过快小于1ms
//trans_log_rx = tick_middle - tick_start;
//if(trans_log_rx > 1000) trans_log_rx = 0;
trans_log_tx = tick_end - tick_middle;
if(trans_log_tx > 1000) trans_log_tx = 0;
//发送完成后将相关数组清零
if(huart == &huart1)
{
//HART重新使能接收
HART_RTS(RTS_OFF);
memset(scom1_hart.tx_buff, 0, scom1_hart.tx_len);
scom1_hart.tx_len = 0;
//PC--->SIG--->HART重新开启485的DMA
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
if(huart == &huart2)
{
memset(scom2_rs485.tx_buff, 0, scom2_rs485.tx_len);
scom2_rs485.tx_len = 0;
//开启对应的DMA
switch (sig_trans)
{
case TRANS_HART_TO_PC:
{
HAL_UART_Receive_DMA(&huart1, scom1_hart.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_BLE_TO_PC:
{
HAL_UART_Receive_DMA(&huart6, scom6_ble.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_MODBUS_PC_TO_SIG:
{
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
break;
case TRANS_MODBUS_SIG_TO_SLAVE:
{
mod_master.tx_flag = TX_OK;
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
sig2slave_current_tick = 0;
}
break;
default:
break;
}
}
if(huart == &huart6)
{
memset(scom6_ble.tx_buff, 0, scom6_ble.tx_len);
scom6_ble.tx_len = 0;
//PC--->SIG--->BLE重新开启485的DMA
HAL_UART_Receive_DMA(&huart2, scom2_rs485.rx_buff, BUFFER_SIZE);
}
//通讯模式清空,等待下一次接收
sig_trans = TRANS_NONE;
//如果显示任务被挂起则在此处释放无DMA的情况
if(screen_suspend_flag)
{
xTaskResumeFromISR(task_lcdHandle);
xTaskResumeFromISR(task_menuHandle);
screen_suspend_flag = 0;
}
}
/* USER CODE END 1 */ /* USER CODE END 1 */

File diff suppressed because one or more lines are too long

View File

@ -258,16 +258,6 @@
<Ww> <Ww>
<count>20</count> <count>20</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>window_trx_focus,0x0A</ItemText>
</Ww>
<Ww>
<count>21</count>
<WinNumber>1</WinNumber>
<ItemText>window_trx_cursor,0x0A</ItemText>
</Ww>
<Ww>
<count>22</count>
<WinNumber>1</WinNumber>
<ItemText>window_trx_num</ItemText> <ItemText>window_trx_num</ItemText>
</Ww> </Ww>
</WatchWindow1> </WatchWindow1>

File diff suppressed because it is too large Load Diff