开发平台为 VSCode 和 platformIO,C语言。用到了串口0和串口2
需要用到一个STM32官方例程中的一个库,我也贴上来了,直接复制本文代码即可用。
- // JY901.h
- #ifndef JY901_h
- #define JY901_h
-
- #define SAVE 0x00
- #define CALSW 0x01
- #define RSW 0x02
- #define RRATE 0x03
- #define BAUD 0x04
- #define AXOFFSET 0x05
- #define AYOFFSET 0x06
- #define AZOFFSET 0x07
- #define GXOFFSET 0x08
- #define GYOFFSET 0x09
- #define GZOFFSET 0x0a
- #define HXOFFSET 0x0b
- #define HYOFFSET 0x0c
- #define HZOFFSET 0x0d
- #define D0MODE 0x0e
- #define D1MODE 0x0f
- #define D2MODE 0x10
- #define D3MODE 0x11
- #define D0PWMH 0x12
- #define D1PWMH 0x13
- #define D2PWMH 0x14
- #define D3PWMH 0x15
- #define D0PWMT 0x16
- #define D1PWMT 0x17
- #define D2PWMT 0x18
- #define D3PWMT 0x19
- #define IICADDR 0x1a
- #define LEDOFF 0x1b
- #define GPSBAUD 0x1c
-
- #define YYMM 0x30
- #define DDHH 0x31
- #define MMSS 0x32
- #define MS 0x33
- #define AX 0x34
- #define AY 0x35
- #define AZ 0x36
- #define GX 0x37
- #define GY 0x38
- #define GZ 0x39
- #define HX 0x3a
- #define HY 0x3b
- #define HZ 0x3c
- #define Roll 0x3d
- #define Pitch 0x3e
- #define Yaw 0x3f
- #define TEMP 0x40
- #define D0Status 0x41
- #define D1Status 0x42
- #define D2Status 0x43
- #define D3Status 0x44
- #define PressureL 0x45
- #define PressureH 0x46
- #define HeightL 0x47
- #define HeightH 0x48
- #define LonL 0x49
- #define LonH 0x4a
- #define LatL 0x4b
- #define LatH 0x4c
- #define GPSHeight 0x4d
- #define GPSYAW 0x4e
- #define GPSVL 0x4f
- #define GPSVH 0x50
-
- #define DIO_MODE_AIN 0
- #define DIO_MODE_DIN 1
- #define DIO_MODE_DOH 2
- #define DIO_MODE_DOL 3
- #define DIO_MODE_DOPWM 4
- #define DIO_MODE_GPS 5
-
- struct STime
- {
- unsigned char ucYear;
- unsigned char ucMonth;
- unsigned char ucDay;
- unsigned char ucHour;
- unsigned char ucMinute;
- unsigned char ucSecond;
- unsigned short usMiliSecond;
- };
- struct SAcc
- {
- short a[3];
- short T;
- };
- struct SGyro
- {
- short w[3];
- short T;
- };
- struct SAngle
- {
- short Angle[3];
- short T;
- };
- struct SMag
- {
- short h[3];
- short T;
- };
-
- struct SDStatus
- {
- short sDStatus[4];
- };
-
- struct SPress
- {
- long lPressure;
- long lAltitude;
- };
-
- struct SLonLat
- {
- long lLon;
- long lLat;
- };
-
- struct SGPSV
- {
- short sGPSHeight;
- short sGPSYaw;
- long lGPSVelocity;
- };
- struct SQuater
- {
- short q0;
- short q1;
- short q2;
- short q3;
- };
- struct SSN
- {
- short sSVNum;
- short sPDOP;
- short sHDOP;
- short sVDOP;
- };
- class CJY901
- {
- public:
- 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 SQuater stcQuater;
- struct SSN stcSN;
-
- CJY901 ();
- void StartIIC();
- void StartIIC(unsigned char ucAddr);
- void CopeSerialData(unsigned char ucData);
- short ReadWord(unsigned char ucAddr);
- void WriteWord(unsigned char ucAddr,short sData);
- void ReadData(unsigned char ucAddr,unsigned char ucLength,char chrData[]);
- void GetTime();
- void GetAcc();
- void GetGyro();
- void GetAngle();
- void GetMag();
- void GetPress();
- void GetDStatus();
- void GetLonLat();
- void GetGPSV();
-
- private:
- unsigned char ucDevAddr;
- void readRegisters(unsigned char deviceAddr,unsigned char addressToRead, unsigned char bytesToRead, char * dest);
- void writeRegister(unsigned char deviceAddr,unsigned char addressToWrite,unsigned char bytesToRead, char *dataToWrite);
- };
- extern CJY901 JY901;
- #include
- #endif
- // JY901.cpp
- #include "JY901.h"
- #include "string.h"
-
- CJY901 ::CJY901 ()
- {
- ucDevAddr =0x50;
- }
- void CJY901::StartIIC()
- {
- ucDevAddr = 0x50;
- Wire.begin();
- }
- void CJY901::StartIIC(unsigned char ucAddr)
- {
- ucDevAddr = ucAddr;
- Wire.begin();
- }
- void CJY901 ::CopeSerialData(unsigned char ucData)
- {
- static unsigned char ucRxBuffer[250];
- static unsigned char ucRxCnt = 0;
-
- ucRxBuffer[ucRxCnt++]=ucData;
- if (ucRxBuffer[0]!=0x55)
- {
- ucRxCnt=0;
- return;
- }
- if (ucRxCnt<11) {return;}
- else
- {
- switch(ucRxBuffer[1])
- {
- case 0x50: memcpy(&stcTime,&ucRxBuffer[2],8);break;
- case 0x51: memcpy(&stcAcc,&ucRxBuffer[2],8);break;
- case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break;
- case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break;
- case 0x54: memcpy(&stcMag,&ucRxBuffer[2],8);break;
- case 0x55: memcpy(&stcDStatus,&ucRxBuffer[2],8);break;
- case 0x56: memcpy(&stcPress,&ucRxBuffer[2],8);break;
- case 0x57: memcpy(&stcLonLat,&ucRxBuffer[2],8);break;
- case 0x58: memcpy(&stcGPSV,&ucRxBuffer[2],8);break;
- case 0x59: memcpy(&stcQuater,&ucRxBuffer[2],8);break;
- case 0x5a: memcpy(&stcSN,&ucRxBuffer[2],8);break;
- }
- ucRxCnt=0;
- }
- }
- void CJY901::readRegisters(unsigned char deviceAddr,unsigned char addressToRead, unsigned char bytesToRead, char * dest)
- {
- Wire.beginTransmission(deviceAddr);
- Wire.write(addressToRead);
- Wire.endTransmission(false); //endTransmission but keep the connection active
-
- Wire.requestFrom(deviceAddr, bytesToRead); //Ask for bytes, once done, bus is released by default
-
- while(Wire.available() < bytesToRead); //Hang out until we get the # of bytes we expect
-
- for(int x = 0 ; x < bytesToRead ; x++)
- dest[x] = Wire.read();
- }
- void CJY901::writeRegister(unsigned char deviceAddr,unsigned char addressToWrite,unsigned char bytesToRead, char *dataToWrite)
- {
- Wire.beginTransmission(deviceAddr);
- Wire.write(addressToWrite);
- for(int i = 0 ; i < bytesToRead ; i++)
- Wire.write(dataToWrite[i]);
- Wire.endTransmission(); //Stop transmitting
- }
-
- short CJY901::ReadWord(unsigned char ucAddr)
- {
- short sResult;
- readRegisters(ucDevAddr, ucAddr, 2, (char *)&sResult);
- return sResult;
- }
- void CJY901::WriteWord(unsigned char ucAddr,short sData)
- {
- writeRegister(ucDevAddr, ucAddr, 2, (char *)&sData);
- }
- void CJY901::ReadData(unsigned char ucAddr,unsigned char ucLength,char chrData[])
- {
- readRegisters(ucDevAddr, ucAddr, ucLength, chrData);
- }
-
- void CJY901::GetTime()
- {
- readRegisters(ucDevAddr, 0x30, 8, (char*)&stcTime);
- }
- void CJY901::GetAcc()
- {
- readRegisters(ucDevAddr, AX, 6, (char *)&stcAcc);
- }
- void CJY901::GetGyro()
- {
- readRegisters(ucDevAddr, GX, 6, (char *)&stcGyro);
- }
-
- void CJY901::GetAngle()
- {
- readRegisters(ucDevAddr, Roll, 6, (char *)&stcAngle);
- }
- void CJY901::GetMag()
- {
- readRegisters(ucDevAddr, HX, 6, (char *)&stcMag);
- }
- void CJY901::GetPress()
- {
- readRegisters(ucDevAddr, PressureL, 8, (char *)&stcPress);
- }
- void CJY901::GetDStatus()
- {
- readRegisters(ucDevAddr, D0Status, 8, (char *)&stcDStatus);
- }
- void CJY901::GetLonLat()
- {
- readRegisters(ucDevAddr, LonL, 8, (char *)&stcLonLat);
- }
- void CJY901::GetGPSV()
- {
- readRegisters(ucDevAddr, GPSHeight, 8, (char *)&stcGPSV);
- }
- CJY901 JY901 = CJY901();
- // main.cpp
- #include
- #include
- #include
- #include
-
- void setup()
- {
- Serial.begin(9600);
- Serial2.begin(9600);
- }
-
- void loop()
- {
- //print received data. Data was received in serialEvent;
- Serial.print("Time:20");
- Serial.print(JY901.stcTime.ucYear);
- Serial.print("-");
- Serial.print(JY901.stcTime.ucMonth);
- Serial.print("-");
- Serial.print(JY901.stcTime.ucDay);
- Serial.print(" ");Serial.print(JY901.stcTime.ucHour);
- Serial.print(":");Serial.print(JY901.stcTime.ucMinute);
- Serial.print(":");
- Serial.println((float)JY901.stcTime.ucSecond+(float)JY901.stcTime.usMiliSecond/1000);
-
- Serial.print("Acc:");
- Serial.print((float)JY901.stcAcc.a[0]/32768*16);
- Serial.print(" ");
- Serial.print((float)JY901.stcAcc.a[1]/32768*16);
- Serial.print(" ");
- Serial.println((float)JY901.stcAcc.a[2]/32768*16);
-
- Serial.print("Gyro:");
- Serial.print((float)JY901.stcGyro.w[0]/32768*2000);
- Serial.print(" ");
- Serial.print((float)JY901.stcGyro.w[1]/32768*2000);
- Serial.print(" ");
- Serial.println((float)JY901.stcGyro.w[2]/32768*2000);
-
- Serial.print("Angle:");
- Serial.print((float)JY901.stcAngle.Angle[0]/32768*180);
- Serial.print(" ");
- Serial.print((float)JY901.stcAngle.Angle[1]/32768*180);
- Serial.print(" ");
- Serial.println((float)JY901.stcAngle.Angle[2]/32768*180);
-
- Serial.print("Mag:");
- Serial.print(JY901.stcMag.h[0]);
- Serial.print(" ");
- Serial.print(JY901.stcMag.h[1]);
- Serial.print(" ");
- Serial.println(JY901.stcMag.h[2]);
-
- Serial.print("Pressure:");
- Serial.print(JY901.stcPress.lPressure);
- Serial.print(" ");
- Serial.println((float)JY901.stcPress.lAltitude/100);
-
- Serial.print("DStatus:");
- Serial.print(JY901.stcDStatus.sDStatus[0]);
- Serial.print(" ");
- Serial.print(JY901.stcDStatus.sDStatus[1]);
- Serial.print(" ");
- Serial.print(JY901.stcDStatus.sDStatus[2]);
- Serial.print(" ");
- Serial.println(JY901.stcDStatus.sDStatus[3]);
-
- Serial.print("Longitude:");
- Serial.print(JY901.stcLonLat.lLon/10000000);
- Serial.print("Deg");
- Serial.print((double)(JY901.stcLonLat.lLon % 10000000)/1e5);
- Serial.print("m Lattitude:");
- Serial.print(JY901.stcLonLat.lLat/10000000);
- Serial.print("Deg");
- Serial.print((double)(JY901.stcLonLat.lLat % 10000000)/1e5);
- Serial.println("m");
-
- Serial.print("GPSHeight:");
- Serial.print((float)JY901.stcGPSV.sGPSHeight/10);
- Serial.print("m GPSYaw:");
- Serial.print((float)JY901.stcGPSV.sGPSYaw/10);
- Serial.print("Deg GPSV:");
- Serial.print((float)JY901.stcGPSV.lGPSVelocity/1000);
- Serial.println("km/h");
-
- Serial.print("SN:");
- Serial.print(JY901.stcSN.sSVNum);
- Serial.print(" PDOP:");
- Serial.print((float)JY901.stcSN.sPDOP/100);
- Serial.print(" HDOP:");
- Serial.print((float)JY901.stcSN.sHDOP/100);
- Serial.print(" VDOP:");
- Serial.println((float)JY901.stcSN.sVDOP/100);
-
- Serial.println("");
- delay(2000);
-
- while (Serial2.available())
- {
- JY901.CopeSerialData(Serial2.read());
- }
- }
有问题请留言~