最近想做一个检测小孩或者是老人,在家摔倒项目。大致和大家说一下项目的框架。 要用到一个能检测运动姿态的传感器,最好是无线的。于是我在网上找了一款带蓝牙的姿态角度传感器。给大家看下这个模块。 下面和大家分享下代码
串口读取简单分为两个部分。1、配置单片机的UART口。2、数据处理部分了。下面和大家一一分享。
2.1配置单片机的UART口 我使用的是UART2,这个是用来连接那个HC-06的蓝牙芯片的。使用时钟、模式、速度等。都在下面大家参考下
void Initial_UART2(unsigned long baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART_ITConfig(USART2, USART_IT_TXE, DISABLE); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); USART_ClearFlag(USART2,USART_FLAG_TC); USART_Cmd(USART2, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }编写思维是这样的。当我的UART2接受到数据后就会存在我的ucRxBuffer[250]里,根据这个BWT901CL的通讯协议。我就开始判断我接受的数据里面是不是有55包头的数据。然后我还加了一个计数ucRxCnt。加在一起我会判断。整个数据的长度是不是11位数据。最后,根据商家给的通讯协议里。50代表时间、51加速度、52角速度、53角度、54磁场等,我再判断我的这11位数据的第二位是上面的哪个值。就可以了。
void CopeSerial2Data(unsigned char ucData) { static unsigned char ucRxBuffer[250]; static unsigned char ucRxCnt = 0; LED_REVERSE(); USB_TxWrite(&ucData,1); 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(&stcQ,&ucRxBuffer[2],8);break; } ucRxCnt=0; }把上面处理的数据用UART1_Put_String(str);打印到NB或这个4G上。然后就直接传送到服务器上去了。你可以在服务器上做一些报警处理,然后再发送短信也好、或者你做个APP直接推送APP信息等都可以的,整个项目就完成了。
sprintf(str,"Time:20%d-%d-%d %d:%d:%.3f\r\n",stcTime.ucYear,stcTime.ucMonth,stcTime.ucDay,stcTime.ucHour,stcTime.ucMinute,(float)stcTime.ucSecond+(float)stcTime.usMiliSecond/1000); UART1_Put_String(str); delay_ms(10); 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); UART1_Put_String(str); delay_ms(10); 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); UART1_Put_String(str); delay_ms(10); 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); UART1_Put_String(str); delay_ms(10); sprintf(str,"Mag:%d %d %d\r\n",stcMag.h[0],stcMag.h[1],stcMag.h[2]); UART1_Put_String(str); delay_ms(10); sprintf(str,"Pressure:%ld Height%.2f\r\n",stcPress.lPressure,(float)stcPress.lAltitude/100); UART1_Put_String(str); delay_ms(10); sprintf(str,"DStatus:%d %d %d %d\r\n",stcDStatus.sDStatus[0],stcDStatus.sDStatus[1],stcDStatus.sDStatus[2],stcDStatus.sDStatus[3]); UART1_Put_String(str); delay_ms(10); sprintf(str,"Longitude:%ldDeg%.5fm Lattitude:%ldDeg%.5fm\r\n",stcLonLat.lLon/10000000,(double)(stcLonLat.lLon % 10000000)/1e5,stcLonLat.lLat/10000000,(double)(stcLonLat.lLat % 10000000)/1e5); UART1_Put_String(str); delay_ms(10); sprintf(str,"GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n",(float)stcGPSV.sGPSHeight/10,(float)stcGPSV.sGPSYaw/10,(float)stcGPSV.lGPSVelocity/1000); UART1_Put_String(str); delay_ms(10); sprintf(str,"Four elements:%.5f %.5f %.5f %.5f\r\n\r\n",(float)stcQ.q[0]/32768,(float)stcQ.q[1]/32768,(float)stcQ.q[2]/32768,(float)stcQ.q[3]/32768); UART1_Put_String(str); delay_ms(10);3 结果展示 我给大家看下我的结果,这个是用HC-06得到数据