初级会员

- 积分
- 51
- 金钱
- 51
- 注册时间
- 2022-2-15
- 在线时间
- 11 小时
|
10金钱
本帖最后由 因果报 于 2022-5-10 17:07 编辑
1.串口2做modbus485通讯,调试软件做主站,板子做从站,板子收到主站发过来的报文,然后按照modbus格式回应报文,到这里都是对的;
但是发到主站那里,每次都要先发个00,我换了好几个调试软件都是这样。分析应该是程序的问题,但是我查了很久也找不到原因,发出来请大家帮忙看看
//发送函数
void RS485_SendData( u8 *buff,u8 len)
{
u8 t;
GPIO_SetBits( GPIOC, GPIO_Pin_2);
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus( USART2, USART_FLAG_TC)==RESET);
USART_SendData( USART2, buff[t]);
}
while(USART_GetFlagStatus( USART2, USART_FLAG_TC)==RESET);
GPIO_ResetBits( GPIOC, GPIO_Pin_2);
}
//定时接收中断
void TIM3_IRQHandler(void)
{
if (TIM_GetFlagStatus( TIM3, TIM_FLAG_Update) != RESET ) //判断中断是否真的来临
{
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除中断标志位
RS485_RX_EN++;
if((RS485_RX_EN>33) && (RS485_RX_CNT!=0) )
{
USART2_LEN = RS485_RX_CNT;
RS485_FrameFlag=1;//置位帧结束标记
RS485_RX_EN = 0;
}
}
}
//串口中断服务函数
void USART2_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus( USART2, USART_IT_RXNE) != RESET) //判断中断是否发生
{
Res = USART_ReceiveData(USART2); // 读取接收到的数据
if(RS485_RX_CNT <200 ) //接收到的字节数量
{
RS485_RX_BUFF[RS485_RX_CNT++]=Res; //把接收到的数据放到对应数组
RS485_RX_EN=0;
}
else
{
Rec_Buf_clean(RS485_RX_BUFF,200); //清空数组
RS485_RX_CNT = 0;
}
USART_ClearFlag(USART2,USART_FLAG_RXNE);
}
}
|
-
|