本帖最后由 ayiayihsq 于 2016-11-5 09:06 编辑
新手调试,请教各位一个问题:
我在调试串口接收发送程序时由PC串口助手改善字符例如ABCD给MCU,然后由MCU返回给串口接收值
在第一次上电时,串口助手接收到由MCU发送过来的五个字符:A、换行、C、D、回车
不掉电第二次发送串口助手显示接收由MCU发送过来的字符:A、换行、A、B、C、D、回车
如果继续发送其它字符,则前两个字符不变,例如发送XXXX,接收:A、换行、X、X、X、X回车
为什么前两位的字符不正确,需要第二次发送后才接到到完整数据,且数据存在定义的数组的第3位开始
程序如下,
void usart_init() //串口初始化
{
SPEN1 = 1; // 串口使能
TRISC7 = 1; // 异步串行接收数据输入
TRISC6 = 0;// 异步和同步主模式,TRISC<6> 零(= 0)
// TXSTA1:发送状态和控制寄存器
SYNC1 = 0; // 异步模式
TX91 = 0; // 选择8 位发送
TXEN1 = 1; // 禁止发送
BRGH1 = 1; // 高速
TXEN1 = 1; // 使能发送
// RCSTA1:接收状态和控制寄存器
RX91 = 0; // 选择8 位接收
CREN1 = 1; // 使能接收器
FERR1=0;//
OERR1=0;//无超速错误
RCREG1=0; //接收缓冲寄存器清0
// BAUDCON1:波特率控制寄存器
BAUDCON1=0x30;//0b 0011 0000 接收发送极性相反
//BRG16 =0 ; // 8位波特率发生器——SPBRGHx 和SPBRGx
//TXCKP=1;
SPBRG1 = 25;//波特率:9600
}
void IRQ_init() 中断初始化
{
GIE=1;//允许所有未被屏蔽的中断
PEIE=1;//允许所有未被屏蔽的外设中断
IPEN=0;//禁止中断优先级
//INT2外部中断设置
INTEDG2=1;//上升沿触发外部中断2
INT2IE=1;//使能外部中断INT2
// //TMR1中断设置
// TMR1IE=1;//使能定时器1中断
// TMR1IP=0;//定时器1优先级设置低
// 外设中断允许寄存器1
RC1IE = 1; // 允许EUSART 接收中断
}
void interrupt ISR(void)//中断程序
{
unsigned temp,temp1,temp2,temp3;
char utemp;
if(OERR1==1)//判断有无超速错误
{
CREN1=0;
CREN1=1;
}
if(RC1IF&&RC1IE) // 串口1接收数据中断处理程序
{
RcregBuf=RCREG;
if(RcregBuf==0x0D) //如果接收到回车符,重新存放
{
i=0;
Rcflag=1;
}
if(i>=60 ) //如果接收数据数超出数组长度,重新存放
{
i=0;
Rcflag=1;
}
i++;
RC1IF=0;
}
|