UART 发送问题求助

2019-03-24 20:19发布

本帖最后由 xiangyuansu 于 2016-6-10 13:42 编辑

串口在主函数里循环发送没有问题,但是如果用定时发送就会有问题!只会发送一次,后面就没有数据发送出来了,用的中断方式。下面是发送函数

//==========================================================================
// 函数名称:sub_uartc0_write_send_buff
// 函数功能:写数据到 uartc0 发射缓冲区
// 入口参数:data:数据指针,length:数据长度
// 出口参数:UARTC_ERROR:数据太长,将导致缓冲区溢出,写入失败;UARTC_SUCCESS:写入成功
// 程序版本:1.0
// 编写日期:
// 程序作者:
// 修改次数:
// 修改作者:
// 修改日期:
// 修改内容:
// 版本升级:
//==========================================================================
INT8U sub_uartc0_write_send_buff( const INT8U * data, INT16U length )
{
    INT16U  uartc_tx_len;                                               //
    INT16U  i;                                                          //
    Ram_debug(0xFF);
    if( length > cUartcBuff0 ) {                                        //
        return UARTC_ERROR;                                             //
    }                                                                   //

    asm volatile("CLI");                                                //
    uartc_tx_len = uartc0_tx_buff_len + length;                         //
    asm volatile("SEI");                                                //
    if( uartc_tx_len > cUartcBuff0 ) {                                  // 数据太长,写入失败
        return UARTC_ERROR;                                             //
    }                                                                   //

    for( i=0; i<length; i++ ) {                                         //
        uartc0_tx_buff[uartc0_tx_ep] = data;                         //
        uartc0_tx_ep++;                                                 //
        if( uartc0_tx_ep >= cUartcBuff0 ){                              //
            uartc0_tx_ep = 0;                                           //
        }                                                               //
    }                                                                   //

    asm("CLI");                                                         // 临界保护
    uartc0_tx_buff_len += length;                                       //
    asm("SEI");                                                         //

    if( uartc0_mode_flag == 0 ) {                                       // 如果没有开启发射,那么设置进入发送模式
        uartc0_mode_flag = 1;                                           //
                Ram_debug(0xF3);
                USARTC0_CTRLA = 0x04;                                           // 设置发射完毕中断优先级为低
        USARTC0_CTRLB = 0x08;                                           // 开启发送允许,关闭接收
        asm volatile("CLI");                                            //
               
                USARTC0_DATA = uartc0_tx_buff[uartc0_tx_sp];                    //
        uartc0_tx_sp++;                                                 //
        if( uartc0_tx_sp >= cUartcBuff0 ){                              //
            uartc0_tx_sp = 0;                                           //
        }                                                               //
        uartc0_tx_buff_len--;                                           // 发射缓冲区数据长度减1
        asm volatile("SEI");                                            //
    }                                                                   //

    return UARTC_SUCCESS;                                               // 写数据成功,返回成功
}

中断函数:

//==========================================================================
// 函数名称:uartc0 串口通信发送数据寄存器空中断
// 函数功能:用于发射串口缓冲区数据,当发送缓冲区为空时,停止发送
// 入口参数:无
// 出口参数:无
// 程序版本:1.0
// 编写日期:
// 程序作者:
// 修改次数:
// 修改作者:
// 修改日期:
// 修改内容:
// 版本升级:
//==========================================================================
ISR( uartc0_tx_int )
{
    asm volatile("CLI");                                                // 禁止中断嵌套
    if( uartc0_tx_buff_len == 0x00 ) {                                  // 发射缓冲区为空,关闭发射
        uartc0_mode_flag = 0;                                           //
        uartc0_tx_sp = uartc0_tx_ep;                                    //
        USARTC0_CTRLA = 0x10;                                           // 关闭发送中断允许,开启接收中断允许
        USARTC0_CTRLB = 0x10;                                           //
                Ram_debug(0xF5);
        }                                                                   //
    else {
        USARTC0_DATA = uartc0_tx_buff[uartc0_tx_sp];                    //
        uartc0_tx_sp++;                                                 //
        if( uartc0_tx_sp == cUartcBuff0 ){                              //
            uartc0_tx_sp = 0;                                           //
        }                                                               //
        uartc0_tx_buff_len--;                                           // 发射缓冲区数据长度减1
                Ram_debug(0xF4);
        }                                                                   //
    asm volatile("SEI");                                                //
}

我用断点发现会进去,但是实际并没有数据出来。不知这个函数哪里有问题
此帖出自小平头技术问答
0条回答

一周热门 更多>