stm32串口中断接收数据存放数组问题

Bestatic 2017-12-19 05:12:21

本人目前在写一个32串口中断接收数据的程序,想把一串数据比如:A4 A2 A3 A4 A4...接收并存到一个数组中作数据分析,现在卡在了中断接收这一块,把数据接收到数组get_ch[8]之后,不能在主程序中使用这个数组并且进行数据分析,甚至不能将其元素赋给其他数组,不然串口就不能用。不知道是什么原因。求各位大佬救助!
...全文
3744 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
打赤脚的娃 2018-01-14
  • 打赏
  • 举报
回复
我以前遇到过一个数组溢出导致的此类问题,导致关键变量数据被修改,可以查查
tianxj001 2017-12-21
  • 打赏
  • 举报
回复
代码肯定有问题,中断不管有没有正确处理缓存数组,主函数是肯定可以正确访问该缓存的,我们处理STM32接受中断就是这样干的,由于串口的性质,该中断没必要用DMA来传输,一次中断传输一个就可以了,这样也不可能发生芯片内部总线冲突。
Bestatic 2017-12-21
  • 打赏
  • 举报
回复
引用 9 楼 tianxj001 的回复:
代码肯定有问题,中断不管有没有正确处理缓存数组,主函数是肯定可以正确访问该缓存的,我们处理STM32接受中断就是这样干的,由于串口的性质,该中断没必要用DMA来传输,一次中断传输一个就可以了,这样也不可能发生芯片内部总线冲突。
嗯,可能就是代码问题,会不会是某处不规范编译器优化掉了。我重新写了一遍,发现问题没有了,还是不知道什么原因。
Bestatic 2017-12-20
  • 打赏
  • 举报
回复
引用 5 楼 qq_20553613 的回复:
用环形FIFO。
谢谢提点,我学习学习。
Bestatic 2017-12-20
  • 打赏
  • 举报
回复
引用 4 楼 qq_33355048 的回复:
我之前做马达转速测量和控制的程序时,是中断引用main函数里面的变量,即在main函数里面定义一个全局变量,然后在中断的文件里面用extern声明需要调用的外部(主函数)变量。你可以试试这个方法,可以把结果输出给显示屏看看,这样更容易发现问题
嗯,好的,明天试试。
Bestatic 2017-12-20
  • 打赏
  • 举报
回复
[quote=引用 3 楼 wangfan027 的回复:] 我是需要把一大串的数据接收回来,按照特定的方式校验后进行数据分析,版主觉得那种方式更合适? 目前的BUG是程序中访问后就跳进了一个硬件错误处理函数。不知是什么原因。 单步调试的现象就是开始就跳进了“stm32f10x_it.c”里下面这个函数: void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } }
Acuity. 2017-12-20
  • 打赏
  • 举报
回复
用环形FIFO。
一点点的努力 2017-12-20
  • 打赏
  • 举报
回复
我之前做马达转速测量和控制的程序时,是中断引用main函数里面的变量,即在main函数里面定义一个全局变量,然后在中断的文件里面用extern声明需要调用的外部(主函数)变量。你可以试试这个方法,可以把结果输出给显示屏看看,这样更容易发现问题
dceacho 2017-12-20
  • 打赏
  • 举报
回复
引用 2 楼 sinat_34125910 的回复:
想问下用FIFO建立缓冲区和提前建立一个容量大的数组存放有什么不同?是因为进中断数据会被保护起来吗?
FIFO一般比较小,多是硬件实现的,就像串口,数据到了硬件自动丢FIFO里不需要程序额外处理 如果用普通的RAM存,来一个处理一个效率太低了
引用
把数据接收到数组get_ch[8]之后,不能在主程序中使用这个数组并且进行数据分析,甚至不能将其元素赋给其他数组,不然串口就不能用
看你这说的不像是BUF问题而是语法问题 你定义全局数组,中断里不可能无法访问,或者访问后就报错 估计是数组的定义引用问题
Bestatic 2017-12-20
  • 打赏
  • 举报
回复
想问下用FIFO建立缓冲区和提前建立一个容量大的数组存放有什么不同?是因为进中断数据会被保护起来吗?
dceacho 2017-12-19
  • 打赏
  • 举报
回复
Ring Buffer 你可以百度一下用法 中断里面按顺序存 主程序在后面查询,比如中断积累接收了100个字节,主程序就查询到100,看看收到几个有效的指令
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于stm32+esp8266+GPS+mqtt+ds18b20+RFID+蜂鸣器的物联网景区管理系统源码+项目说明.zip # ToOneNetByMqtt **简介:** ESP8266通过MQTT协议将数据传输至OnenNet云平台 #### 3. 硬件环境: 1. stm32f103 c8t6 2. GPS模块 3. rfid 4. DS18B20 5. ESP8266-01S无线模块 #### 4. 云平台环境配置: 1. **云平台配置:** - OneNET控制台—全部产品服务(多协议接入,选MQTT旧版)—添加产品—进入产品(记住产品ID)—设备列表—添加设备(记住鉴权信息)—创建完成(记住设备ID) 2. **云平台应用设置:** - 添加应用—编辑应用—组件库中添加折线图和开关 - 折线图(数据上传成功后进行配置): 选择数据流 — 选择设备—数据流选择要显示的数据(这里选择温度,temperature) - 开关(数据上传成功后进行配置): 选择数据流 — 选择设备—数据流选择要显示的数据(这里选择温度,ledFlag)—开关开值(LEDON)—开关关值(LEDOFF)——EDP不填 #### 5. 接线: 1. ESP8266-01S(5根线) - PA2 RX - PA3 TX - PB1 复位 - 3V3 VCC - GND GND 3. LED(最小系统自带) - PC13 LED1 4.一些常用操作 接线: I.ch340 <----> stm32 (串口1通信 用于调试显示) PA9 <----> RXD PA10 <----> TXD III.电脑要连热点 IV.stm32 <----> GPS (串口3通信) GND <----> GND 3.3V <----> VCC PB10 <----> RXD PB11 <----> TXD 有源天线接上放在室外闲置几分钟 #### 6. 功能展示: 1. **数据流**![image-20201223113457360](./images/data.png) 2. **APP应用管理** ![image-20201223113558021](./images/APP.png) 3. **串口数据** ![image-20201223113700277](./images/serial.png) 4. **源码简要解析** ![image-20201223113912384](./images/code.png) - stm32f10x_it.c:中断处理函数 - usart1.c:与上位机通信 - usart2.c:与ESP8266通信,串口2接收中断处理上位机发送来的数据 - timer2.c:定时器2中断用来发送GPS数据,体温,30S - timer3.c:定时器3中断用来发送心跳包(ping,用于保持和服务器连接,长时间没给服务器发送数据会被踢下线),2s和30s两种模式 - timer4.c:将串口2接收到的服务器数据依次存放在MQTT接收缓存数组中,50ms - control.c:控制LED灯,并且发送LED灯开关信号 #### 7. 要修改的的地方: 1. mqtt.h : ```c #define PRODUCTID "412380" //自己的产品ID #define DEVICEID "702197187" //自己的设备ID #define AUTHENTICATION "SHT30" //自己的鉴权信息(创建设备的时候设置) ``` ![./image-20201223112140673](./images/__MQTT_H.png) 2. wifi.h ```c #define SSID "Redmi K30 Ultra" //路由器SSID名称 #define PASS "stm32f407" //路由器密

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧