ESP32 S3 MB_MASTER示例代码分析

Function call relation:
Note that, The Free RTOS function is not pursued

void app_main(void)
	ESP_ERROR_CHECK(master_init());
		esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler);
			error = mbc_serial_master_create(&port_handler);
				mbm_interface_ptr = malloc(sizeof(mb_master_interface_t));
				vMBPortSetMode((UCHAR)MB_PORT_SERIAL_MASTER);
			mbc_master_init_iface(port_handler);
		err = mbc_master_setup((void*)&comm);
			error = master_interface_ptr->setup(comm_info);
	    err = uart_set_pin(MB_PORT_NUM, CONFIG_MB_UART_TXD, CONFIG_MB_UART_RXD,
                             CONFIG_MB_UART_RTS, UART_PIN_NO_CHANGE);
        err = mbc_master_start();
        	error = master_interface_ptr->start();
        err = mbc_master_set_descriptor(&device_parameters[0], num_device_parameters);
        	error = master_interface_ptr->set_descriptor(descriptor, num_elements);
	master_operation_func(NULL);
		err = mbc_master_get_cid_info(cid, &param_descriptor);
			error = master_interface_ptr->get_cid_info(cid, param_info);
			void* temp_data_ptr = master_get_param_data(param_descriptor);
		err = mbc_master_set_parameter(cid, (char*)param_descriptor->param_key,
                                      (uint8_t*)temp_data_ptr, &type);
	        error = master_interface_ptr->set_parameter(cid, name, value, type);     
            
	

	
  1. esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler);
    第一个参数是一个枚举,表示接口的类型,第二个参数是一个导出句柄的指针,这函数只实现了MB_PORT_SERIAL_MASTER,这个参数到mbc_master_init内部就没有继续传递了。

error = mbc_serial_master_create(&port_handler);
这个函数中申请了一个接口结构体的内存,然后开始操作其中的元素mbm_interface_ptr->opts,这给元素是个结构体,包含了接口类型(MB_PORT_SERIAL_MASTER,MB_PORT_SERIAL_SLAVE,MB_PORT_TCP_MASTER,etc),等通讯信息。这个结构体最终会被形参传递到函数外面。
mbc_master_init_iface 将mbm_interface_ptr结构体传递给了master_interface_ptr。最终mbm_interface_ptr传递给了handler,其中接口如下:

mbm_interface_ptr->init = mbc_serial_master_create;//指向它自己
mbm_interface_ptr->destroy = mbc_serial_master_destroy;
mbm_interface_ptr->setup = mbc_serial_master_setup;
mbm_interface_ptr->start = mbc_serial_master_start;
mbm_interface_ptr->get_cid_info = mbc_serial_master_get_cid_info;
mbm_interface_ptr->get_parameter = mbc_serial_master_get_parameter;
mbm_interface_ptr->send_request = mbc_serial_master_send_request;
mbm_interface_ptr->set_descriptor = mbc_serial_master_set_descriptor;
mbm_interface_ptr->set_parameter = mbc_serial_master_set_parameter;

mbm_interface_ptr->master_reg_cb_discrete = eMBRegDiscreteCBSerialMaster;
mbm_interface_ptr->master_reg_cb_input = eMBRegInputCBSerialMaster;
mbm_interface_ptr->master_reg_cb_holding = eMBRegHoldingCBSerialMaster;
mbm_interface_ptr->master_reg_cb_coils = eMBRegCoilsCBSerialMaster;
  1. comm 中设置的是串口相关的参数,例如波特率,串口号。mbc_master_setup检查完串口参数是否合法后又传递给了master_interface_ptr->setup(也就是mbc_serial_master_setup)
  2. master_interface_ptr 通过CID得到一个param_descriptor,master_get_param_data在这个函数中,通过param_descriptor结构体中的type和offset得到不同type相对于对应结构体中的数据。例如 case MB_PARAM_HOLDING:
    instance_ptr = ((void*)&holding_reg_params + param_descriptor->param_offset - 1);
    break;

是指得到holding_reg_params 中偏移param_descriptor->param_offset - 1的数据,这个数据是MB_PARAM_HOLDING
当修改好获取到的instance_ptr 后,通过mbc_master_set_parameter写回去。

也就是说master_get_param_data是接收接口,mbc_master_set_parameter是发送接口在master中,使用Key和Cid区分是谁发的指令,读到的是谁的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值