我的传感器是基于RS485——modbus协议的,在我的程序中,还没有对从机发送给主机的数据进行细致分析。 给传感器发送的数据是固定的。
u8 Sendbuf0[8] = {0x02,0x03,0x00,0x00,0x00,0x01,0x84,0x39}; //主机准备要发送给风向从机的数据。
u8 Sendbuf1[8] = {0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A}; //主机准备要发送给风速从机的数据。
void USART2_IRQHandler(void) //MODBUS一个字节接收中断
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
RS485_RX_CNT++; //接收一个字节,加一次。
}
}
while(1)
{
if(timeout == 1)//定时器中断标志,3秒钟中断一次
{
RS485_Send_Data(Sendbuf0,8);//把数据发送给风向从机,然后风向传感器会返回7个数,例如[02,03,02,00,26,7D,9E],
在接收缓冲区设置 RS485_RX_CNT计算所接收到数据的个数。
if(RS485_RX_CNT == 7)//因为数据一共为7个,判断是否接收完毕。但是,有疑问的是,我在单步运行的时候,却进不去,不知道是怎么回事。
是因为我在接收中断函数中设置的RS485_RX_CNT方式不对吗??????
{
a=RS485_RX_BUF[3];
a<<=8;
a|=RS485_RX_BUF[4];//我所需要的是第4、5个数值,赋给a。
sprintf((char*)FXbuf,"Feng xiang:%2d %s",a,"du");//如何把单位“度”显示到显示屏上
LCD_ShowString(30,120,210,16,16,FXbuf);
RS485_RX_CNT=0;//把计数给清零
}
delay_ms(1500);//延时的目的是因为,说明书要求,两次通信间隔至少1000ms以上
RS485_Send_Data(Sendbuf1,8);//然后,在给风速传感器发送数据,同理也会返回7个数据。
if(RS485_RX_CNT==7)//判断是否接收完毕
{
a=RS485_RX_BUF[3];
a<<=8;
a|=RS485_RX_BUF[4];
sprintf((char*)FSbuf,"Feng su:%2d %s",a,"m/s");
LCD_ShowString(30,140,210,16,16,FSbuf);
RS485_RX_CNT=0;
}
timeout=0;//清除中断标志,以便下次中断开启。
}
我这里重点的疑问是,在我设置 if(RS485_RX_CNT==7)//判断是否接收完毕,为什么会进不去呢;
麻烦大家看看我哪里的思路有问题呢?谢谢了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>