LSM303DLH六轴角度传感器驱动
最近使用了意法半导体的LSM303DLH六轴角度传感器,使用软件IIC通讯,我主要使用Z轴加速度计算垂直方向倾角,使用磁场传感器计算水平旋转角。
//LSM303DLH.c
/************************************************************************************************************** 文件名: LSM303DLH.c* 功能: LSM303DLH驱动* 作者: cp1300@139.com* 创建时间: 2019-01-10* 最后修改时间: 2019-01-10* 详细: LSM303DLH六轴角度传感器依赖SoftwareIIC
*************************************************************************************************************/
#include "system.h"
#include "LSM303DLH.h"
#include "math.h"
#include <stdio.h>
#include "SoftwareIIC.h"//调试宏开关
#define LSM303DLH_DBUG 1
#if LSM303DLH_DBUG#include "system.h"#define LSM303DLH_Debug(format,...) uart_printf(format,##__VA_ARGS__)
#else#define LSM303DLH_Debug(format,...) /\
/
#endif //LSM303DLH_DBUG#define PI 3.1415926535898u8 LSM303DLH_ReadOneReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr); //LSM303DLH读取一个寄存器
void LSM303DLH_ReadMultReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr, u8 RegNum, u8 DataBuff[]); //LSM303DLH读取多个寄存器
void LSM303DLH_WriteOneReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr,u8 data); //LSM303DLH写一个寄存器/*************************************************************************************************************************
*函数 : LSM303DLH_Init(LSM303DLH_HANDLE *pHandle, u8 SlaveAddr)
*功能 : LSM303DLH初始化
*参数 : pHandle:句柄;SlaveAddr_A:加速度传感器通讯地址;SlaveAddr_M:磁场传感器通讯地址;
*返回 : TRUE:初始化成功;FALSE:初始化失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2019-01-30
*最后修改时间 : 2019-01-30
*说明 :
*************************************************************************************************************************/
bool LSM303DLH_Init(LSM303DLH_HANDLE *pHandle, u8 SlaveAddr_A, u8 SlaveAddr_M)
{u8 temp;u8 retry = 0;if(pHandle == NULL) return FALSE;pHandle->SlaveAddr_A = SlaveAddr_A; //加速度传感器通讯地址pHandle->SlaveAddr_M = SlaveAddr_M; //磁场传感器通讯地址for(retry = 0;retry < 3;retry ++){LSM303DLH_WriteOneReg(pHandle, LSM303_CTRL_REG1_A_0x20, 0x27); //正常模式,50Hz速度SYS_DelayMS(1); //延时3mstemp = LSM303DLH_ReadOneReg(pHandle, LSM303_CTRL_REG1_A_0x20); //读取0x20寄存器,默认值为0x07if(temp != 0x27) //值不对{uart_printf("初始化失败,LSM303_CTRL_REG1_A_0x20默认值错误:0x%02X\r\n", temp);SYS_DelayMS(10); }else break;}if(temp != 0x27) //值不对{return FALSE;}SYS_DelayMS(1); //延时1msfor(retry = 0;retry < 3;retry ++){LSM303DLH_WriteOneReg(pHandle, LSM303_CRA_REG_M_0x00, 0x10); //磁场传感器15Hz,正常测量SYS_DelayMS(1); //延时1msLSM303DLH_WriteOneReg(pHandle, LSM303_MR_REG_M_0x02, 0x00); //磁场传感器连续转换模式SYS_DelayMS(1); //延时1mstemp = LSM303DLH_ReadOneReg(pHandle, LSM303_MR_REG_M_0x02); if(temp != 0) //值不对{uart_printf("初始化失败,LSM303_MR_REG_M_0x02值错误:0x%02X\r\n", temp);SYS_DelayMS(10); }else break;}return TRUE;
}/*************************************************************************************************************************
*函数 : u8 LSM303DLH_ReadOneReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr)
*功能 : LSM303DLH读取一个寄存器
*参数 : pHandle:句柄;RegAddr:寄存器地址
*返回 : 读取的寄存器值
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2018-04-09
*最后修改时间 : 2018-04-09
*说明 :
*************************************************************************************************************************/
u8 LSM303DLH_ReadOneReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr)
{u8 data;u8 SlaveAddr = (RegAddr>0x19)?pHandle->SlaveAddr_A:pHandle->SlaveAddr_M; //大于0x19的寄存器是加速度传感器SIIC_Start(&pHandle->IIC_Handle); //产生IIC起始信号if(SIIC_SendByte(&pHandle->IIC_Handle, SlaveAddr) == FALSE) //发送设备地址+写信号{DEBUG("没有收到ACK\r\n");}SIIC_SendByte(&pHandle->IIC_Handle, RegAddr); //发送寄存器地址SIIC_Start(&pHandle->IIC_Handle); //产生IIC起始信号SIIC_SendByte(&pHandle->IIC_Handle, SlaveAddr|BIT0); //发送设备地址+读信号data = SIIC_ReadByte(&pHandle->IIC_Handle, TRUE); //SIIC读取一个字节SIIC_Stop(&pHandle->IIC_Handle); //产生IIC停止信号return data;
}/*************************************************************************************************************************
*函数 : void LSM303DLH_ReadMultReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr, u8 RegNum, u8 DataBuff[])
*功能 : LSM303DLH读取多个寄存器
*参数 : pHandle:句柄;RegAddr:寄存器地址;RegNum:寄存器数量;DataBuff:返回结果缓冲区
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2018-04-09
*最后修改时间 : 2018-04-09
*说明 :
*************************************************************************************************************************/
void LSM303DLH_ReadMultReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr, u8 RegNum, u8 DataBuff[])
{u8 i;u8 SlaveAddr = (RegAddr>0x19)?pHandle->SlaveAddr_A:pHandle->SlaveAddr_M; //大于0x19的寄存器是加速度传感器SIIC_Start(&pHandle->IIC_Handle); //产生IIC起始信号SIIC_SendByte(&pHandle->IIC_Handle, SlaveAddr); //发送设备地址+写信号SIIC_SendByte(&pHandle->IIC_Handle, RegAddr|BIT7); //发送寄存器地址,地址最高位为1意味着连续读取SIIC_Start(&pHandle->IIC_Handle); //产生IIC起始信号SIIC_SendByte(&pHandle->IIC_Handle, SlaveAddr|BIT0); //发送设备地址+读信号for(i = 0;i < RegNum;i ++){if(i == (RegNum-1)) //最后一字节不响应ACK{DataBuff[i] = SIIC_ReadByte(&pHandle->IIC_Handle, FALSE); //SIIC读取一个字节-NAK}else{DataBuff[i] = SIIC_ReadByte(&pHandle->IIC_Handle, TRUE); //SIIC读取一个字节-ACK} }SIIC_Stop(&pHandle->IIC_Handle); //产生IIC停止信号
}/*************************************************************************************************************************
*函数 : void LSM303DLH_WriteOneReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr,u8 data)
*功能 : LSM303DLH写一个寄存器
*参数 : pHandle:句柄;RegAddr:寄存器地址;data:要写入的值
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2018-04-09
*最后修改时间 : 2018-04-09
*说明 :
*************************************************************************************************************************/
void LSM303DLH_WriteOneReg(LSM303DLH_HANDLE *pHandle,LSM303DLH_REG_TYPE RegAddr,u8 data)
{u8 SlaveAddr = (RegAddr>0x19)?pHandle->SlaveAddr_A:pHandle->SlaveAddr_M; //大于0x19的寄存器是加速度传感器SIIC_Start(&pHandle->IIC_Handle); //产生IIC起始信号SIIC_SendByte(&pHandle->IIC_Handle, SlaveAddr); //发送设备地址+写信号SIIC_SendByte(&pHandle->IIC_Handle, RegAddr); //发送寄存器地址SIIC_SendByte(&pHandle->IIC_Handle, data); //发送要写入的数据SIIC_Stop(&pHandle->IIC_Handle); //产生IIC停止信号
}/*************************************************************************************************************************
*函数 : bool LSM303DLH_ReadAcceleration(LSM303DLH_HANDLE *pHandle, s16 *pXa,s16 *pYa, s16 *pZa)
*功能 : LSM303DLH 读取三轴加速度
*参数 : pHandle:句柄;pXa:返回X轴加速度;pYa:返回Y轴加速度;pZa:返回Z轴加速度
*返回 : TRUE:成功;FALSE:失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2019-01-30
*最后修改时间 : 2019-01-30
*说明 : 返回的数据直接就是有符号数,无需处理
*************************************************************************************************************************/
bool LSM303DLH_ReadAcceleration(LSM303DLH_HANDLE *pHandle, s16 *pXa,s16 *pYa, s16 *pZa)
{u8 buff[6];s16 temp;LSM303DLH_ReadMultReg(pHandle, LSM303_OUT_X_L_A_0x28, 6, buff); //读取数据temp = buff[1];temp<<=8;temp|= buff[0];*pXa = temp; //X轴temp = buff[3];temp<<=8;temp|= buff[2];*pYa = temp; //Y轴temp = buff[5];temp<<=8;temp|= buff[4];*pZa = temp; //Z轴return TRUE;
}/*************************************************************************************************************************
*函数 : bool LSM303DLH_ReadMagnetic(LSM303DLH_HANDLE *pHandle, s16 *pXm,s16 *pYm, s16 *pZm)
*功能 : LSM303DLH 读取磁场强度值
*参数 : pHandle:句柄;pXm:返回X轴磁场强度;pYm:返回Y轴磁场强度;pZm:返回Z轴磁场强度
*返回 : TRUE:成功;FALSE:失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2019-01-30
*最后修改时间 : 2019-01-30
*说明 : 返回的数据直接就是有符号数,无需处理
*************************************************************************************************************************/
bool LSM303DLH_ReadMagnetic(LSM303DLH_HANDLE *pHandle, s16 *pXm,s16 *pYm, s16 *pZm)
{u8 buff[6];s16 temp;LSM303DLH_ReadMultReg(pHandle, LSM303_OUT_X_H_M_0x03, 6, buff); //读取数据temp = buff[0];temp<<=8;temp|= buff[1];*pXm = temp; //X轴temp = buff[2];temp<<=8;temp|= buff[3];*pYm = temp; //Y轴temp = buff[4];temp<<=8;temp|= buff[5];*pZm = temp; //Z轴return TRUE;
}/*************************************************************************************************************************
*函数 : int LSM303DLH_CalculationZAxisAngle(s16 Ax, s16 Ay, s16 Az)
*功能 : LSM303DLH 计算Z轴倾角(扩大100倍)
*参数 : Ax,Ay,Az:3个轴的加速度;
*返回 : Z轴倾角
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2019-01-30
*最后修改时间 : 2019-01-30
*说明 :
*************************************************************************************************************************/
int LSM303DLH_CalculationZAxisAngle(s16 Ax, s16 Ay, s16 Az)
{double A;float fx,fy,fz;A = sqrt((int)Ax*Ax + (int)Ay*Ay + (int)Az*Az); //计算角加速度的矢量模长 |A|=根号下(X*X+Y*Y+Z*Z)fx = Ax/A;fy = Ay/A;fz = Az/A;//Z方向A = fx*fx+fy*fy;A = sqrt(A);A = (double)A/fz;A = atan(A); A = A*180/PI;if(A < 0){A += 90;A = 0-A;}else{A = 90-A;}/*uart_printf("temp=%d Az=%d\r\n",(int)A, Az);A = atan(Az/A);A = 90-A*360/PI;*/return A*100;
}/*************************************************************************************************************************
*函数 : int LSM303DLH_CalculationXAxisAngle(s16 Ax, s16 Ay, s16 Az)
*功能 : LSM303DLH 计算X轴倾角(扩大100倍)
*参数 : Ax,Ay,Az:3个轴的加速度;
*返回 : Z轴倾角
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2019-01-30
*最后修改时间 : 2019-01-30
*说明 :
*************************************************************************************************************************/
int LSM303DLH_CalculationXAxisAngle(s16 Ax, s16 Ay, s16 Az)
{double A;float fx,fy,fz;A = sqrt((int)Ax*Ax + (int)Ay*Ay + (int)Az*Az); //计算角加速度的矢量模长 |A|=根号下(X*X+Y*Y+Z*Z)fx = Ax/A;fy = Ay/A;fz = Az/A;//X方向A = fz*fz+fy*fy;A = sqrt(A);A = (double)A/fx;A = atan(A); A = A*180/PI;if(A < 0){A += 90; //向上为正}else{A = 90-A;A = 0-A; //向下为负}/*uart_printf("temp=%d Az=%d\r\n",(int)A, Az);A = atan(Az/A);A = 90-A*360/PI;*/return A*100;
}
//LSM303DLH.h
/************************************************************************************************************** 文件名: LSM303DLH.h* 功能: LSM303DLH驱动* 作者: cp1300@139.com* 创建时间: 2019-01-10* 最后修改时间: 2019-01-10* 详细: LSM303DLH六轴角度传感器依赖SoftwareIIC
*************************************************************************************************************/
#ifndef _LSM303DLH_H_
#define _LSM303DLH_H_
#include "system.h"
#include "SoftwareIIC.h"//LSM303DLH 寄存器定义
typedef enum
{//罗盘LSM303_CRA_REG_M_0x00 = 0x00, //RWLSM303_CRB_REG_M_0x01 = 0x01, //RWLSM303_MR_REG_M_0x02 = 0x02, //RWLSM303_OUT_X_H_M_0x03 = 0x03, //RLSM303_OUT_X_L_M_0x04 = 0x04, //RLSM303_OUT_Y_H_M_0x05 = 0x05, //RLSM303_OUT_Y_L_M_0x06 = 0x06, //RLSM303_OUT_Z_H_M_0x07 = 0x07, //RLSM303_OUT_Z_L_M_0x08 = 0x08, //RLSM303_SR_REG_Mg_0x09 = 0x09, //RLSM303_IRA_REG_M_0x0A = 0x0A, //RLSM303_IRB_REG_M_0x0B = 0x0B, //RLSM303_IRC_REG_M_0x0C = 0x0C, //R//加速度LSM303_CTRL_REG1_A_0x20 = 0x20, //RWLSM303_CTRL_REG2_A_0x21 = 0x21, //RWLSM303_CTRL_REG3_A_0x22 = 0x22, //RWLSM303_CTRL_REG4_A_0x23 = 0x23, //RWLSM303_CTRL_REG5_A_0x24 = 0x24, //RWLSM303_HP_FILTER_RESET_A_0x25 = 0x25, //RLSM303_REFERENCE_A_0x26 = 0x26, //RWLSM303_STATUS_REG_A_0x27 = 0x27, //RLSM303_OUT_X_L_A_0x28 = 0x28, //RLSM303_OUT_X_H_A_0x29 = 0x29, //RLSM303_OUT_Y_L_A_0x2A = 0x2A, //RLSM303_OUT_Y_H_A_0x2B = 0x2B, //RLSM303_OUT_Z_L_A_0x2C = 0x2C, //RLSM303_OUT_Z_H_A_0x2D = 0x2D, //RLSM303_INT1_CFG_A_0x30 = 0x30, //RWLSM303_INT1_SOURCE_A_0x31 = 0x31, //RLSM303_INT1_THS_A_0x32 = 0x32, //RWLSM303_INT1_DURATION_A_0x33 = 0x33, //RWLSM303_INT2_CFG_A_0x34 = 0x34, //RWLSM303_INT2_SOURCE_A_0x35 = 0x35, //RLSM303_INT2_THS_A_0x36 = 0x36, //RWLSM303_INT2_DURATION_A_0x37 = 0x37, //RW
}LSM303DLH_REG_TYPE;//LSM303DLH 句柄
typedef struct
{SIIC_HANDLE IIC_Handle; //IIC接口u8 SlaveAddr_A; //加速度传感器通讯地址u8 SlaveAddr_M; //磁场传感器通讯地址
}LSM303DLH_HANDLE;bool LSM303DLH_Init(LSM303DLH_HANDLE *pHandle, u8 SlaveAddr_A, u8 SlaveAddr_M); //LSM303DLH初始化
bool LSM303DLH_ReadAcceleration(LSM303DLH_HANDLE *pHandle, s16 *pXa,s16 *pYa, s16 *pZa); //LSM303DLH 读取三轴加速度
bool LSM303DLH_ReadMagnetic(LSM303DLH_HANDLE *pHandle, s16 *pXm,s16 *pYm, s16 *pZm); //LSM303DLH 读取磁场强度值
int LSM303DLH_CalculationZAxisAngle(s16 Ax, s16 Ay, s16 Az); //LSM303DLH 计算Z轴倾角(扩大100倍)
int LSM303DLH_CalculationXAxisAngle(s16 Ax, s16 Ay, s16 Az); //LSM303DLH 计算X轴倾角(扩大100倍)#endif /*_LSM303DLH_H_*/
//测试
DS18B20_HANDLE DS18B20Handle; //DS18B20句柄
s16 DeviceTemp;
s16 Xa, Ya, Za;
int zDipAngle;LSM303DLH_DeInit(); //LSM303DLH硬件初始化//软件IIC初始化if(SIIC_Init(&g_SysFlag.LSM303DLH_Handle.IIC_Handle, LSM303DLH_SDA_GPIOX, LSM303DLH_SCL_GPIOX, LSM303DLH_SDA_GPIO_BIT, LSM303DLH_SCL_GPIO_BIT, 10) == FALSE) {DEBUG("软件IIC初始化失败!\r\n");}
LSM303DLH_Init(&g_SysFlag.LSM303DLH_Handle, 0x30, 0x3C); //LSM303DLH初始化LSM303DLH_ReadAcceleration(&g_SysFlag.LSM303DLH_Handle, &Xa, &Ya, &Za); //LSM303DLH 读取三轴加速度zDipAngle = LSM303DLH_CalculationZAxisAngle( Xa, Ya, Za); //LSM303DLH 计算Z轴倾角(扩大100倍)//uart_printf("X:%d;Y:%d;Z:%d; \t",Xa,Ya,Za);uart_printf("Z倾角:%d.%02d; \t", zDipAngle/100, abs(zDipAngle)%100);g_SysFlag.Angle = zDipAngle = LSM303DLH_CalculationXAxisAngle(Xa, Ya, Za); //LSM303DLH 计算X轴倾角(扩大100倍)uart_printf("X倾角:%d.%02d; \t", zDipAngle/100, abs(zDipAngle)%100);LSM303DLH_ReadMagnetic(&g_SysFlag.LSM303DLH_Handle, &Xa, &Ya, &Za); //LSM303DLH 读取磁场强度值uart_printf("X:%d;Y:%d;Z:%d;\r\n",Xa,Ya,Za);
//硬件接口宏定义
/
//LSM303DLH支持
//IO支持
#define LSM303DLH_SCL_GPIOX GPIOB //SCL GPIO
#define LSM303DLH_SCL_GPIO_BIT 5 //SCL 引脚位
#define LSM303DLH_SDA_GPIOX GPIOB //SDA GPIO
#define LSM303DLH_SDA_GPIO_BIT 6 //SDA 引脚位
#define LSM303DLH_SA0_A PBout(7) //地址选择//IO初始化函数
__inline void LSM303DLH_DeInit(void)
{SYS_DeviceClockEnable(DEV_GPIOB,TRUE); //GPIO B 时钟使能SYS_GPIOx_OneInit(GPIOB ,7 , OUT_PP, SPEED_25M);LSM303DLH_SA0_A = 0; //地址输出0
}
附上软件IIC接口:https://blog.csdn.net/cp1300/article/details/75644988
LSM303DLH六轴角度传感器驱动相关推荐
- abb机器人旋转六轴角度指令_ABB-120型号机器人的6个轴运动的角度范围各是多少?...
[单选题]设有程序段 int x=10; while (x=0) x=x-1; 则下面描述中正确的是 [单选题]若有整型变量x初值是3,则下列语句段的输出结果是( ). do cout< [单选 ...
- 两个软件相互交换数据_六轴算法机软件使用说明
RAA (1.00a) ( Robot Arm Algorithms 1.00a 六轴算法机软件使用说明 : 作者觉得,在实际应用中,正逆解求解工具可以理解为一个类似数学计算器的 东西:不需要每个研究 ...
- 六轴机器人 宝元系统_庆云大国重器上线六轴智能焊接机器人,锻造高质量发展硬核...
在大国重器坚持创新发展道路上,不断"借智"发展,提升科研保障能力,追求国际先进水平,为企业发展提供强劲动能. 六轴智能焊接机器人 六轴智能焊接机器人是大国重器自动化设备股份有限公司 ...
- 如何利用小熊派获取MPU6050六轴原始数据
摘要:使用小熊派开发板,通过硬件IIC与MPU6050六轴传感器模块通信,完成相应寄存器配置,成功获取陀螺仪.加速度计数据. 本问主要讲述使用小熊派开发板+MPU6050六轴传感器,获取加速度计以及陀 ...
- 机器人建模中移动关节如何建立坐标系_解析:四轴机器人和六轴机器人有什么区别?---徕深科技...
工业机器人的轴,可以用专业的名词"自由度"来解释.合理推测就是,当机器人的轴数增加,机器人就有更高的灵活性.四轴SCARA机器人(以下简称四轴机器人)和六轴关节式机器人(以下简称六 ...
- 六轴机器人光机_四轴机器人与六轴机器人有什么区别?
小型装配机器人之所以获得越来越多包装企业的青睐,正在于它如今已可以胜任包括装配在内的各种包装生产任务,包括所有材料的处理,如取放.装卸.包装成型等包装前端流程相关的工序,以及打标签.检验.抽样等加工工 ...
- 维特智能六轴姿态传感器JY61P_stm32f1xx驱动代码解析
目录 硬件准备/上位机直连 代码驱动 关于官方给出的示例 代码功能及其走位 1.怎样不依托代码验证传感器的某个功能是否有效或者能用? 2.写寄存器的方式 3.为什么不使用WIT私有协议中的关闭上电输出 ...
- 编写简单的六轴机械臂
一.关键词: link 连杆 joint 连轴 orgin 原点 axis 轴 visual 视觉 geometry 几何 material 材料 collision 碰撞 inertial 惯量 f ...
- 面阵相机与六轴机器人之间通过偏差移动
面阵相机与六轴机器人之间通过偏差移动 相机拍照位固定,机器人安装固定①通过相机与机器人进行坐标系标定计算出像素分辨率②通过模板标定记录下机器人在拍照位的坐标和CCD检测特征点的坐标③检测时候只需要计算 ...
最新文章
- 深入理解SpringCloud之配置刷新
- 将近400篇原创后,有三AI喊你正式加入来不来?
- 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果
- [蓝桥杯][2016年第七届真题]压缩变换(主席树求区间不同数的个数)
- android ota更新app,企业 OTA 更新 | Android 开源项目 | Android Open Source Project
- angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景
- ArcGIS学习路线
- SLAM学习笔记 - ORB_SLAM2源码运行及分析
- UnityWebPlayer打开文件
- Windows镜像文件下载速度太慢?告诉你个小妙招
- 文件版本转换( AutoCAD、3dMax、SketchUp高版本转低版本 )
- LeetCode 69. x的平方根
- windows 搭建Web服务器和连接局域网打印机
- Python经典面试题解析:实现斐波那契数列
- HDU-4747 Mex
- vidda系统+android系统,海信电视精简教程,去除电视多余应用,换桌面!
- 为什么有全连接层的卷积网络输入图片尺寸需要固定的
- webservice的安全问题
- 《人月神话》作者去世,我们都曾读过他的书
- 如何把token存储到本地和headers中
热门文章
- 《高楼的性能工程实战课》学习所推荐的知识点
- 使用爬虫爬取天气历史数据(https://lishi.tianqi.com/)
- python爬取好友微信地区_python爬取微信信息--显示性别/地域/词云(附代码)
- 使用 canvas 和面向对象思想绘制流星动画
- 全国计算机等级考试一级(WIN7+OFFICE2010)作题练习指导
- 会PLC也能玩转机器视觉(一)
- Matlab 绘制双纵轴图
- [Ubuntu]使用DataDog集成跟踪Django项目
- 给 App 提速:Android 性能优化总结
- 微信web开发者工具-移动调试iphone端的调试