首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 - RS485请求-响应

STM32 - RS485请求-响应
EN

Stack Overflow用户
提问于 2018-04-20 23:07:37
回答 2查看 2.8K关注 0票数 2

我正在尝试向测量设备发送请求,并使用带中断的UART接收它的响应。然而,通信不稳定,我收到了不完整或损坏的响应。我不确定,但我认为这是因为切换驱动器使能信号。你能看看我的代码并给我一些建议吗?我哪里做错了?

下面是我的代码:

代码语言:javascript
复制
int main(void){

HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART3_UART_Init();  

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);               //RS 485 transmit mode

while (1)
{

        if(HAL_UART_Transmit_IT(&huart3, (uint8_t*)aTxBuffer, 2) != HAL_OK)
        {
            while(1);
        }
        while (UartReady != SET);
        UartReady = RESET;
        if(HAL_UART_Receive_IT(&huart3, (uint8_t*)aRxBuffer, 4) != HAL_OK)
        {
            while(1);
        }
        while (UartReady != RESET);
        //do somethink with received data
          }
}

下面是我的回调函数:

代码语言:javascript
复制
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/* Set transmission flag: transfer complete */
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);     //RS 485 receive mode
//DataRecieved = 0;
UartReady = SET;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/* Set transmission flag: transfer complete */
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);       //RS 485 transmit mode
//DataRecieved = 1;
UartReady = SET;
}

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2018-05-15 17:11:55

你传输的数据,是否也会出现在你的RX-buffer中,而你并不期望它会出现?

票数 0
EN

Stack Overflow用户

发布于 2018-05-21 17:30:31

我收到不完整或损坏的响应。我不确定,但我认为这是因为切换驱动器使能信号。你能看看我的代码并给我一些建议吗?我哪里做错了?

不确定,但也许在中断回调函数中切换DE引脚会有所帮助,而是在调用HAL_UART_Transmit_IT()之前切换到“传输模式”,然后在传输之后切换回接收模式,甚至在调用HAL_UART_Receive_IT()之后切换回接收模式,以确保它能够捕获传入的字节。微小的延迟有时确实很重要:

代码语言:javascript
复制
void set_transmit_mode(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);  // RS 485 transmit mode
}

void set_receive_mode(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); // RS 485 receive mode
}

{
    //...
    set_transmit_mode();
    if (HAL_UART_Transmit_IT(&huart3, (uint8_t*)aTxBuffer, 2) != HAL_OK) {
       // ...
    }
    while (UartReady != SET);
    //set_receive_mode();
    UartReady = RESET;
    if (HAL_UART_Receive_IT(&huart3, (uint8_t*)aRxBuffer, 4) != HAL_OK) {
        // ...
    }
    set_receive_mode();
    while (UartReady != RESET);
    //...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49944685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档