OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5217|回复: 14

关于STM32接收数组问题(发送abcde接收{e,0,0,0,0})

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
发表于 2021-9-22 17:06:24 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 jungege 于 2021-9-23 11:07 编辑

程序功能就是单片机接收上位机(串口助手)发送的 adbcd ;将接收的数据放入数组 Rec_array[]
通过 if(0 == memcmp(Rec_array, "abc", 3)) 语句,翻转 LED ;

正常情况是数组存放了 {a,b,c,d,e}; 前三项 abc对应正确,led翻转

但是接收数据,在 if(0 == memcmp(Rec_array, "abc", 3)) 识别时数组里只存放了 {b,0,0,0,0};
想做到 发送-abcde-五位,led翻转,再发送-aaaaa-不翻转,再发送-abcee-翻转


程序结构很简单:一个usart函数,一个mian函数usart.c文件:


附件:
USART-STRING.rar (275.31 KB, 下载次数: 3)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

223

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-9-23
在线时间
120 小时
发表于 2021-9-23 10:02:51 | 显示全部楼层
数组接收 更新是不是不正确?
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-23 11:03:51 | 显示全部楼层
和谐年份 发表于 2021-9-23 10:02
数组接收 更新是不是不正确?
  1. /*串口接收中断*/
  2. void USART1_IRQHandler(void)
  3. {
  4.         u8 data;
  5.         if(USART_GetITStatus(USARTx,USART_IT_RXNE) != RESET)
  6.         {
  7.                 data = USART_ReceiveData(USARTx);
  8.                 Rec_array[Code_Cnt] = data;
  9.                 Code_Cnt++;
  10.                 if(Code_Cnt >= Code_Max)
  11.                 {        Code_Cnt = 0;
  12.                 }
  13.     USART_ClearITPendingBit(USARTx, USART_IT_RXNE);
  14.         }
  15. }
  16. /*串口接收数据函数*/
  17. void USART1_Recive(void)
  18. {
  19.         Code_Cnt = 0;
  20.         if(0 == memcmp(Rec_array, "123", 3))
  21.         {
  22.                 LED_BLUE;
  23.         }
  24.         if(0 == memcmp(Rec_array, "321", 3))
  25.         {
  26.                 LED_RED;
  27.         }
  28.         Rec_array[0] = Rec_array[1] = Rec_array[2] = Rec_array[3] = Rec_array[4] = 0;
  29. }
复制代码


不知道你表达什么,上是数组的中断接收以及处理程序
下是定义的参数

  1. #define Code_Max 5 //最大值
  2. u8 Rec_array[Code_Max];//数组
  3. unsigned int Code_Cnt = 0;//数组的第几位
复制代码
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-9-23 17:05:31 | 显示全部楼层
你while里一直清0  Code_Cnt,肯定存不到数据啊。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-24 11:20:25 | 显示全部楼层
pdwdzz 发表于 2021-9-23 17:05
你while里一直清0  Code_Cnt,肯定存不到数据啊。

但是我这边有一份代码也是有这个语句,他却能完整接收程序并判断,否则的话,最后 。清零语句应该放在哪呢
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
发表于 2021-9-24 13:56:24 | 显示全部楼层
串口中断里边已经有清零了,接收函数里边不需要在清零
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-24 14:09:57 | 显示全部楼层
Monsteri 发表于 2021-9-24 13:56
串口中断里边已经有清零了,接收函数里边不需要在清零
  1. void USART1_Recive(void)
  2. {
  3.     Usart1_ReceLen = 0;

  4.     if(0 == memcmp(ReceBuff1, "<0>", 3))
  5.     {
  6.         Close_OG = 0;
  7.     }

  8.     if(0 == memcmp(ReceBuff1, "<1>", 3))
  9.     {
  10.         Close_OG = 1;
  11.     }
  12.     if(0 == memcmp(ReceBuff1, "[?]", 3))
  13.     {
  14.         USART1_Send("page3.n0.val=", Rounding_result_lx);
  15.     }
  16.     if(0 == memcmp(ReceBuff1, ":01;", 4))
  17.     {
  18.         Send_Act("Part1");
  19.         Start_Part1 = 1;
  20.         Start_Part2 = Start_Part12 = 0;
  21.     }
  22.     if(0 == memcmp(ReceBuff1, ":10;", 4))
  23.     {
  24.         Start_Part2 = 1;
  25.         Start_Part1 = Start_Part12 = 0;
  26.     }
  27.     if(0 == memcmp(ReceBuff1, ":11;", 4))
  28.     {
  29.         Send_Act("Part1+Part2");
  30.         Start_Part12 = 1;
  31.         Start_Part1 = Start_Part2 = 0;
  32.     }
  33.     if(0 == memcmp(ReceBuff1, ":AA;", 4))
  34.     {
  35.         if(!SENSOR4)
  36.         {
  37.             FASTEN_DOWN = 0; //???°????
  38.             FASTEN_UP = 1; //???°???????
  39.         }
  40.     }
  41.     if(0 == memcmp(ReceBuff1, ":BB;", 4))
  42.     {
  43.         if(!SENSOR0)
  44.         {
  45.             USB_ACT = 0;//USB插入
  46.         }
  47.     }
  48.     if(0 == memcmp(ReceBuff1, ":CC;", 4))
  49.     {
  50.         if(!SENSOR6)
  51.         {
  52.             PRESS_DOWN = 0; //????????
  53.             PRESS_UP = 1; //???????????
  54.             Twinkle = 1;
  55.         }
  56.     }
  57.     if(0 == memcmp(ReceBuff1, ":DD;", 4))
  58.     {
  59.         CLICK_ACT = 0; //?????
  60.     }
  61.     if(0 == memcmp(ReceBuff1, ":EE;", 4))
  62.     {
  63.         if(!SENSOR9)
  64.         {
  65.             SHOCK_ACT = 0; //?????
  66.         }
  67.     }
  68.     if(0 == memcmp(ReceBuff1, ":aa;", 4))
  69.     {
  70.         FASTEN_DOWN = 1; //???°???????
  71.         FASTEN_UP = 0; //???°????
  72.     }
  73.     if(0 == memcmp(ReceBuff1, ":bb;", 4))
  74.     {
  75.         USB_ACT = 1;//USB拔出
  76.     }
  77.     if(0 == memcmp(ReceBuff1, ":cc;", 4))
  78.     {
  79.         PRESS_DOWN = 1; //???????????
  80.         PRESS_UP = 0; //????????
  81.     }
  82.     if(0 == memcmp(ReceBuff1, ":dd;", 4))
  83.     {
  84.         CLICK_ACT = 1; //?????
  85.     }
  86.     if(0 == memcmp(ReceBuff1, ":ee;", 4))
  87.     {
  88.         SHOCK_ACT = 1; //?????
  89.     }
  90.     if(0 == memcmp(ReceBuff1, "Reset", 5))
  91.     {
  92.         Reset_Part = 1;
  93.     }
  94.     if(0 == memcmp(ReceBuff1, "Stop", 4))
  95.     {
  96.         Stop_Part = 1;
  97.     }
  98.     ReceBuff1[0] = ReceBuff1[1] = ReceBuff1[2] = ReceBuff1[3] = ReceBuff1[4] = 0;
  99. }
复制代码


为什么这就可以填写清零语句,也是放到while(1)一直执行
参数只是名称不一样,性质与位置都一样
前面的定义
  1. #define USART1_REC_LEN       5

  2. u8  ReceBuff1[USART1_REC_LEN];

  3. unsigned int Usart1_ReceLen;
复制代码
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-24 14:14:48 | 显示全部楼层
其实你们的建议我采纳过,但是不仅要发第一次可以,要稳定一直可以,即使过程中发错几次数据,也可以下一次正常发送接收,反应
能不能有调试好的程序
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2021-9-24 14:27:00 | 显示全部楼层
jungege 发表于 2021-9-24 14:14
其实你们的建议我采纳过,但是不仅要发第一次可以,要稳定一直可以,即使过程中发错几次数据,也可以下一次 ...

建议仿真找问题,看数组,看数组坐标寄存器,这个问题一仿真就出来了
我是小白,很白很白的小白!!!
回复

使用道具 举报

40

主题

140

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2019-8-31
在线时间
269 小时
发表于 2021-9-24 16:07:29 | 显示全部楼层
用的哪个芯片,我可以发你一份串口+DMA控制的程序
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-9-24 16:31:18 | 显示全部楼层
jungege 发表于 2021-9-24 11:20
但是我这边有一份代码也是有这个语句,他却能完整接收程序并判断,否则的话,最后 。清零语句应该放在哪 ...

那肯定是和你写的有不同之处的,不可能主函数一直清除计数还能接收到数组里。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-25 11:21:50 | 显示全部楼层
pdwdzz 发表于 2021-9-24 16:31
那肯定是和你写的有不同之处的,不可能主函数一直清除计数还能接收到数组里。

并没有不同之处,唯一不同之处就是他处理的if很多罢了,上位机发送stop,它也确实接收到了stop,但我的就不行。关于串口中断这方面可以说是一模一样,所以就很纳闷
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-25 11:36:06 | 显示全部楼层
FourReal 发表于 2021-9-24 16:07
用的哪个芯片,我可以发你一份串口+DMA控制的程序

目前看样子不能能仿照程序一样了,它的接收处理函数放在while一直循环(里面包含清零操作),我的程序做不到。
程序初衷是和源程序一样的:接收上位机指令,并存放数组中,在主函数whlie中用memcmp来判断处理。
之前程序写的跟源码一模一样性质,但现在改动如下(实现了我持续发送指令的操作以及接收错误指令后重新正常接收处理)
在串口中断语句
  1. void USART1_IRQHandler(void)
复制代码
,以及接收后处理语句
  1. void USART1_Recive(void)
复制代码

麻烦是麻烦了点,但实现我想要的功能
正常发送一次指令,位,作为结束位
abcd;

工程文件如下:
  1. https://jun7033.lanzouw.com/itzGhuh364f
  2. //密码:jun
复制代码

回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-9-25 11:40:30 | 显示全部楼层
pdwdzz 发表于 2021-9-24 16:31
那肯定是和你写的有不同之处的,不可能主函数一直清除计数还能接收到数组里。

确实,你的说法放在我这里是这样,但是针对于源程序我的疑问跟你一样,他为什么清零了还可以判断,除非中断接收是一次性都接受完发送的  stop 指令,然后才进入while(1)里面。但他确确实实完整接收到了stop 。
目前情况是我的接收过程中经过了while里面的清零语句
而源码接收过程中没有经过while清零语句,程序如上
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10882
金钱
10882
注册时间
2014-6-12
在线时间
1039 小时
发表于 2021-9-25 15:56:28 | 显示全部楼层
我改了一下,试下这个工程。 USART-STRING改.rar (4.24 MB, 下载次数: 8)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 10:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表