本帖最后由 lkjhbbb 于 2016-12-21 19:27 编辑
我做的项目是基于485的modbus的一个通讯,然后第一步已经先实现了所需的功能,代码如下:
int main(void)
{
delay_init();
uart_init(9600); //串口初始化
TIM2_Configuration();//TIM2 MDOBUS-3.5T
while(1)
{
if(Uart1_rev_flag == 0x01)
{
Uart1_rev_flag = 0x00;//接收一帧数据标志清零
delay_ms(5);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);//485send
ParseRecieve();//数据帧处理函数
delay_ms(5);//发送完成后不能马上置于接收状态
GPIO_SetBits(GPIOB,GPIO_Pin_0);//485接收
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//允许接收中断
}
}
}
其中为当接收完一帧数据后所给定的标志位,当接收到数据后,Uart1_rev_flag == 0x01,便会进行相应的处理,而实验现象也基本符合结果,但是在我的处理函数中加了两个延时函数 delay_ms(5);,因为项目要求,这两个延时不能直接加在主程序中,我就打算利用定时来做延时,但是试了好一阵子一直出不来现象,然后用中断调节,单步也跳的结果很乱找不出问题,下面给我修改后的程序,能帮我看一下我的思路有问题吗
主函数改为:
while(1)
{
if(Uart1_rev_flag == 0x01)
{
Uart1_rev_flag = 0x00;//接收一帧数据标志清零
fistdly = 1; //标志第一次延时开始
fst_time = 0; //延时时间计数
}
if(first_flag == 0x01) //进行第一次延时后的处理
{
first_flag = 0x00;
fistdly = 0;
GPIO_ResetBits(GPIOB, GPIO_Pin_0);//485send
ParseRecieve();//数据帧处理函数
second_dly =1;
fst_time = 0;
second_time = 0;
}
if(second_flag == 0x01) //进行第二次延时后的处理
{
second_flag = 0x00;
second_dly =0;
GPIO_SetBits(GPIOB,GPIO_Pin_0);//485接收
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//允许接收中断
second_time = 0;
}
}
然后是用定时器定为1秒,在中断服务程序里面进行操作:
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//判断是否发生TIM2更新中断
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除TIM2的中断待处理位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM2待处理标志位
if(fistdly ==1) //第一次延时
{
if(fst_time<5)
fst_time++;
else
first_flag = 0x01; //当延时5秒后给定标志位
}
if(second_dly ==1)
{
if(second_time<5)
second_time++;
else
second_flag = 0x01;
}
}
}
在主程序中,ParseRecieve();这个是主要对modbus协议的规定进行相应的处理,并且里面包含把返回帧发回串口。
我主要的思路就是利用定时器来延时,但一直找不到问题,大家能帮我看看是我的思路有问题吗?或者有更简单的方法做定时器延时吗?谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>