找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32串口接JY901源程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. /*
  2. 编写者:Kevin
  3. 编译环境:MDK-Lite  Version: 5.17
  4. 初版时间: 2016-1-31
  5. 功能:
  6. 用STM32Core平台串口2读取JY901的数据,然后通过串口1打印到串口助手,串口助手波特率要选为9600。
  7. JY-901的波特率要修改为9600.
  8. 注意:示例程序输出的是ASCLL码,用16进制(HEX)显示是不能看到准确数据的。
  9. 硬件接线:
  10. USB-TTL工具                 STM32Core                                                                                       JY901
  11. VCC          -----           VCC        --------------------------   VCC
  12. TX           -----           RX1(管脚10)                                                                            
  13. RX           -----           TX1(管脚9)                                                                       
  14. GND          -----           GND        --------------------------   GND
  15.               TX2(管脚2)RX2(管脚3)需要转换成485总线电平
  16.                                                                                                                                                                                                                                                 A    ----  A
  17.                                                                                                                                                                                                                                                 B    ----  B
  18. ------------------------------------
  19. */
  20. #include <string.h>
  21. #include <stdio.h>
  22. #include "Main.h"
  23. #include "stm32f10x_rcc.h"
  24. #include "stm32f10x_gpio.h"
  25. #include "UART1.h"
  26. #include "UART2.h"
  27. #include "delay.h"
  28. #include "JY901.h"
  29. #include "DIO.h"

  30. struct STime                stcTime;
  31. struct SAcc                 stcAcc;
  32. struct SGyro                 stcGyro;
  33. struct SAngle         stcAngle;
  34. struct SMag                 stcMag;
  35. struct SDStatus stcDStatus;
  36. struct SPress         stcPress;
  37. struct SLonLat         stcLonLat;
  38. struct SGPSV                 stcGPSV;
  39. struct SQ       stcQ;

  40. unsigned char cmd[8] = {0X50,0X03,0X00,0X34,0X00,0X0C,0X09,0X80};//读取0X34之后的12个寄存器

  41. void CharToShort(unsigned char cTemp[],short sTemp[],short sShortNum)
  42. {
  43.         int i;
  44.         for (i = 0;i<3;i++)
  45.                 sTemp[i] = (cTemp[2*i+sShortNum]<<8)|(cTemp[2*i+sShortNum+1]&0xff);
  46. }

  47. //CopeSerialData为串口2中断调用函数,串口每收到一个数据,调用一次这个函数。
  48. void CopeSerial2Data(unsigned char ucData)
  49. {
  50.         static unsigned char ucRxBuffer[250];
  51.         static unsigned char ucRxCnt = 0;       
  52.        

  53.         ucRxBuffer[ucRxCnt++]=ucData;        //将收到的数据存入缓冲区中
  54.         if (ucRxBuffer[0]!=0x50) //数据头不对,则重新开始寻找0x55数据头
  55.         {
  56.                 ucRxCnt=0;
  57.                 return;
  58.         }
  59.         if (ucRxCnt<29) {return;}//数据不满29个,则返回
  60.         else
  61.         {
  62.                 ucRxCnt=0;//清空缓存区,将接收缓冲区的字符拷贝到数据结构体里面,从而实现数据的解析。
  63.                 CharToShort(ucRxBuffer,stcAcc.a,3);
  64.                 CharToShort(ucRxBuffer,stcGyro.w,9);
  65.                 CharToShort(ucRxBuffer,stcMag.h,15);
  66.                 CharToShort(ucRxBuffer,stcAngle.Angle,21);               
  67.         }
  68. }

  69. void CopeSerial1Data(unsigned char ucData)
  70. {       
  71.         UART2_Put_Char(ucData);//转发串口1收到的数据给串口2(JY模块)
  72. }


  73. int main(void)
  74. {  
  75.         char str[100];
  76.                
  77.         SysTick_init(72,10);//设置时钟频率
  78.         Initial_UART1(9600);//接PC的串口
  79.         Initial_UART2(9600);//接WT901C485模块的串口       
  80.        
  81.         LED_ON();
  82.         delay_ms(1000);//等等WT901C485模初始化完成
  83.         while(1)
  84.         {                       
  85.                 UART2_Put_String(cmd,8);//发送读取0X34之后的12个寄存器,也就是加速度 角速度 角度和磁场
  86.                         delay_ms(500);
  87.                 //输出加速度
  88.                 printf("Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
  89.                         delay_ms(10);
  90.                 //输出角速度
  91.                 printf("Gyro:%.3f %.3f %.3f\r\n",(float)stcGyro.w[0]/32768*2000,(float)stcGyro.w[1]/32768*2000,(float)stcGyro.w[2]/32768*2000);
  92.                         delay_ms(10);
  93.                 //输出角度
  94.                 printf("Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);
  95.                         delay_ms(10);
  96.                 //输出磁场
  97.                 printf("Mag:%d %d %d\r\n\r\n",stcMag.h[0],stcMag.h[1],stcMag.h[2]);       
  98.                     delay_ms(10);//等待传输完成
  99.         }//主循环
  100. }
复制代码

代码下载,初学,仅供参考,如有错误请指正:
STM32Core串口JY901Modbus接串口助手.7z (460.02 KB, 下载次数: 15)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1001637 发表于 2022-1-13 10:29 | 只看该作者
struct STime                stcTime;
struct SAcc                 stcAcc;
struct SGyro                 stcGyro;
struct SAngle         stcAngle;
struct SMag                 stcMag;
struct SDStatus stcDStatus;
struct SPress         stcPress;
struct SLonLat         stcLonLat;
struct SGPSV                 stcGPSV;
struct SQ       stcQ;
这些是啥意思哇,定义的都是什么东西
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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