[求助] UART 发送问题求助

xiangyuansu   2016-6-10 13:41 楼主
串口在主函数里循环发送没有问题,但是如果用定时发送就会有问题!只会发送一次,后面就没有数据发送出来了,用的中断方式。下面是发送函数 //========================================================================== // 函数名称: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; // 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"); // } 我用断点发现会进去,但是实际并没有数据出来。不知这个函数哪里有问题 本帖最后由 xiangyuansu 于 2016-6-10 13:42 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复