硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6375|回复: 3
收起左侧

[有问必答] 串口接收中断进不去问题

[复制链接]

25

主题

136

回帖

211

积分

高级会员

积分
211
发表于 2016-11-2 10:53:12 | 显示全部楼层 |阅读模式
在V5开发板出厂程序进行修改的程序,串口配置基本一样。
但是有一个奇怪的现象:当主循环里每秒执行一次串口发送时,串口接收中断正常;如果主循环里没用串口发送程序,就不能接收数据,进不了串口接收中断。
void USART1_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    /* 串口1 TX = PC10   RX = PC11 */

    /* 打开 GPIO 时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    /* 打开 UART 时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
   
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

    /* 配置 USART Tx 为复用功能 */
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    /* 输出类型为推挽 */
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;    /* 内部上拉电阻使能 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    /* 复用模式 */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* 配置 USART Rx 为复用功能 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* 第2步: 配置串口硬件参数 */
    USART_InitStructure.USART_BaudRate = 9600;    /* 波特率 */
    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);

    USART_Cmd(USART1, ENABLE);        /* 使能串口 */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
        如下语句解决第1个字节无法正确发送出去的问题 */
    USART_ClearFlag(USART1, USART_FLAG_TC);     /* 清发送完成标志,Transmission Complete flag */   
}

void USART1_IRQHandler(void)
{
    u8 i,j;
    /* 处理接收中断  */
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {   

        for(i=0;i<29;i++)
        RxBuffer1=RxBuffer1[i+1];
        RxBuffer1[29] = USART_ReceiveData(USART1);
        if(RxBuffer1[6]==0x04&&RxBuffer1[7]==0x0A&&RxBuffer1[29]==0x05)
        {
            switch(RxBuffer1[8])
            {
                case 1:               
                    if(SYS_STATUS==MS_IDLE||SYS_STATUS==MS_SLEEP||SYS_STATUS==MS_SYSCHECK)
                    {
                        Upper=1;
                    }
                    break;
                case 2:
                    if(SYS_STATUS==MS_COUNT||SYS_STATUS==MS_SYSCHECK)
                    {
                        Upper=2;
                    }
                    break;
                case 3:
                    for(j=0;j<18;j++)
                    patientName[j]=RxBuffer1[j+9];
                    patientSex=RxBuffer1[27];
                    patientAge=RxBuffer1[28];
                    break;
                case 0x10:
                        TXserial(0x10,YH04AS>>24,YH04AS>>16&0xFF,YH04AS>>8&0xFF,YH04AS&0xFF,SYS_STATUS,-1);
                    break;
                default:break;
            }        
            USART_ClearFlag(USART1, USART_FLAG_RXNE);
            USART_ClearITPendingBit(USART1,  USART_IT_RXNE);          //清除中断标志   
//            USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);            
        }
    }
    /* 处理发送缓冲区空中断 */
    if (USART_GetITStatus(USART1, USART_IT_TXE) == SET)
    {
        if (TxIndex < 24)
        {
          USART_SendData(USART1, TxBuffer1[TxIndex++]);
        }
        else
        {
          TxIndex=0;
          USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
        }        
    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2016-11-2 11:28:51 | 显示全部楼层
仅看你的串口配置,没有发现问题,你可以调试状态在串口中断开始的地方加上一个断点,看看是否进入了。
回复

使用道具 举报

25

主题

136

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2016-11-2 13:37:27 | 显示全部楼层

回 eric2013 的帖子

eric2013:仅看你的串口配置,没有发现问题,你可以调试状态在串口中断开始的地方加上一个断点,看看是否进入了。 (2016-11-02 11:28) 
中断开始的地方也没有,只有在有发送程序的时候才能收到,主循环里面程序清空都不行
    while(1)
    {
        TXserial(0x08,worktime>>8&0xFF,worktime&0xFF,-1);//    串口发送   
    }
主循环就这一句,有这一句就可以正常接收,没有就没反应
回复

使用道具 举报

25

主题

136

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2016-11-5 10:34:24 | 显示全部楼层

回 明天tcx 的帖子

明天tcx:中断开始的地方也没有,只有在有发送程序的时候才能收到,主循环里面程序清空都不行
    while(1)
    {
        TXserial(0x08,worktime>>8&0xFF,worktime&0xFF,-1);// &n .. (2016-11-02 13:37) 
已经找到原因了,不是程序的问题,是串口助手的问题[s:125]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 16:18 , Processed in 0.047992 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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