diff --git a/components/modbus/modbus_client.cpp b/components/modbus/modbus_client.cpp index 6a62969..647e59b 100644 --- a/components/modbus/modbus_client.cpp +++ b/components/modbus/modbus_client.cpp @@ -6,10 +6,10 @@ #include "sdk\os\delay.hpp" using namespace iflytop; -static uint8_t modbus_rx_buf[256]; -static uint8_t modbus_tx_buf[256]; +static uint8_t modbus_rx_buf[255]; +static uint8_t modbus_tx_buf[255]; static bool modbus_rx_is_ready = false; -static int modbus_rx_size = 256; +static int modbus_rx_size = 0; static void modbux_tx(uint8_t* rx, uint16_t len) { ModulebusClient::Inst()->sendpacket(rx, len); } static void modbux_process_rx(modbus_processer_context_t* context) { ModulebusClient::Inst()->process_rx_packet(context); } @@ -36,7 +36,7 @@ void ModulebusClient::init(ZIUartReceiver* receiver, ZIUartSender* sender, int d receiver->startRx([this](uint8_t* data, size_t len) { // if (modbus_rx_is_ready) return; - if (len > 256) return; + if (len > 255) return; memcpy(modbus_rx_buf, data, len); modbus_rx_size = len; modbus_rx_is_ready = true; diff --git a/components/modbus/modbus_processer.hpp b/components/modbus/modbus_processer.hpp index 1a7b51f..abc54c7 100644 --- a/components/modbus/modbus_processer.hpp +++ b/components/modbus/modbus_processer.hpp @@ -12,10 +12,10 @@ typedef struct modbus_processer { uint8_t modbus_device_id; // default 0x01; uint8_t* modbus_processer_rx_buf; - int modbus_processer_rx_buf_size; // + uint8_t modbus_processer_rx_buf_size; // uint8_t* modbus_processer_tx_buf; - int modbus_processer_tx_buf_size; // + uint8_t modbus_processer_tx_buf_size; // /*************************************/ void (*tx)(uint8_t* rx, uint16_t len); diff --git a/components/sub_modbus_module/sub_modbus_board_initer.cpp b/components/sub_modbus_module/sub_modbus_board_initer.cpp new file mode 100644 index 0000000..23570b9 --- /dev/null +++ b/components/sub_modbus_module/sub_modbus_board_initer.cpp @@ -0,0 +1,63 @@ +#include "sub_modbus_board_initer.hpp" + +// +#include +#include + +#include "project_configs.h" + +using namespace iflytop; +#define TAG "main" + +extern DMA_HandleTypeDef PC_DEBUG_UART_DMA_HANDLER; +extern DMA_HandleTypeDef PC_MODBUS_UART_DMA_HANDLER; + +class UARTSender : public ZIUartSender { + UART_HandleTypeDef* m_huart; + + public: + void init(UART_HandleTypeDef* huart) { m_huart = huart; } + virtual void send(const uint8_t* data, size_t len) { HAL_UART_Transmit(m_huart, (uint8_t*)data, len, 1000); } +}; + +void SubModbusBoardIniter::init(int deviceId, // + function subModuleIniter, // + on_reg_read_t regreadcb, // + on_reg_write_t regwritecb) { + chip_cfg_t chipcfg = {}; + chipcfg.us_dleay_tim = &PC_SYS_DELAY_US_TIMER; + chipcfg.tim_irq_scheduler_tim = &PC_SYS_TIM_IRQ_SCHEDULER_TIMER; + chipcfg.huart = &PC_DEBUG_UART; + chipcfg.debuglight = PC_DEBUG_LIGHT_GPIO; + + chip_init(&chipcfg); + + zos_cfg_t zoscfg; + zos_init(&zoscfg); + + ZLOGI(TAG, "boardId:%d", deviceId); + + if (subModuleIniter) { + subModuleIniter(); + } + + static ZUARTDmaReceiver dmaUartReceiver; + static ZUARTDmaReceiver::hardware_config_t cfg = { + .huart = &PC_MODBUS_UART, + .dma_rx = &PC_MODBUS_UART_DMA_HANDLER, + .rxbuffersize = PC_MODBUS_UART_RX_BUF_SIZE, + .rxovertime_ms = 1, + }; + dmaUartReceiver.initialize(&cfg); + + static UARTSender uartSender; + uartSender.init(&PC_MODBUS_UART); + + ModulebusClient::Inst()->init(&dmaUartReceiver, &uartSender, deviceId, regreadcb, regwritecb); +} +void SubModbusBoardIniter::loop() { + while (true) { + OSDefaultSchduler::getInstance()->loop(); + ModulebusClient::Inst()->loop(); + } +} diff --git a/components/sub_modbus_module/sub_modbus_board_initer.hpp b/components/sub_modbus_module/sub_modbus_board_initer.hpp new file mode 100644 index 0000000..e748380 --- /dev/null +++ b/components/sub_modbus_module/sub_modbus_board_initer.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "sdk/os/zos.hpp" +#include "sdk\components\cmdscheduler\cmd_scheduler_v2.hpp" +#include "sdk\components\hardware\uart\zuart_dma_receiver.hpp" +#include "sdk\components\zcancmder\zcan_board_module.hpp" +#include "sdk\components\zcancmder\zcanreceiver.hpp" +#include "sdk\components\zprotocol_helper\micro_computer_module_device_script_cmder_paser.hpp" +#include "sdk\components\zprotocols\zcancmder_v2\protocol_event_bus_sender.hpp" +#include "sdk\components\zprotocols\zcancmder_v2\protocol_parser.hpp" +#include "sdk\components\zprotocols\zcancmder_v2\zmodule_device_manager.hpp" +// +#include "sdk\components\modbus\modbus_client.hpp" + +namespace iflytop { + +class SubModbusBoardIniter { + public: + void init(int deviceId, // + function subModuleIniter, // + on_reg_read_t regreadcb, // + on_reg_write_t regwritecb); + void loop(); + + private: +}; +} // namespace iflytop \ No newline at end of file