OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2401|回复: 3

关于STM32F103上移植freemodbus后加流控出现掉包的问题

[复制链接]

3

主题

15

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-11-5
在线时间
19 小时
发表于 2023-7-4 00:37:52 | 显示全部楼层 |阅读模式
用的是stm32f103cbt6. hal库

移植了freemodbus从机协议,用modbus poll调试,通信没有问题,没有出现掉包(timeout error)问题。

然后在我们自己的PCB板上跑,PCB板和开发板的区别就是多加了一个modbus收发流控。用modbus poll测试发现通信能连上但掉包很严重,大概100包掉25包左右。


可以帮忙看看是什么情况吗?

附上部分代码。
流控引脚的初始化:
#define FlowControl_GPIO_PORT                  GPIOA
#define FlowControl_GPIO_PIN                   GPIO_PIN_15
#define FlowControl_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)             /* PA¿ÚʱÖÓʹÄÜ */
void Flow_Control_Init(void)
{
                __HAL_RCC_AFIO_CLK_ENABLE();
                __HAL_AFIO_REMAP_SWJ_NOJTAG();
    GPIO_InitTypeDef gpio_init_struct;
                FlowControl_GPIO_CLK_ENABLE();
                //flow control A15
    gpio_init_struct.Pin = FlowControl_GPIO_PIN;                   /* PA15Òý½Å */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* ÍÆÍìÊä³ö */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* ÉÏÀ­ */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* ¸ßËÙ */
    HAL_GPIO_Init(FlowControl_GPIO_PORT, &gpio_init_struct);       /* ³õʼ»&#175A15Òý½Å */

                HAL_GPIO_WritePin(FlowControl_GPIO_PORT, FlowControl_GPIO_PIN, GPIO_PIN_RESET) ;
}


//portserial的代码
void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
                if (xRxEnable)                                                                                                                        //????????modbus????,??????????????
                        {
                        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET) ;
                                __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);        //??????2,??&huart2
                        }
                else
                        {
                                __HAL_UART_DISABLE_IT(&huart2,UART_IT_RXNE);
                        }
                if (xTxEnable)
                        {
                                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET) ;       
                                __HAL_UART_ENABLE_IT(&huart2,UART_IT_TXE);
                        }
                else
                        {
                                __HAL_UART_DISABLE_IT(&huart2,UART_IT_TXE);
                        }       
}

各位大佬帮帮忙!十分感谢!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

446

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4133
金钱
4133
注册时间
2018-5-14
在线时间
902 小时
发表于 2023-7-4 13:14:53 | 显示全部楼层

回帖奖励 +10 金钱

流控关的不应该是中断,而且关闭接收使能。其次GPIO的控制都应该在Tx中,Tx结束应当立即拉低IO进入接收模式
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-11-5
在线时间
19 小时
 楼主| 发表于 2023-7-4 15:55:37 | 显示全部楼层
姚先起 发表于 2023-7-4 13:14
流控关的不应该是中断,而且关闭接收使能。其次GPIO的控制都应该在Tx中,Tx结束应当立即拉低IO进入接收模式

感谢大佬。 您的第一句是指?哪里需要修改呢?
第二个的话,你建议是改成下面这个样子吗
//portserial的代码
void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
                if (xRxEnable)                                                                                                                       
                        {
                        
                                __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);        //??????2,??&huart2
                        }
                else
                        {
                                __HAL_UART_DISABLE_IT(&huart2,UART_IT_RXNE);
                        }
                if (xTxEnable)
                        {
                                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET) ;      //send
                                __HAL_UART_ENABLE_IT(&huart2,UART_IT_TXE);
                        }
                else
                        {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET) ; //receive
                                __HAL_UART_DISABLE_IT(&huart2,UART_IT_TXE);
                        }      
}
回复 支持 反对

使用道具 举报

2

主题

446

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4133
金钱
4133
注册时间
2018-5-14
在线时间
902 小时
发表于 2023-7-4 17:00:23 | 显示全部楼层
kzc 发表于 2023-7-4 15:55
感谢大佬。 您的第一句是指?哪里需要修改呢?
第二个的话,你建议是改成下面这个样子吗
//portserial ...

打开发送
USART->CR1|=USART_CR1_TXE
USART->CR1&=~USART_CR1_RXE
打开接收
USART->CR1|=USART_CR1_RXE
USART->CR1&=~USART_CR1_TXE

有的总线TX RX内部短接的,用关中断是不行的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 06:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表