本帖最后由 kafeng 于 2015-10-24 11:19 编辑
用以下配置和程序发送字符串总会有随机丢失字节的情况,求大神指教。
void Init_usart0(void)
{
P3SEL |= BIT4 + BIT5; //选择P3^4和P3^5引脚为外围模块功能
U0CTL=(PENA&0x00) | (PEV&0x00) | (SPB&0x00) | (CHAR&0xff) | (SYNC&0x00)| (MM&0x00);
//效验禁止,1位停止位,字符长度,8位,USART模块的模式选择,选择UART模式(异步)
U0TCTL=(CKPL&0x00) | (SSEL1&0xff) | (URXSE&0x00) | (TXWAKE&0x00) | (TXEPT&0x00);
//时钟极性控制位,UCLKI信号与UCLK信号极性相同,确定波特率发生器的时钟源为SMCLK(即为1MHz)
U0BR0=0x68;
U0BR1=0x00;
U0MCTL=0x88;
U0CTL&=~SWRST;
ME1|=(UTXE0&0xff) | (URXE0&0xff); //USART0发送允许,USART0接收允许
IE1|=(UTXIE0&0xff) | (URXIE0&0xff); //USART0发送中断使能,USART0接收中断使能
IFG1 &=0x7f; //清0发送中断标志位
}
/*指针指向要发送的字符串,及要发送的数据长度*/
void Sent_Uart0(unsigned char *p,unsigned char length) //USART0串口发送函数
{
TX0_pointer = p; //指针指向要发送的内容数组
TX0_length = length; //定义要发送的数据长度
IFG1|=UTXIFG0; //发送中断置位
while( TX0_complete_flag ==0);//等待所有发送完成
while((U0TCTL&TXEPT)==0); //判断当前数据是否发送完成
IFG1&=~UTXIFG0; //清除中断标志
TX0_complete_flag =0; //清除发送完成标志位
}
#pragma vector=UART0TX_VECTOR //USART0串口发送中断
__interrupt void usart0_tx(void)
{
if(TX0_length)
{
U0TXBUF=*(TX0_pointer++);
while (!(IFG1&UTXIFG0)); // 判断:发送是否完成
}
TX0_length --;
if(TX0_length==0)
{
TX0_complete_flag =1; //所有字节发送完成
}
}
|