stm32 - 带地址标记检测的 STM32 UART 多处理器模式。预期的数据字节被解释为地址字节
问题描述
我已将 UART 配置为通过 RS485 进行多处理器通信。我可以正确接收和传输数据。唤醒后(RWU=0)当接收到正确的地址后,后续字节应该正常接收,而不是解释为另一个地址是我的理解。但是,如果预期的数据字节包含一个“1”作为 MSB,则它被解释为一个地址。现在从文档中可以清楚地看出这是正确的行为,但是在接收到正确的地址后(RWU 设置为 0,RXNE 设置为 1,通过调试确认)我只能接收值小于定义地址的数据。例如,如果我将字长设置为 9 位,地址设置为 4,则正确的地址将是预期的 132(10000100)(我认为在这种情况下地址长度为 8 位,因为设置了 ADDM7)。但后续字节仍被解释为地址。发送 132,55,45,150(通过 RealTerm)只会收到 132,55,45,因为 132 是正确的地址,而 44,55 的 MSB 为“0”。150 被解释为新地址,因为 MSB 中的“1”和 RWU 再次设置为 1,因为它是不正确的地址,我无法再接收数据。
我的问题是,在我再次回去监听地址之前,如何将正确地址之后的后续字节解释为纯数据字节?如果我理解正确,RWU 和 RXNE 是由硬件在这种模式下设置的?或者我应该在 FW 中做些什么具体的事情?我的实现目前是基于中断的。我使用的MCU是F303K8。
我将附上一些图片、代码和文档以获取详细信息和清晰度。
谢谢!
代码和调试:
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, (uint8_t*)rx_buffer, BUFSIZE) != HAL_OK){
Error_Handler();
}
}
解决方案
推荐阅读
- angular - 角材料表不显示任何数据
- javascript - Node.js Multer“.array 不是函数”
- airflow - 气流本地执行程序未运行 Dags
- java - 如何创建没有此错误的包?
- android - 如何在两个活动之间发送数据
- android-studio - 如何在android中使用按钮关闭应用程序
- hyperledger-fabric - 无法下载最新的超级账本结构二进制文件
- jquery - 我希望文本在页面加载时同时执行一种淡入淡出和 .slideDown
- azure - 从网页调用 API 失败,但在测试页面中成功
- python - 使用 Python 将 mp4 AAC 转换为 AVC