STM32 跟触摸屏modbus-rtu通信问题(485)

2019-07-20 12:27发布

[mw_shl_code=c,true]void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//判断是否发生TIM2更新中断 { TIM_Cmd(TIM2,DISABLE); //关掉定时器2 TIM_SetCounter(TIM2, 0);//重新设初值0 if(recenum >= 8) { Uart1_rev_flag = 1;//接收完毕一帧,置位标志位,通知主函数调用接收处理函数 USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//失能串口1接收中断 } recenum = 0; GPIO_SetBits(GPIOF,GPIO_Pin_13);//485发送使能 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除TIM2的中断待处理位 TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM2待处理标志位 } } void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断 { USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除USART1中断待处理位RXNE(RXNE=0) if(Uart1_rev_flag != 1) { if(recenum < 12)//接收分8字节数据 和11字节数据 { ReceBuf[recenum] = USART1->DR; recenum++; TIM_Cmd(TIM2, ENABLE); TIM_SetCounter(TIM2, 0); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); } } } /*if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET) { USART_ClearITPendingBit(USART1,USART_IT_TXE);//清除USART1中断待处理位RXNE(RXNE=0) USART_SendData(USART1,ReceBuf[sendnum]); sendnum++; if(sendnum == 8) { LED4(ON); sendnum = 0; USART_ITConfig(USART1,USART_IT_TXE,DISABLE); //USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接收中断使能 //GPIO_ResetBits(GPIOF,GPIO_Pin_13);//485使能接收 } }*/ //溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET) { USART_ClearFlag(USART1,USART_FLAG_ORE); //清溢出位 USART_ReceiveData(USART1); //读DR } }[/mw_shl_code] 这是我中断函数,为什么我接收到的第一个数据不是设备地址0x01,但是我用串口监控,看到的是01 03 00 00 00 01 84 0A,但是接收之后就不行了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
翱翔云端的鸟
1楼-- · 2019-07-21 12:02
[mw_shl_code=c,true]void USART1_IRQHandler(void) { num1++; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断 { USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除USART1中断待处理位RXNE(RXNE=0) if(Uart1_rev_flag != 1) { if(num1 == 1) { i1 = USART1->DR; } if(num1 == 2) { i2 = USART1->DR; } if(num1 == 3) { i3 = USART1->DR; } if(num1 == 4) { i4 = USART1->DR; } if(num1 == 5) { i5 = USART1->DR; } if(num1 == 6) { i6 = USART1->DR; } if(num1 == 7) { i7 = USART1->DR; } if(num1 == 8) { i8 = USART1->DR; } if((i1 == 0x01) && (i2 == 0x03) && (i3 == 0x00) && (i4 == 0x00) && (i5 == 0x00) && (i6 == 0x01) && (i7 == 0x84) && (i8 == 0x0a)) { LED2(ON); } } } /*if(recenum < 12)//接收分8字节数据 和11字节数据 { ReceBuf[recenum] = USART1->DR; recenum++; TIM_Cmd(TIM2, ENABLE); TIM_SetCounter(TIM2, 0); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); }*/ /*if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET) { USART_ClearITPendingBit(USART1,USART_IT_TXE);//清除USART1中断待处理位RXNE(RXNE=0) USART_SendData(USART1,ReceBuf[sendnum]); sendnum++; if(sendnum == 8) { LED4(ON); sendnum = 0; USART_ITConfig(USART1,USART_IT_TXE,DISABLE); //USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接收中断使能 //GPIO_ResetBits(GPIOF,GPIO_Pin_13);//485使能接收 } }*/ //溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET) { USART_ClearFlag(USART1,USART_FLAG_ORE); //清溢出位 USART_ReceiveData(USART1); //读DR } } [/mw_shl_code] 这样LED2就不亮了,不知道为什么!
青苹果PAD
2楼-- · 2019-07-21 14:17
 精彩回答 2  元偷偷看……
翱翔云端的鸟
3楼-- · 2019-07-21 18:48
回复【8楼】青苹果PAD:
---------------------------------
是台达的,DOP-BO4S211,问题在于我都没有通信成功,modbus-rtu(485),求高手知道啊,!!
翱翔云端的鸟
4楼-- · 2019-07-21 19:08
然后是定时器配置 [mw_shl_code=c,true]void Timer_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /*初始化为默认值*/ TIM_DeInit(TIM2); // TIM_InternalClockConfig(TIM2); /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* TIM2做定时器,基础设置*/ /*T=3.5*( 1 +数据位+奇偶校验+ 停止位)/ 波特率 t=3.5*(1+8+0+1)/波特率 由于t1.5 和 t3.5 的定时,隐含着大量的对中断的管理.在高通信速率下,这导致CPU 负担加 重。因此,在通信速率等于或低于19200 Bps 时,这两个定时必须严格遵守;对于波特率大于 19200 Bps 的情形,应该使用2 个定时的固定值:建议的字符间超时时间(t1.5)为750μs, 帧间的超时时间(t1.5) 为1.750ms。*/ TIM_TimeBaseStructure.TIM_Period = 175; //计数值:175 定时1750us 19200 3.5个字符长度 TIM_TimeBaseStructure.TIM_Prescaler =720; //预分频,除数:720, 10us TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分频因子为1 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration /*预先清除更新中断位*/ TIM_ARRPreloadConfig(TIM2, ENABLE);//使能预装载 TIM_ClearFlag(TIM2, TIM_FLAG_Update); // TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //TIM_SetCounter(TIM2, 0); /* 配置溢出中断*/ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允许更新中断 TIM_Cmd(TIM2,DISABLE); } [/mw_shl_code]
翱翔云端的鸟
5楼-- · 2019-07-21 19:31
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-07-21 23:23
回复【12楼】翱翔云端的鸟:
---------------------------------
恭喜,付出总有回报.

一周热门 更多>