找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1973|回复: 0
打印 上一主题 下一主题
收起左侧

stm32把IMU测量数据通过nrf24l01无线通信 源程序

[复制链接]
跳转到指定楼层
楼主
ID:828888 发表于 2021-3-16 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32把IMU测量数据通过nrf24l01无线通信,同时通过串口助手观察通信是否成功。需要两块32的单片机进行通信

单片机源程序如下:

  1. #include "main.h"                //main.h 中含有TX/RX、软件SPI/硬件SPI选择配置选项
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include "Main.h"
  5. #include "stm32f10x_rcc.h"
  6. #include "stm32f10x_gpio.h"
  7. #include "drv_UART.h"
  8. #include "UART2.h"
  9. #include "drv_delay.h"
  10. #include "JY901.h"
  11. #include "celiang.h"


  12. uint8_t g_UartRxBuffer1[ 100 ] = "zmbyaaaaa";
  13. const char *g_Ashining = "receive";
  14. uint8_t g_TxMode = 0, g_UartRxFlag = 0;
  15. uint8_t g_UartRxBuffer[ 100 ] = { 0 };
  16. uint8_t g_RF24L01RxBuffer[ 32 ] = { 0 };

  17. struct SAcc                 stcAcc;                                        //加速度
  18. struct SGyro                 stcGyro;                                //角速度
  19. struct SAngle         stcAngle;    //角度


  20. //CopeSerialData为串口2中断调用函数,串口每收到一个数据,调用一次这个函数。
  21. void CopeSerial2Data(unsigned char ucData)
  22. {
  23.         static unsigned char ucRxBuffer[250];
  24.         static unsigned char ucRxCnt = 0;        

  25.         ucRxBuffer[ucRxCnt++]=ucData;        //将收到的数据存入缓冲区中
  26.         if (ucRxBuffer[0]!=0x55) //数据头不对,则重新开始寻找0x55数据头
  27.         {
  28.                 ucRxCnt=0;
  29.                 return;
  30.         }
  31.         if (ucRxCnt<9) {return;}//数据不满11个,则返回
  32.         else
  33.         {
  34.                 switch(ucRxBuffer[1])//判断数据是哪种数据,然后将其拷贝到对应的结构体中,有些数据包需要通过上位机打开对应的输出后,才能接收到这个数据包的数据
  35.                 {
  36.         //memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据结构体里面,从而实现数据的解析。
  37.                         case 0x51:        memcpy(&stcAcc,&ucRxBuffer[2],8);break;
  38.                         case 0x52:        memcpy(&stcGyro,&ucRxBuffer[2],8);break;
  39.             case 0x53:        memcpy(&stcAngle,&ucRxBuffer[2],8);break;
  40.                
  41.                 }
  42.                 ucRxCnt=0;//清空缓存区
  43.         }
  44. }


  45. void CopeSerial1Data(unsigned char ucData)
  46. {        
  47.         UART2_Put_Char(ucData);//转发串口1收到的数据给串口2(JY模块)
  48. }



  49. uint16_t Array_Size(uint8_t  * array_pt)
  50. {
  51.    uint8_t * pt;
  52.         uint16_t size;
  53.         for(pt = array_pt; *pt != '\n'; pt++)
  54.         {
  55.                 size++;        
  56.         }
  57.         return size;
  58. }

  59. int main( void )
  60. {        

  61.                         uint8_t j = 0;
  62.         //celiang();
  63.         //                date();
  64.                
  65.                 /******IMU的初始化****/

  66.                 char str[100];
  67.         
  68.         
  69.         unsigned char len,i;

  70.         Initial_UART1(9600);//接PC的串口
  71.         Initial_UART2(9600);//接JY-901模块的串口        
  72.         drv_delay_init();
  73.         drv_delay_500Ms(2);  //等等JY-91初始化完成
  74.                
  75.                
  76.                 /********无线的初始化 *******/
  77.         
  78.                 //串口初始化  
  79.                
  80.         drv_uart_init( 9600 );
  81.                
  82.         
  83.         //延时初始化
  84.         
  85.         drv_delay_init( );
  86. //        
  87.                 drv_button_init( );
  88.         
  89.         
  90.         //LED初始化
  91.         drv_led_init( );

  92.         //SPI初始化
  93.         drv_spi_init( );
  94.         
  95.         //RF24L01引脚初始化
  96.         NRF24L01_Gpio_Init( );
  97.         
  98.         //检测nRF24L01
  99.         NRF24L01_check( );                        
  100.         RF24L01_Init( );

  101.         led_red_off( );
  102.         led_green_off( );

  103.                 for( j = 0; j< 6; j++ )
  104.         {
  105.                 led_red_flashing( );
  106.                 led_green_flashing( );
  107.                 drv_delay_500Ms( 1 );
  108.         }
  109.         /*******************循环*****/        
  110.                
  111.         while(1)
  112.         {                        
  113.                
  114.                
  115.                         drv_delay_500Ms(2);
  116.                 drv_delay_ms(10);
  117.                 //角加速度
  118.         
  119.                 //输出加速度
  120.                 sprintf(str,"Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
  121.                         UART1_Put_String(str);
  122.         //        dengdai (str);
  123.          
  124.         //        j=Array_Size(str)+3;
  125.                
  126.                
  127.                 NRF24L01_TxPacket(str ,28);
  128.                
  129.                         drv_delay_ms(10);
  130.                 //输出角速度
  131.                 sprintf(str,"Gyro:%.3f %.3f %.3f\r\n",(float)stcGyro.w[0]/32768*2000,(float)stcGyro.w[1]/32768*2000,(float)stcGyro.w[2]/32768*2000);
  132.                         UART1_Put_String(str);
  133.                 drv_delay_ms(10);;
  134.                 //输出角度
  135.                 sprintf(str,"Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);
  136.                         UART1_Put_String(str);
  137.         drv_delay_ms(10);
  138.         drv_delay_ms(10);//等待传输完成
  139.                 led_red_flashing( );
  140.                
  141.         
  142.         //按键初始化
  143.         //drv_button_init( );
  144.         
  145. //        RF24L01_Set_Mode( MODE_TX );                //发送模式
  146.         
  147. //模式切换
  148. //                if( BUTOTN_PRESS_DOWN == drv_button_check( ))
  149. //                {
  150. //                        g_TxMode = 1 - g_TxMode;                //模式会在 TX_MODE_1( 0 ),TX_MODE_2( 1 )之间切换
  151. //                        
  152. //                        //状态显示清零
  153. //                        led_green_off( );
  154. //                        led_red_off( );
  155. //                        
  156. //                        if( TX_MODE_1 == g_TxMode )
  157. //                        {
  158. //                                for( j = 0; j < 6; j++ )               
  159. //                                {
  160. //                                        led_red_flashing( );        //固定发送模式,红灯闪烁3次
  161. //                                        drv_delay_500Ms( 1 );               
  162. //                                }
  163. //                        }
  164. //                        else
  165. //                        {
  166. //                                for( j = 0; j < 6; j++ )
  167. //                                {
  168. //                                        led_green_flashing( );        //串口发送模式,绿灯闪烁3次
  169. //                                        drv_delay_500Ms( 1 );
  170. //                                }
  171. //                        }
  172. //                }
  173. //               
  174. //                //发送
  175. //                if( TX_MODE_1 == g_TxMode )
  176. //                {
  177. //                        NRF24L01_TxPacket( (uint8_t *)g_Ashining,8);                //模式1发送固定字符,1S一包
  178. //                        drv_delay_500Ms( 1 );        
  179. //                        drv_delay_500Ms( 1 );        
  180. //                        led_red_flashing( );                        
  181. //                }
  182. //                else
  183. //                {        
  184. //                        //查询串口数据
  185. //               
  186. //                        j = drv_uart_rx_bytes( g_UartRxBuffer);
  187. //                        
  188. //                        if( 0 != j)
  189. //                        {
  190. //                                NRF24L01_TxPacket( g_UartRxBuffer, j );
  191. //                                led_green_flashing( );
  192. //                  }
  193. //                }
  194. //        
  195. //               
  196.         }
  197.         
  198.         
  199.         
  200. }
复制代码

以上代码51hei提供下载:
发送接收.7z (120.58 KB, 下载次数: 15)


评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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