本帖最后由 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"); //
}
我用断点发现会进去,但是实际并没有数据出来。不知这个函数哪里有问题
此帖出自
小平头技术问答
一周热门 更多>