
我参考别人的UART2的发送和接收程序入下(与主CPU通信)。现在面临的问题是,在我给CPU发送请求后,如果主CPU不给答复,那么我的程序就会一直在(1)处进入死循环,我该怎么修改跳出循环而不影响string5的赋值。 u8 UART2_ReceiveByte(void) { while (!(UART2_SR & UART2_FLAG_RXNE));// (1) USART2_RX_BUF=(uint8_t)UART2_DR; return USART2_RX_BUF; } void UART2_SendByte(u8 data) { UART2_DR=data; while (!(UART2_SR & UART2_FLAG_TXE)); } main() { uchar lcd_addy=0; uchar j=10; while (lcd_addy<22) //等待主CPU启动完成并返回当前属性值,CPU答复22个字符 { while(j) //向主机发送10次请求命令 { UART2_SendByte(0xff); //单片机向主CPU发送获取当前显示命令请求 UART2_SendByte(0x04); UART2_SendByte(0x00); j--; } UART2_ReceiveByte(); string5[lcd_addy]=USART2_RX_BUF; lcd_addy++; } |
最完美的解决是用串口接收中断,这样不管你接收多少数据,实时性能保证。
这种方法我试了,不行,因为string5[lcd_addy]=USART2_RX_BUF;这句会将不确定的值赋给string5,当CPU再发送22个字符的时候,前边的几个就变成不确定的值了。
哪里不明白
那就用串口中断吧
我有4个地方用到接收,而且接收到的数据存在不同的变量里了,用中断是不是没法解决?
我有4个地方用到接收,而且接收到的数据存在不同的变量里了,用中断是不是没法解决?
为什么不能呢?先搞清通信协议
额,我是这样想的,您给我看看我的想法对不对。
我的流水线是0123456789这10步,我要在2处接收CPU命令,并把在这个命令显示出来,但是CPU没有在2处给我,而是在5处给我了,那我现在已经过了第二步,不需要显示了,那接收到CPU命令也没用了啊
有地址吗
串口一直等待接收,接收到数据了,你再判断你的流水线是到哪一步了,如果接收到的命令不符合要求那就不用接收到的数据。
哦,这样应该可以。谢谢