qq_39801835
2020-05-21 17:50
采纳率: 100%
浏览 241

想用stm32开发板的485发送modbus,输出不对,怎么解决,为什么

我是根据硬石开发板的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
  //  }

  }
}
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题