OpenEdv-开源电子网

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

UART2和UART3的串口接收中断和串口发送中断异常

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-10-21
在线时间
8 小时
发表于 2020-1-12 12:41:01 | 显示全部楼层 |阅读模式
5金钱
要实现一个串口通信功能,流程为监听UART3是否有数据传过来(接收中断),若有则在中断处理中对UART3接收标志位置1,此时对接收到的数据进行处理以获得缓存数组,然后将该缓存数组通过UART2(发送中断)发送出来,此时实时监听是否获取到UART2的串口数据,若有则将获取到的数据通过UART3发送出来(发送中断)。其中UART2作为485串口通信。

现在的情况是,UART3能够正常收到串口数据,并执行到UART2的发送步骤,但UART2在发送过程中:1、发送数据不全,例如设置要发送8字节的缓存数组,实际只发送了2字节的数据;2、只能对第一次接收的数据进行转换发送,后续接收到的数据都不能再发送,我怀疑是有其他中断打断了UART2的发送过程。下面是主要代码:

代码主体是通过CUBEMX自动生成的,包括HAL_Init();、SystemClock_Config();、MX_GPIO_Init();,以及正点原子的相关初始化程序delay_init(180);、KEY_Init();、RS485Init(); 我对RS485Init()进行了调整,以符合实际情况:
void RS485Init(void)
{
    PCF8574_Init();                                                         //初始化PCF8574,用于控制RE脚
    MX_USART2_UART_Init();                                                                    //初始化USART2
    MX_USART3_UART_Init();                                                                    //初始化USART3
    RS485_MODE_Set(0);                                               //设置为接收模式
}
然后在进入死循环前,调用HAL_UART_Receive_IT(&huart3,Rx_Buf2,8);以开启UART3的接收中断。

下面进入死循环(只把U3-U2部分的内容放出来):
while (1)
  {
        if(rx_flag_U3)                                                                                //UART3收到信息标志,在接收中断回调函数中置1
        {
            uart_U3toU2(Rx_Buf2);
            HAL_UART_Receive_IT(&huart3,Rx_Buf2,8);
        }
}

void uart_U3toU2(uint8_t *pData)
{
if(pData[0] == 0x0A)
    {
        for(i=0;i<4;i++)
        {
            trans_buffer[0]=slav_num[i];
            trans_buffer[1]=pData[1];
            trans_buffer[2]=pData[2];
            trans_buffer[3]=pData[3];
            trans_buffer[4]=0x00;
            trans_buffer[5]=0x02;
            CRC_value = CRC_Chek((uint8_t*)&trans_buffer,6);                            //计算CRC值
            trans_buffer[6]=(uint8_t)CRC_value;                                                        //CRC高8位
            trans_buffer[7]=(uint8_t)(CRC_value>>8);   
            delay_ms(10);
            RS485_MODE_Set(1);                                                                                        //设置为发送模式
            HAL_UART_Transmit_IT(&huart2,trans_buffer,8);                                    //串口2发送数据
            while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);                //等待发送完成
            RS485_MODE_Set(0);                                                                                        //设置为接收模式
            BEEP();
            HAL_UART_Receive_IT(&huart2,Rx_Buf1,9);                                                //串口2接收使能,接收长度为9字节
            delay_ms(10);                                                                                                    //延时10ms作为结束
        }
    for(j=0;j<50;j++){trans_buffer[j]=0;pData[j]=0;}
    }

}

我这边UART3以100ms的间隔时间持续不断发送14帧串口数据过来,每2s循环一次,例如以100ms的间隔时间发送14帧“0A 01 03 04 00 00 00 00”,每2s重复发送上述14帧数据。
STM32这边监控到每帧数据都能够被接收到,但只有接收到的第一帧数据能够进入上述数据转换/发送的程序(即蜂鸣器会响4次),之后的所有数据都无法发送出去,但能听到蜂鸣器有声音但声音很微弱的响声,应该是执行了上述转换/发送程序的,但是问题来了:
1、串口软件监控显示,第一帧发出来的数据全都不正常,例如为“01 01 FB” “02 01 FB” “03 01 FB” “04 01 FB”;
2、后续就再也没有数据发送出来了,即实际没有执行数据发送函数????

请各位大神帮我看下啊,哪里有问题,谢谢了!!!


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-1-13 03:02:10 | 显示全部楼层
建议仿真看看吧,看看到底是给串口2的数据少了,还是发送出问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-10-21
在线时间
8 小时
 楼主| 发表于 2020-1-13 15:13:03 来自手机 | 显示全部楼层
正点原子 发表于 2020-1-13 03:02
建议仿真看看吧,看看到底是给串口2的数据少了,还是发送出问题了。

仿真过了,给的数据没少,看到在发送函数里只进入执行了三次就没执行了,不知道什么原因,我觉得可能是中途有别的中断把发送程序打断了,但不知道怎么看有没有别的中断在同时执行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-1-14 02:53:13 | 显示全部楼层
anshiqiangzhe 发表于 2020-1-13 15:13
仿真过了,给的数据没少,看到在发送函数里只进入执行了三次就没执行了,不知道什么原因,我觉得可能是中 ...

继续仿真找问题吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-10-21
在线时间
8 小时
 楼主| 发表于 2020-1-18 00:48:33 来自手机 | 显示全部楼层
正点原子 发表于 2020-1-14 02:53
继续仿真找问题吧

已经找到问题了,主要是stm32连续收发间隔时间太短好像会出问题,还有就是我可能主函数里频繁调用接收和发送中断。我重新写了代码后问题解决了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-11 08:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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