我已将 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();
}
}