如题,程序下载到协调器是可以通过串口读出光照的,但是组网后,通过终端读发送给协调器就读不出。。。
经过测试发现是陷入了死循环
void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
Light[0]=(unsigned char)wan;
Light[1]=(unsigned char)qian;
Light[2]=(unsigned char)bai;
Light[3]=(unsigned char)shi;
Light[4]=(unsigned char)ge;
Light[5]='\n';
}
void SampleApp_SendPeriodicMessage( void )
{
float data;
data=Get_LightValue();//【问题】组网后这里出不来,测试发现是Get_LightValue()的问题
conversion(data);
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
osal_strlen(Light),
Light,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
------------------------------------------------------------------------------------------------------------------------------
float Get_LightValue(void)
{
uint8_t BUF[2] = {0};
BH1750_Write_Cmd(BH1750_ON); // power on//【问题】继续测试发现是BH1750_Write_Cmd()中的问题
BH1750_Write_Cmd(BH1750_RSET); // clear
BH1750_Write_Cmd(BH1750_ONE); // 一次H分辨率模式,至少120ms,之后自动断电模式
I2C_Delay_ms(400); // 延时400ms
BH1750_Read(BUF); // 连续读出数据,存储在BUF中
return (BH1750_Convert(BUF));
}
---------------------------------------------------------------------------------------------------------------------------------
static void BH1750_Write_Cmd(uint8_t cmd)
{
I2C_Start(); // 起始信号
I2C_WriteByte(BH1750_Addr+0); // 发送设备地址+写信号
while(I2C_WaitAck());//【问题】测试发现是这个while死循环了,I2C_WaitAck()一直是1
I2C_WriteByte(cmd); // 内部寄存器地址
while(I2C_WaitAck());//【问题】这个也是
//BH1750_SendByte(REG_data); // 内部寄存器地址
I2C_Stop(); // 发送停止信号
I2C_Delay_ms(5);
}
--------------------------------------------------------------------------------------------------------------------------
uint8_t I2C_WaitAck(void)
{
uint8_t ErrTime = 0;
// 将 SCL 引脚和 SDA 引脚设置为输出模式
I2C_SCL_OUTPUT();
I2C_SDA_OUTPUT();
I2C_SDA_HIGH(); // SDA 置高
I2C_Delay_10us(1);
I2C_SCL_HIGH(); // SCL 置高
I2C_Delay_10us(1);
I2C_SDA_INPUT(); // SDA 设置为输入模式
while(I2C_SDA_STATE())// 当 SDA 为低电平时退出循环//【问题】I2C_SDA_STATE()一直为1导致返回1
{
ErrTime++;
if(ErrTime>250)
{
I2C_Stop();
return 1;
}
}
I2C_SCL_LOW();
return 0;
}
-----------------------------------------------------------------------------------------------------------------------------
#define I2C_SDA_STATE() P1_3 /*读SDA电平*/ |