这里检测到IDLE标识置位后置位idle_detect变量,cnt变量标记了本次接收到的字节个数,主函数测试代码如下:
[cpp] view plain copy
- #include "uart.h"
-
- extern uint8_t idle_detect,cnt;
- extern uint8_t buffer[100];
- int main (void)
- {
- uint8_t i = 0;
- uart_init(115200);
-
- while(1)
- {
- if(1 == idle_detect)
- {
- idle_detect = 0;
- printf("\r\ncnt:%X,ctx:",cnt);
- for(i = 0; i < cnt; i++)
- {
- printf("%02X ",buffer);
- }
- cnt = 0;
- }
- }
- }
代码比较简单,这里使用printf来输出本次接收到的字节数以及字节内容,运行结果如下:
可以看到检测结果是正常的,只是在开机后有一次cnt为0的结果,应该是上电之后总线默认就是空闲的,的确也没有收到数据,因此就想把cnt为0的结果去掉,这里我遇到了一个很纠结的问题,在判断idle_detect变量的同时也检测cnt是否大于0,测试代码更改如下:[cpp] view plain copy
- #include "uart.h"
-
- extern uint8_t idle_detect,cnt;
- extern uint8_t buffer[100];
- int main (void)
- {
- uint8_t i = 0;
- uart_init(115200);
-
- while(1)
- {
- if(1 == idle_detect && cnt > 0)
- {
- idle_detect = 0;
- printf("\r\ncnt:%X,ctx:",cnt);
- for(i = 0; i < cnt; i++)
- {
- printf("%02X ",buffer);
- }
- cnt = 0;
- }
- }
- }
感觉逻辑是对的,再次运行,结果如下:
这个时候发现cnt变量的值输出一直为1,但输出的字节内容却是对的,一直想不通这是为啥?思来想去逻辑是没啥问题的,后来又把cnt是否为0的条件判断不放在跟idle_detect变量检测同一水平,而是放在它里面,更改测试代码如下: [cpp] view plain copy
- #include "uart.h"
-
- extern uint8_t idle_detect,cnt;
- extern uint8_t buffer[100];
- int main (void)
- {
- uint8_t i = 0;
- uart_init(115200);
-
- while(1)
- {
- if(1 == idle_detect)
- {
- idle_detect = 0;
- if(cnt == 0)
- continue;
- printf("\r\ncnt:%X,ctx:",cnt);
- for(i = 0; i < cnt; i++)
- {
- printf("%02X ",buffer);
- }
- cnt = 0;
- }
- }
- }
这个时候再次运行代码,结果如下:
这个时候输出的结果是正确的,难道两个条件检测放在一起会有问题吗?这个是不应该的,因为idle_detect为0时CPU是不会再去检测cnt变量的,只有idle_detect为1时才去检测cnt变量,因此cnt的条件检测放在里面和放在外面应该是一样的效果才对。后来想是否是printf引起的问题,就把printf去掉改成了自己的输出函数,更改测试代码如下: [cpp] view plain copy
- #include "uart.h"
-
- extern uint8_t idle_detect,cnt;
- extern uint8_t buffer[100];
- int main (void)
- {
- uint8_t i = 0;
- uart_init(115200);
-
- while(1)
- {
- if(1 == idle_detect && cnt > 0)
- {
- idle_detect = 0;
- uart_puts("\r\ncnt:");
- uart_char(0x30+cnt);
- uart_puts(",ctx:");
- uart_write(buffer,cnt);
- cnt = 0;
- }
- }
- }
这里cnt的输出是有问题的,但我测试时保证cnt不会大于10,因此不影响测试结果,在编译时把微库去掉,运行结果如下:
结果发现在数据小于等于6时结果是正确的,而当数据大于6时cnt一直为6但字节内容同样是正确的,很是费解,在后来我又测试过当发送的字节为16时,输出的数据内容会少几个字节,总而言之把cnt变量的判断放在idle_detect变量检测的后面就会导致结果不对,而把cnt变量的判断放在里面就不会有问题,所以应该不是printf引起的问题,感觉像是if条件语句引起的问题,尝试过很多方法也没搞定该问题,虽然最后我们也能回避这个问题,但没找到原因真纠结,如果有人知道是啥问题的话,麻烦告知一下。 最后串口总线空闲检测这一特性的确很有用,尤其是对收到的数据是不定长时更有效果,大家以后可以尝试使用一下该特性。 |