野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18702|回复: 7

串口无法通信

[复制链接]
发表于 2018-3-29 20:06:09 | 显示全部楼层 |阅读模式
最近调试串口的时候突然发现一个问题:由于之前调试串口都是直接把串口的USB连接上电脑,打开串口调试助手,然后才开始调试的,这种情况下程序跑的很顺利。但是,又一次我没有把串口的USB连接上电脑就直接开始跑程序,什么都没做,程序就直接跑进串口的中断,然后出不来了,这个时候再插上USB也出不来中断。更令我吃惊的是,只要插上了USB,哪怕我的串口调试助手没有打开串口,程序也跑的很好。。。。
捣鼓了半天,实在想不明白,所以想请教一下各位,谢谢大家了。

下面是中断程序的代码:
//串口中断服务函数
void USART1_IRQHandler (void)
{

        if(USART_GetITStatus(USART1,USART_IT_ORE)!=RESET)
        {               
                usart_read = USART_ReceiveData(USART1);
                USART_ClearITPendingBit(USART1,USART_IT_ORE);
  }
       
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {               
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                usart_read_f[num] = USART_ReceiveData(USART1);
                Usart_SendByte( USART1, usart_read_f[num]);
                        num++;
                if(num==8)
                {
                        for(i=0;i<8;i++){
                        DealMODBUSData(usart_read_f[i]);        //modbus的处理程序
                        }
                       
                        num=0;
                }
        }         
       
}




回复

使用道具 举报

发表于 2018-3-30 08:39:50 | 显示全部楼层
可能有些信号窜过去了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-30 10:00:31 | 显示全部楼层
鲁合乐 发表于 2018-3-30 08:39
可能有些信号窜过去了

现在有测试了一下,在没有连接USB的情况下,程序一直进入中断,但是在两个if判断的时候又不进入if语句里面,说明应该没有串口的数据输入才对呀,请问您有可行的解决方法吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-30 10:10:54 | 显示全部楼层
就是说只要没连接USB,程序就会一直触发串口中断,并且串口的接收数据标志位以及发送数据标志位都是RESET
回复 支持 反对

使用道具 举报

发表于 2018-3-30 11:31:29 | 显示全部楼层
串口引脚输出类型配置对没有。
回复 支持 反对

使用道具 举报

发表于 2018-3-30 11:32:13 | 显示全部楼层
说错了 是RX引脚
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-30 16:25:39 | 显示全部楼层
浪费 发表于 2018-3-30 11:32
说错了 是RX引脚

串口初始化函数如下,麻烦您帮忙看一下:(如果这个配置错了,应该插上USB也没用吧)
void USART_Config(void)//串口初始化函数
  {  

        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
               
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
               
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_7);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_7);        
        /*
        *  USART1_TX -> PA6 , USART1_RX ->        PA7
        */                                
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);        
        
        USART_InitStructure.USART_BaudRate = 115200;//设置串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//设置效验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置工作模式
        USART_Init(USART1, &USART_InitStructure); //配置入结构体
                               
                        // 串口中断优先级配置
                                NVIC_Configuration();
                               
                        /* USART1中断允许************************************************/
                                USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
                                USART_ITConfig(USART1,USART_IT_ERR,ENABLE);

        USART_Cmd(USART1, ENABLE);//使能串口1
                               


                }
回复 支持 反对

使用道具 举报

发表于 2018-3-31 15:29:43 | 显示全部楼层
你这个是f103吗
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 01:03 , Processed in 0.051191 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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