我是根据硬石开发板的YSF4_HAL_Modbus_002. 基于RS232&RS485的Modbus主机例程改的程序
因为要发送
我就直接改变bsp_mb_host.c文件中
void MB_ReadHoldingReg_03H()
{
uint16_t TxCount = 0;
uint16_t crc = 0;
Tx_Buf[TxCount++] = 0x01; /* 从站地址 */
Tx_Buf[TxCount++] = 0x03; /* 功能码 */
Tx_Buf[TxCount++] = 0x00; /* 寄存器地址 高字节 */
Tx_Buf[TxCount++] = 0x00; /* 寄存器地址 低字节 */
Tx_Buf[TxCount++] = 0x00; /* 寄存器(16bits)个数 高字节 */
Tx_Buf[TxCount++] = 0x02;
crc = MB_CRC16((uint8_t*)&Tx_Buf,TxCount);
Tx_Buf[TxCount++] = crc>>8; /* crc 高字节 */
Tx_Buf[TxCount++] = crc; /* crc 低字节 */
UART_Tx((uint8_t *)&Tx_Buf,TxCount);
}
的程序的值,希望能通过485串口发送出0x01,0x03,0x00,0x00,0x00,0x02,0xc4,0x0b
但是我将485通过转接口直接接到电脑上通过助手查看数值时发现发送的数据不对。
主函数
int main(void)
{
/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
/* 初始化串口并配置串口中断优先级 */
MX_DEBUG_USART_Init();
/* 定时器初始化 */
GENERAL_TIMx_Init();
/* LED初始化 */
// LED_GPIO_Init();
/* 使能定时器中断 */
__HAL_TIM_ENABLE_IT(&htimx,TIM_IT_CC1);
__HAL_TIM_ENABLE_IT(&htimx,TIM_IT_UPDATE);
/* 设置字符间超时时间1.5个字符的时间 */
__HAL_TIM_SET_COMPARE(&htimx,TIM_CHANNEL_1,(uint16_t)OVERTIME_15CHAR);
/* 设置帧间超时时间3.5个字符的时间 */
__HAL_TIM_SET_AUTORELOAD(&htimx,(uint16_t)OVERTIME_35CHAR); // 设置帧内间隔时间
Rx_MSG = MSG_IDLE;
/* 无限循环 */
while (1)
{
// if(KEY4_StateRead()==KEY_DOWN)
// {
// Rx_MSG = MSG_IDLE;
/* 读取reg_addr 的寄存器状态 */
MB_ReadHoldingReg_03H();
/* 等待从机响应 */
WaitTimeOut(); //等待时间大概为200ms
// }
}
}