diff --git a/c/set-protocol/ports/stm32f407-devboard-v1/README.md b/c/set-protocol/ports/stm32f407-devboard-v1/README.md index 83f56ef..1994902 100644 --- a/c/set-protocol/ports/stm32f407-devboard-v1/README.md +++ b/c/set-protocol/ports/stm32f407-devboard-v1/README.md @@ -11,7 +11,7 @@ CubeMX-проектом. Необработанные кадры передаю Слой приложения предоставляет callback-и чтения и записи. Нулевой DLC означает чтение; данные в кадре `HOLDING`/`COIL` — запись. За кадр передаются до четырёх -16-битных регистров или до шестнадцати coils. +16-битных регистров или до пятнадцати coils (предел 4-битного `RegCount`). ```c static set_devboard_v1_stm32f407_t gui_can; diff --git a/c/set-protocol/ports/stm32f407-devboard-v1/set_devboard_v1_stm32f407.c b/c/set-protocol/ports/stm32f407-devboard-v1/set_devboard_v1_stm32f407.c index 9f4a98d..af72ac5 100644 --- a/c/set-protocol/ports/stm32f407-devboard-v1/set_devboard_v1_stm32f407.c +++ b/c/set-protocol/ports/stm32f407-devboard-v1/set_devboard_v1_stm32f407.c @@ -1,22 +1,21 @@ #include "set_devboard_v1_stm32f407.h" -#include - static bool transmit(set_devboard_v1_stm32f407_t *port, const pcan_frame_t *frame) { - CAN_TxHeaderTypeDef header; + CAN_TxHeaderTypeDef header = {0}; uint32_t mailbox = 0U; uint8_t data[8] = {0U}; - memset(&header, 0, sizeof(header)); header.ExtId = frame->id & 0x1FFFFFFFUL; header.IDE = CAN_ID_EXT; header.RTR = ((frame->flags & PCAN_FLAG_RTR) != 0U) ? CAN_RTR_REMOTE : CAN_RTR_DATA; header.DLC = frame->dlc; header.TransmitGlobalTime = DISABLE; - memcpy(data, frame->data, frame->dlc); + for (uint8_t index = 0U; index < frame->dlc; ++index) { + data[index] = frame->data[index]; + } if (HAL_CAN_AddTxMessage(port->can, &header, data, &mailbox) != HAL_OK) { port->tx_errors++; return false; @@ -34,7 +33,7 @@ bool set_devboard_v1_stm32f407_init( if ((port == NULL) || (can == NULL)) { return false; } - memset(port, 0, sizeof(*port)); + *port = (set_devboard_v1_stm32f407_t){0}; port->can = can; port->unhandled = unhandled; port->unhandled_user = unhandled_user; @@ -65,7 +64,9 @@ size_t set_devboard_v1_stm32f407_poll(set_devboard_v1_stm32f407_t *port) request.flags |= PCAN_FLAG_RTR; } request.dlc = (header.DLC > 8U) ? 8U : (uint8_t)header.DLC; - memcpy(request.data, data, request.dlc); + for (uint8_t index = 0U; index < request.dlc; ++index) { + request.data[index] = data[index]; + } result = pcan_modbus_server_handle(&port->server, &request, &response); if (result == PCAN_MODBUS_RESPONSE) {