如题,想通过串口发送字符串存在数组里面,然后在串口助手上打印出来,一开始计数值没有清零导致数据总是会被覆盖,调试了好久终于搞定,但是我在仿真窗口观察数组数据发现了问题,数据并没有存放在数组里面,而是每个字符轮流存在了数组首地址,而且打印数组大小的确只有首地址有,这样子本来是要对数据进一步处理的现在没法进行,向诸位请教下,问题出在哪里?代码如下,貌似count++,没有什么作用 void USART1_IRQHandler(void) { u8 RxSize=0,RxCount=0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); RxBuf[RxCount++] = USART_ReceiveData(USART1); } RxSize=RxCount; USART_ClearFlag(USART1,USART_FLAG_TC); for(RxCount=0;RxCount<RxSize;RxCount++) printf("%c",RxBuf[RxCount]); } |
1.下面这段代码:
RxSize=RxCount;
USART_ClearFlag(USART1,USART_FLAG_TC);
for(RxCount=0;RxCount<RxSize;RxCount++)
printf("%c",RxBuf[RxCount]);
这段代码是在串口1的中断函数里吗?如果是,那么每次接收中断都会执行这段代码,所以,你看到接收到的字符只存在字符串的首地址就是对的;因为每收到一个数据,他就会打印出去,同时RxCount就会清零。也就是 你每次接收到的数据都是第一个数据。
2.RxCout这个变量是局部动态变量,退出中断函数后就消失了,所以你每次进入中断函数,RxCount都会重新定义并赋值为0 。那么你调试看到的现象也可以解释了。
恩,后来想了想,逻辑上是不对,我把自己的思路验证下再来和诸位讨论哈
其他的旧书串口的配置了,和例程里面一样的,修改的就是中断里面的啊
恩,重新修改了逻辑,之前我是以为发送字符串过去会全部接收的,硬件上还是没弄清楚,修改之后就可以啦,贴出代码一起讨论下。有个问题时本来想用\0检测字符串接收完毕,但是发现好像并没有发送\0,很奇怪,不知道有没有人可以解释下。我是自己定义了空格作为接收完成的标志,想想很多串口通信的程序都是通过数据包来发送,检测帧头和帧尾,是不是就是为了避免错误呢?代码如下,会打印出接收到数组长度。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
RxBuf[RxCount]=USART_ReceiveData(USART1);
}
if(RxBuf[RxCount]==' ')
{
RxSize=RxCount;
printf("RxCount=%d\n",RxCount);
RxCount=0;
// printf("RxCount=%d\n",RxCount);
printf("RxSize=%d\n",RxSize);
}
else
{
// printf("RxCount=%d\n",RxCount);
RxCount+=1;
}
恩,空格是我自己定义的结束标志,用\0有问题,初始化未赋值的话都是\0,不好判断,搞定啦,谢啦