新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2016-6-14
- 在线时间
- 30 小时
|
22金钱
串口3 接ZigBee,一共4个传感器数据发过来,输出格式开头是FF的9个元素的数组,但是我写的程序数据经常不对,比如臭氧,有时是7,有时经常是49,这个数传感器没输出过这么大的。第一部分:串口3接收部分
u8 Rx3Buffer[9]; // 3usart 缓存数组
u8 Count3; //计数
#if EN_USART3_RX //如果使能
void USART3_IRQHandler()
{
u8 Receive3;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//是否产生中断
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清中断
Receive3=USART_ReceiveData(USART3); //接收
Rx3Buffer[Count3++] = Receive3;
if(Count3>8)Count3=0; //清零
}
}
#endif
主函数部分
extern u8 Rx3Buffer[9]; // 3usart
extern u8 Count3;
char PM2_5[4];
char PM10[4];
char HCHO[4];
char O3[4];
char NO2[4];
char CO[4]; //CO
char SO2[4];
//***********ZIGBEE*******************************//
void getZigBee(void)
{
if(Rx3Buffer[0]==0xff) //0XFF
{
if(Rx3Buffer[1]==0x2a)
{
O3[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
}
if(Rx3Buffer[1]==0x2b)
{
SO2[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
}
if(Rx3Buffer[1]==0x2c)
{
NO2[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
}
if(Rx3Buffer[1]==0x04)
{
COL[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
}
}
Count3=0; //从新计数
}
/***************************display***********************/
void display(void)
{
printf("HCHO is %5.3f mg/m3\r\n",((float)HCHO[0])/1000);
printf("pm25 is %d ug/m3\r\n",PM2_5[0]);
printf("pm10 is %d ug/m3\r\n",PM10[0]);
printf("03 is %d ppb\r\n",O3[0]);
printf("co is %f ppb\r\n",COL[0]);
// printf("so2 is %d ppb\r\n",SO2[0]);
printf("no2 is %f ug\r\n",(NO2[0]*2.054));
// printf("SO2 is %f ug/m3\r\n",((float)SO2[0])*2.854);
}
|
最佳答案
查看完整内容[请看2#楼]
出现这个现象说明你的接收那里串位了。接收的时候判断下接收的内容比如包头,如果不对,就要放弃掉重新接收,直到收到正确的数据。
比如你单个传感器发过来的9个字节,第一个0XFF,第二个是0X2A,第三个。。第九个是DATA。那么你必须要判断第一个和第二个,这样才能保证后面的数据是对的。
|