存档:Modbus主站功能基本完成
This commit is contained in:
parent
886a6da466
commit
d187e0de5e
|
@ -49,9 +49,6 @@ void main_data_init(void);
|
|||
//绘图数据初始化
|
||||
void plot_data_init(void);
|
||||
|
||||
//界面复位
|
||||
void menu_reset(void);
|
||||
|
||||
//开机动画
|
||||
void scr_init_run(void);
|
||||
|
||||
|
|
|
@ -88,48 +88,6 @@ void plot_data_init(void)
|
|||
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 scr_main_set_flag = 0;
|
||||
void scr_init_run(void)
|
||||
|
@ -176,9 +134,8 @@ void scr_init_run(void)
|
|||
lv_scr_load(guider_ui.screen_main);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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[31] = guider_ui.screen_modbus_trx_num_37;
|
||||
|
||||
memset(window_trx_num, 16, sizeof(window_trx_num));
|
||||
|
||||
char str_temp[8];
|
||||
for(uint8_t i = 0; i < 32; i++)
|
||||
{
|
||||
|
|
|
@ -150,16 +150,6 @@ void physical_quantity_init(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)
|
||||
{
|
||||
//未播放过开机动画的情况下,播放开机动画
|
||||
|
|
|
@ -583,12 +583,12 @@ void key_functions_modbus(void)
|
|||
{
|
||||
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_prv = 99;
|
||||
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
|
||||
|
||||
trx_window_init();
|
||||
|
||||
current_operation = MODBUS_MASTER_TRX_MODIFY;
|
||||
key_config_update(current_operation);
|
||||
}
|
||||
|
@ -684,6 +684,14 @@ void key_functions_modbus(void)
|
|||
{
|
||||
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);
|
||||
scr_setting_recover();
|
||||
|
@ -691,14 +699,8 @@ void key_functions_modbus(void)
|
|||
|
||||
lv_scr_load(guider_ui.screen_setting); //加载菜单界面
|
||||
|
||||
//删除modbus的相关内容,释放内存
|
||||
//异步删除modbus配置的相关内容,释放内存
|
||||
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;
|
||||
|
||||
|
|
|
@ -541,14 +541,23 @@ void key_functions_setting(void)
|
|||
}
|
||||
else if( tabdata.modbus_type == SIG_MASTER)
|
||||
{
|
||||
//【主界面, 设置界面】共用一块内存空间,两者之间通过隐藏&显示切换
|
||||
//【Modbus主站配置界面, Modbus主站收发界面】共用一块内存空间,两者之间通过隐藏&显示切换
|
||||
//设置界面 -> Modbus主站配置界面时,立即删除主界面对象,异步删除设置界面,加载配置界面,切换至收发界面时再加载收发界面对象
|
||||
//设置界面 <- Modbus主站配置界面时,立即删除收发界面对象,异步删除配置界面,加载设置界面,切换至主界面时再加载主界面对象
|
||||
|
||||
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);
|
||||
|
||||
//跳转至modbus配置界面
|
||||
current_operation = MODBUS_MASTER_CONFIG;
|
||||
key_config_update(current_operation);
|
||||
//立即删除主界面的相关内容,释放内存
|
||||
if(scr_main_set_flag)
|
||||
{
|
||||
//加载过的情况下才能删除,否则会进入硬件错误中断。
|
||||
scr_main_set_flag = 0;
|
||||
lv_obj_del(guider_ui.screen_main);
|
||||
}
|
||||
|
||||
//设置modbus配置界面和收发界面的内容
|
||||
//设置modbus配置界面的内容
|
||||
setup_scr_screen_modbus_config(&guider_ui);
|
||||
scr_modbus_config_recover();
|
||||
delay_cnt(200); //不加延时有概率卡死
|
||||
|
@ -557,14 +566,12 @@ void key_functions_setting(void)
|
|||
|
||||
menu_data.scr_now = SCREEN_MODBUS_MASTER_CONFIG;
|
||||
|
||||
//删除主界面和设置界面的相关内容,释放内存
|
||||
if(scr_main_set_flag)
|
||||
{
|
||||
//加载过的情况下才能删除,否则会进入硬件错误中断
|
||||
scr_main_set_flag = 0;
|
||||
lv_obj_del_async(guider_ui.screen_main); //异步删除,更加安全
|
||||
}
|
||||
lv_obj_del_async(guider_ui.screen_setting); //异步删除,更加安全
|
||||
//异步删除设置界面,更加安全
|
||||
lv_obj_del_async(guider_ui.screen_setting);
|
||||
|
||||
//当前操作变更为MODBUS主站配置
|
||||
current_operation = MODBUS_MASTER_CONFIG;
|
||||
key_config_update(current_operation);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -18,6 +18,7 @@ void duty_tim3(void)
|
|||
freq_signal.over_cnt++;
|
||||
|
||||
}
|
||||
|
||||
void duty_tim6(void)
|
||||
{
|
||||
//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)
|
||||
{
|
||||
|
|
|
@ -22,7 +22,10 @@ typedef enum
|
|||
RX_ERROR_OVERFLOW, //接收到的数据超出缓存区
|
||||
RX_ERROR_WRONG_ID, //接收到的设备ID与目标ID不符
|
||||
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;
|
||||
|
||||
typedef enum
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#include "modbus_rtu.h"
|
||||
|
||||
uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00}; //线圈寄存器
|
||||
uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00,0x00}; //离散量寄存器
|
||||
uint16_t InputReg[MAX_INPUT_REG_NUM] = {0x0000,0x0000,0x0000,0x0000}; //输入寄存器
|
||||
uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0, 0,0,0x00C8}; //保持寄存器
|
||||
uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0}; //线圈寄存器
|
||||
uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0}; //离散量寄存器
|
||||
uint16_t InputReg[MAX_INPUT_REG_NUM] = {0}; //输入寄存器
|
||||
uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0}; //保持寄存器
|
||||
|
||||
Var_Reg SamVarReg;
|
||||
eMBException ex_message = MB_EX_NONE; //从设备返回的异常信息
|
||||
|
|
|
@ -21,13 +21,17 @@ void modbus_rtu_master_init(void)
|
|||
mod_master.rx_flag = RX_NONE;
|
||||
mod_master.tx_flag = TX_NONE;
|
||||
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)
|
||||
{
|
||||
//先清空之前的发送数据
|
||||
memset(mod_master.data_tx, 0, sizeof(mod_master.data_tx));
|
||||
|
||||
mod_master.data_tx[0] = mod_master.target_id;
|
||||
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;
|
||||
|
||||
switch (mod_master.data_tx[1])
|
||||
|
@ -173,6 +177,11 @@ void modbus_rtu_master_load(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)
|
||||
{
|
||||
mod_master.rx_flag = TX_WAITING;
|
||||
|
@ -218,6 +227,14 @@ void modbus_rtu_master_analysis(void)
|
|||
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)
|
||||
{
|
||||
|
@ -242,6 +259,7 @@ void modbus_rtu_master_data_process(void)
|
|||
//【从站地址】【功能码】【返回字节数n】【字节1~n】【CRC16校验低】【CRC16校验高】
|
||||
case ReadCoilState:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||
{
|
||||
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校验高】
|
||||
case ReadDisInputState:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||
{
|
||||
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校验高】
|
||||
case ReadHoldReg:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||
{
|
||||
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校验高】
|
||||
case ReadInputReg:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != (mod_master.data_rx[2] + 5) )
|
||||
{
|
||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||
|
@ -326,6 +347,7 @@ void modbus_rtu_master_data_process(void)
|
|||
//【从站地址】【功能码】【地址高】【地址低】【标志位高】【标志位低】【CRC16校验低】【CRC16校验高】
|
||||
case WriteSingleCoil:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != 8 )
|
||||
{
|
||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||
|
@ -333,6 +355,14 @@ void modbus_rtu_master_data_process(void)
|
|||
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]);
|
||||
}
|
||||
|
@ -341,6 +371,7 @@ void modbus_rtu_master_data_process(void)
|
|||
//【从站地址】【功能码】【地址高】【地址低】【数据高】【数据低】【CRC16校验低】【CRC16校验高】
|
||||
case WriteSingleReg:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != 8 )
|
||||
{
|
||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||
|
@ -348,6 +379,14 @@ void modbus_rtu_master_data_process(void)
|
|||
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]);
|
||||
}
|
||||
|
@ -356,6 +395,7 @@ void modbus_rtu_master_data_process(void)
|
|||
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
|
||||
case WriteMultiCoil:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != 8 )
|
||||
{
|
||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||
|
@ -363,6 +403,14 @@ void modbus_rtu_master_data_process(void)
|
|||
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]);
|
||||
}
|
||||
|
@ -371,6 +419,7 @@ void modbus_rtu_master_data_process(void)
|
|||
//【从站地址】【功能码】【地址高】【地址低】【数量高】【数量低】【CRC16校验低】【CRC16校验高】
|
||||
case WriteMultiReg:
|
||||
{
|
||||
//应答数据报的长度是否正确
|
||||
if( mod_master.data_rx_len != 8 )
|
||||
{
|
||||
mod_master.rx_error_message = RX_ERROR_WRONG_LENGTH;
|
||||
|
@ -378,6 +427,14 @@ void modbus_rtu_master_data_process(void)
|
|||
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]);
|
||||
}
|
||||
|
@ -385,8 +442,8 @@ void modbus_rtu_master_data_process(void)
|
|||
|
||||
default:
|
||||
{
|
||||
mod_master.rx_error_message = RX_ERROR_WRONG_CMD;
|
||||
strcpy(mod_master.result_display, "ERROR: WRONG COMMAND");
|
||||
mod_master.rx_error_message = RX_ERROR_INVALID_CMD;
|
||||
strcpy(mod_master.result_display, "ERROR: INVALID COMMAND");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -434,89 +434,5 @@ void USART6_IRQHandler(void)
|
|||
}
|
||||
|
||||
/* 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 */
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -258,16 +258,6 @@
|
|||
<Ww>
|
||||
<count>20</count>
|
||||
<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>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue