微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

STM32 UART 多处理器模式,带地址标记检测预期的数据字节被解释为地址字节

如何解决STM32 UART 多处理器模式,带地址标记检测预期的数据字节被解释为地址字节

我已将 UART 配置为通过 RS485 进行多处理器通信。我可以正确接收和传输数据。唤醒后(RWU=0)当接收到正确的地址时,后续字节应该可以正常接收,而不是解释为另一个地址是我的理解。但是,如果预期的数据字节包含“1”作为 MSB,则它被解释为地址。现在从文档中可以清楚地看出这是正确的行为,但是在接收到正确的地址后(RWU 设置为 0,RXNE 设置为 1,通过调试确认)我只能接收值小于定义地址的数据。例如,如果我将字长设置为 9 位,地址设置为 4,那么正确的地址将是预期的 132 (10000100)(我认为在这种情况下地址长度为 8 位,因为设置了 ADDM7)。但后续字节仍被解释为地址。发送 132,55,45,150(通过 RealTerm)只会收到 132,45,因为 132 是正确的地址,而 44,55 的 MSB 为“0”。 150 被解释为新地址,因为 MSB 中的“1”和 RWU 再次设置为 1,因为它是不正确的地址,我无法再接收数据。

我的问题是,在我再次返回侦听地址之前,如何将正确地址之后的后续字节解释为纯数据字节?如果我理解正确,RWU和RXNE在这种模式下是由HW设置的?或者我应该在 FW 中做些什么?我的实现目前是基于中断的。 我用的单片机是F303K8。

我会附上一些图片代码和文档,以确保细节和清晰度。

谢谢!

参考手册:

reference_manual1

reference_manual2

代码和调试:

int main(void)
{
  /* USER CODE BEGIN 1 */
  testvar = testvar + 1;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals,Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  HAL_UART_Transmit(&huart1,(uint8_t*)test,strlen(test),100);

  HAL_MultiProcessor_EnableMuteMode(&huart1);
  HAL_MultiProcessor_EnterMuteMode(&huart1);

  /* Listen for address */
  if(HAL_UART_Receive_IT(&huart1,(uint8_t*)rx_buffer,BUFSIZE) != HAL_OK){
      Error_Handler();
  }
  //HAL_MultiProcessor_EnterMuteMode(&huart1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

      //HAL_Delay(500);
      //testvar = testvar + 1;

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //testvar = 64;

    /* ADDRESS received! Begin listening for data(COMMANDS)
     * When Cmds handled,enter mute mode again in order to listen for address byte again */

    if(HAL_UART_Receive_IT(&huart1,BUFSIZE) != HAL_OK){
      Error_Handler();
    }

}

code and debug

示波器:

oscilloscope

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?