单片机UART输入输出数据不一致
我使用串口调试工具,向单片机发送数据,单片机收到数据后,然后将数据发给电脑。通过串口监控,发出去的数据没问题,但是返回的数据少了。代码如下:将收到的数据返回给串口函数:/...
我使用串口调试工具,向单片机发送数据,单片机收到数据后,然后将数据发给电脑。通过串口监控,发出去的数据没问题,但是返回的数据少了。代码如下:
将收到的数据
返回给串口函数:
//Send char to port void Putc_to_SerialPort(u8 ch){ ES0 = 1; SBUF0=ch; while(TI_0 == 0); TI_0 = 0; ES0 = 0;}
中断函数:
//serial interrupt function void serial () interrupt 4 using 1 { if (1 == RI_0) //when receiving data, hardware automatic set 1 { ES0 = 0; // enable ISR RI_0 = 0 ; ch = SBUF0; //Put the receive data to ch ReadFlag = 1; }}
主函数代码:
RI_0 = 0; // clr RX IRQ TI_0 = 0; // clr TX IRQ REN_0 = 1; // enable rx
TMOD |= 0x20 ; // timer1,mode 2, an 8-bit counter with automatic reload IEN |= 0x98 ; //Enable all interrupt and Serial Interrupt,timer1 overflow interrupt //EA|ES1|ET2|ES0|ET1|EX1|ET0|EX0:1001 1000
//ET1=1; //timer1 overflow interrupt. TR1 = 1 ; // timer 1 run
//ES0 = 1; // enable ISR
while ( 1 ) { ES0 = 1; // enable ISR if (1 == ReadFlag) //如果取数标志已置位,就将读到的数从串口发出 { ReadFlag = 0 ; // set get data flag to 0 Putc_to_SerialPort(ch); //发送可以被接收的中断所中断 } }
返回来的数据总是少几个,而且不规律的出现。这个是啥子原因呢?感觉不么么哒了。 展开
将收到的数据
返回给串口函数:
//Send char to port void Putc_to_SerialPort(u8 ch){ ES0 = 1; SBUF0=ch; while(TI_0 == 0); TI_0 = 0; ES0 = 0;}
中断函数:
//serial interrupt function void serial () interrupt 4 using 1 { if (1 == RI_0) //when receiving data, hardware automatic set 1 { ES0 = 0; // enable ISR RI_0 = 0 ; ch = SBUF0; //Put the receive data to ch ReadFlag = 1; }}
主函数代码:
RI_0 = 0; // clr RX IRQ TI_0 = 0; // clr TX IRQ REN_0 = 1; // enable rx
TMOD |= 0x20 ; // timer1,mode 2, an 8-bit counter with automatic reload IEN |= 0x98 ; //Enable all interrupt and Serial Interrupt,timer1 overflow interrupt //EA|ES1|ET2|ES0|ET1|EX1|ET0|EX0:1001 1000
//ET1=1; //timer1 overflow interrupt. TR1 = 1 ; // timer 1 run
//ES0 = 1; // enable ISR
while ( 1 ) { ES0 = 1; // enable ISR if (1 == ReadFlag) //如果取数标志已置位,就将读到的数从串口发出 { ReadFlag = 0 ; // set get data flag to 0 Putc_to_SerialPort(ch); //发送可以被接收的中断所中断 } }
返回来的数据总是少几个,而且不规律的出现。这个是啥子原因呢?感觉不么么哒了。 展开
展开全部
这是有可能的,因为电脑收发都是开环的,也就是说,只管发送,不管是否接收,这样当单片机处理稍微慢点的话,就可能丢失一些数据。为此,最好的处理办法是用中断,且开辟一个接收缓冲区,保证不丢失数据。
追问
刚学单片机,你说的不是很明白。你说的是接收没接收完整?
void serial () interrupt 4 using 1 这里出了问题?同时,想问下,芯片的波特率不是通过Timer1来设置的,我Timer1是否需要打开呢?我看到网上都是说,timer1打开使用,是为了保持波特率。但现在我不是使用timer1 来设置的。
追答
不是完整的问题,是数据丢失。也就是某些数码据没有收到
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询