[讨论] stm32cubemx生成的项目中遇到的奇葩问题

Tobey   2017-8-14 08:50 楼主


      使用cube整了几个测试程序,遇到了几个奇葩问题,大部分都是重新创建并生成一个项目问题就能解决,然而纠结于问题出自哪里,之前在自己笔记本上使用cube生成项目时都没遇到这些问题,而现在使用台式机却频繁遇到类似的小问题,大家在使用cube时有没有遇到类似的问题?又是怎么解决的呢?
两者区别在于:(cube及keil版本一样)
       笔记本:win7 32位
       台式机:win10 64位

遇到的问题如下:
1、串口接收缓存区仅接收一个字节的数据
现象:
     调用串口接收函数:HAL_UART_Receive(&huart1,(uint8_t *) temp,100,2);结果无论发送的数据多少,接收到的缓存区仅temp[0]获取到数据,无法接收完整的串口数据。

解决方式:重新创建一个串口等配置一样的项目,编译-》运行,发现同样的配置,同样的代码,却能正常的接收串口程序了,,,

2、strlen()函数获得的数组长度在判断语句中失效
运行有误代码:(这是用于清空缓存区的代码)
  1. for(i=0; i<strlen(temp);i++)
  2. {
  3.         temp[i] = 0;
  4. }

现象:temp缓存区未被清空

解决办法:
  1. len = strlen(temp);
  2. for(i=0; i<len;i++)
  3. {
  4.         temp[i] = 0;
  5. }

运行结果:temp缓存区完成清空操作~~




回复评论 (13)

或者已经找到出现上述问题的最佳解决途径了
点赞  2017-8-14 08:51
for语句之后你在temp【0】 = 0;之后再进行strlen判断条件不就是strlen(temp)=0了  。。。。。不就for只能运行一次了吗?
Hello astroturfers
点赞  2017-8-14 13:41
引用: y909334873 发表于 2017-8-14 13:41
for语句之后你在temp【0】 = 0;之后再进行strlen判断条件不就是strlen(temp)=0了  。。。。。不就for只能 ...

temp数组在别的地方重新赋值,这里只是贴了部分代码说明,
点赞  2017-8-15 11:59
做了几次测试,发现串口的问题是其实是因为延迟造成的,上述代码中所用到的串口接收函数是阻塞式的,启用串口中断,采用中断方式接收数据就能解决串口接收数据不全的问题。
点赞  2017-8-15 12:02
引用: Tobey 发表于 2017-8-15 11:59
temp数组在别的地方重新赋值,这里只是贴了部分代码说明,

我知道的是你所说的那个strlen在判断语句是无效的那个修改前的代码,本身就是有问题,不是失效了,是本身逻辑就错了,for语句运行一次后srtlen后的数就是0肯定会跳出for循环的
Hello astroturfers
点赞  2017-8-15 16:37
引用: y909334873 发表于 2017-8-15 16:37
我知道的是你所说的那个strlen在判断语句是无效的那个修改前的代码,本身就是有问题,不是失效了,是本身 ...

哦哦 明白了!多谢!
点赞  2017-8-16 09:08
看起来你要清空temp[i]这个数组,用memset函数不就挺好的吗。。。。。。
点赞  2017-8-21 21:49
引用: huaiqiao 发表于 2017-8-21 21:49
看起来你要清空temp这个数组,用memset函数不就挺好的吗。。。。。。

这个方法好!
点赞  2017-8-23 07:21
引用: Tobey 发表于 2017-8-23 07:21
这个方法好!

不是说这个方法好,这个是个技巧啊。。。。。。。memset这个是对较大的结构体或数组进行清零操作的一种最快方法呢。

这个你百度memset这个函数就知道了。
点赞  2017-8-23 09:35
引用: huaiqiao 发表于 2017-8-23 09:35
不是说这个方法好,这个是个技巧啊。。。。。。。memset这个是对较大的结构体或数组进行清零操作的一种最 ...

这个函数我知道的,上面的代码是基于之前的工程改的测试用例,那个for循环原本是用于赋值的,于是我就直接拿来清空数组了~
点赞  2017-8-23 10:18
引用: huaiqiao 发表于 2017-8-23 09:35
不是说这个方法好,这个是个技巧啊。。。。。。。memset这个是对较大的结构体或数组进行清零操作的一种最 ...

虽然知道这个函数,不过之前一般都用局部变量,没怎么用过这个函数,多谢提醒!下回再遇到清空数组的情况就记得使用memset函数了
点赞  2017-8-23 10:30
引用: Tobey 发表于 2017-8-23 10:30
虽然知道这个函数,不过之前一般都用局部变量,没怎么用过这个函数,多谢提醒!下回再遇到清空数组的情况 ...

嗯嗯,get到一个小小的方法,这样会你代码的效率我想也会提高很多的吧。。。
点赞  2017-8-23 15:46
引用: Tobey 发表于 2017-8-23 10:18
这个函数我知道的,上面的代码是基于之前的工程改的测试用例,那个for循环原本是用于赋值的,于是我就直 ...

for循环要几条语句,这个函数我一条语句就能实现了。。。。。所以C语言自带的这种标准库,里面的不少函数还是多多关注下,有时候可以说很好用
点赞  2017-8-23 15:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复