打印

TM4C123长期串口通信,出现问题?

[复制链接]
2897|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
自民|  楼主 | 2014-11-12 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
485串口通信,上微机发送,TM4C123应答,发送和接收,都放在中断,
长期工作,一般2-3天会出现一次:发送中途停止的故障,没有进入发送中断
发送接收深度都是1个字节。程序中,还有定时器(5MS)中断,但485通信的串口已经设置最高优先级
不知道什么原因

相关帖子

沙发
xyz549040622| | 2014-11-12 10:25 | 只看该作者
串口长期出问题是肯定的事情,所以需要加校验和modenbus协议

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
dirtwillfly + 6 很给力!
板凳
dirtwillfly| | 2014-11-12 11:36 | 只看该作者
出故障是必然的,所以才会有各种协议和纠正预防的措施

使用特权

评论回复
地板
airwill| | 2014-11-13 17:35 | 只看该作者
我不完全这么看.只要有数据, 不应该不接收, 不接收就肯定是不正常情况.
有可能是信号质量问题. 比如低电平不够低, 再加上环境噪声的干扰. 或者太低了, 没有高电平来断开上一个数据...
好好查查, 你应该能够找到问题的

使用特权

评论回复
5
xyz549040622| | 2014-11-14 08:57 | 只看该作者
airwill 发表于 2014-11-13 17:35
我不完全这么看.只要有数据, 不应该不接收, 不接收就肯定是不正常情况.
有可能是信号质量问题. 比如低电平 ...

他没有说明,这种情况出现一次后不再出现,还是说机器停止了就

使用特权

评论回复
6
自民|  楼主 | 2014-11-14 16:51 | 只看该作者
其他部分程序都正常!发送完成后没有进入中断

使用特权

评论回复
7
自民|  楼主 | 2014-11-21 11:22 | 只看该作者
经过几天的跟踪,发现问题是进入接收超时中断,但问题是我默然的FIFO深度是一个字节,我串口监控也没发现多发字节
01 03 00 B0 00 25 85 F6 (上微机发送)
01 03 4A 00 E0 00 D1 00 00(MCU收到后应当发送,发送9个字节(9600)就是遇到接收超时中断,导致发送停止),我试着不去设接收超时中断//ROM_UARTIntEnable(UART2_BASE, UART_INT_RX);,一样会进入


偶尔出现,什么原因导致接收超时中断
接收超时中断能屏蔽掉吗?
中断中是否执行
buffer[rx_num]=ROM_UARTCharGetNonBlocking(UART2_BASE);
就可以清接收超时中断

使用特权

评论回复
8
自民|  楼主 | 2014-11-21 11:23 | 只看该作者
//UART2  RS485
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
          ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
         
          ROM_GPIOPinConfigure(GPIO_PG4_U2RX);
    ROM_GPIOPinConfigure(GPIO_PG5_U2TX);
    ROM_GPIOPinTypeUART(GPIO_PORTG_BASE, GPIO_PIN_4 | GPIO_PIN_5);
   
    baud_rate_init(EEBaudrate);
    ROM_UARTEnable(UART2_BASE);
    ROM_UARTFIFODisable(UART2_BASE);
    ROM_IntEnable(INT_UART2); //ê1ÄüUART2ÖD¶Ï
    ROM_UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);
    //ROM_UARTIntEnable(UART2_BASE, UART_INT_RX);
    ROM_UARTIntEnable(UART2_BASE, UART_INT_TX);
/**********************************************************
                RS485
**********************************************************/
void UART2_Handler(void)
{
          uint32_t ui32Status;
        
    ui32Status = ROM_UARTIntStatus(UART2_BASE, true);
   
    ROM_UARTIntClear(UART2_BASE, ui32Status);
    if((ui32Status == UART_INT_RX) || (ui32Status == UART_INT_RT))   
  {
    while(ROM_UARTCharsAvail(UART2_BASE))
    {
      

    }
    }
   
    if(ui32Status == UART_INT_TX)
    {
            Q1_Light_flag=0;
            if(SndFrmCnt[6]<uSndFrmCnt[6])
             {
                      if(ROM_UARTSpaceAvail(UART2_BASE))
                       {
                                     ROM_UARTCharPutNonBlocking(UART2_BASE, tx_buf[SndFrmCnt[6]++]);
                 }
        }else  Snd_Complete_Flag[6]=1;                                   
    }
   
}

使用特权

评论回复
9
自民|  楼主 | 2014-11-21 14:37 | 只看该作者
使用UART时先清空FIFO
请问清除接收FIFO的指令是那个函数

使用特权

评论回复
10
自民|  楼主 | 2014-12-2 10:15 | 只看该作者
问题应该找到,
发送完成,在打开接收!接收时,要关闭发送
ROM_UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);
ROM_UARTIntEnable(UART2_BASE, UART_INT_TX);

ROM_UARTIntDisable(UART2_BASE, UART_INT_RX | UART_INT_RT);
ROM_UARTIntDisable(UART2_BASE, UART_INT_TX);

我原来是只是没有发送关闭串口中断,工作是开串口中断
工作一个礼拜没出现问题

使用特权

评论回复
11
dirtwillfly| | 2014-12-2 12:00 | 只看该作者
自民 发表于 2014-12-2 10:15
问题应该找到,
发送完成,在打开接收!接收时,要关闭发送
ROM_UARTIntEnable(UART2_BASE, UART_INT_RX |  ...

赞一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

195

帖子

2

粉丝