RT-Thread 应用笔记 - 不正确使用LOG也会引发hard fault
RT-Thread 应用笔记 - RTC Alarm 组件的使用
RT-Thread 应用笔记 - freemodbus RTU RS485 从机
RT-Thread 应用笔记 - freemodbus RTU RS485 主机
RT-Thread 应用笔记 - libmodbus RTU RS485 从机
RT-Thread 应用笔记 - libmodbus RTU RS485 主机
RT-Thread 应用笔记 - STM32 CAN 通信双机
#include <rtthread.h>
#include <board.h>
#include "modbus.h"
#define RS485_RE GET_PIN(A, 8) //RS485控制引脚
static void mb_slave_thread(void *param)
{
modbus_t *ctx = RT_NULL;
int rc = 0;
modbus_mapping_t *mb_mapping = NULL; /* 线圈与寄存器 */
uint8_t mb_reply[MODBUS_TCP_MAX_ADU_LENGTH];
ctx = modbus_new_rtu("/dev/uart3", 115200, 'N', 8, 1); /* uart3 */
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP);
modbus_set_slave(ctx, 3); /* 设置从机地址 */
mb_mapping = modbus_mapping_new(16, 16, 10, 10);
if (mb_mapping == RT_NULL)
{
rt_kprintf("modbus_mapping_new failed! \n");
modbus_free(ctx);
return;
}
mb_mapping->tab_registers[0] = 'R';
mb_mapping->tab_registers[1] = 'T';
mb_mapping->tab_registers[2] = '-';
mb_mapping->tab_registers[3] = 'T';
mb_mapping->tab_registers[4] = 'h';
mb_mapping->tab_registers[5] = 'r';
mb_mapping->tab_registers[6] = 'e';
mb_mapping->tab_registers[7] = 'a';
mb_mapping->tab_registers[8] = 'd';
modbus_connect(ctx);
while (1)
{
//modbus loop
rc = modbus_receive(ctx, mb_reply);
if (rc > 0)
{
modbus_reply(ctx, mb_reply, rc, mb_mapping);
}
else if (rc == -1)
{
/* Connection closed by the client or error */
break;
}
}
modbus_close(ctx);
modbus_free(ctx);
}
static int rtu_test_init(void)
{
rt_pin_mode(RS485_RE, PIN_MODE_OUTPUT);
rt_thread_t tid;
tid = rt_thread_create("mb_test",
mb_slave_thread, RT_NULL,
2048,
12, 10);
if (tid != RT_NULL)
rt_thread_startup(tid);
return RT_EOK;
}
INIT_APP_EXPORT(rtu_test_init);
这里修改:stm32f1xx_hal_msp.c
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
else if (huart->Instance==USART3)
{
__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**USART3 GPIO Configuration
PB10 ------> USART3_TX
PB11 ------> USART3_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
https://gitee.com/zhangsz0516/rtt_stm32_libmodbus
按照你这个,为什么slave能接收到 <3><3><0><0><0><14><44><27> ,但是reply给master,master接收不到?
后面打开slave debug,有一个Illegal data address 0x14 in read_registers,这个是怎么回事,是不是配置没有配正确?
打开master debug ,有一个ERROR CRC received 0x4079 != CRC calculated 0x6462 的错误信息
@how0723 烧写了我的例程,不能正常通信?
@张世争 是的,烧写了你的例程,不能正常通信,我用的是/dev/uart2
@how0723 软件调试看看什么情况吧,先排除硬件干扰。
搞好了,的确是硬件问题,换了一块板子就好了,什么都没改 @张世争