用STM32做主机(串口1做RS232,串口2做RS485),两个从机只有波特率是不一样的,一号从机是9600,二号从机19200. 他们的指令也是不同的,于是我就根据串口1接收到的指令不同来设置相应的波特率,然后把串口1接收到的指令通过串口2做RS485发送到从机,对应的从机返回数据。可是试验证明当我发一号从机的指令且一号从机返回数据后,立即发二号从机的指令,二号从机不返回数据,我再发一遍二号从机的指令才返回数据。而一号从机就没有此问题,为什么呢,百思不得其解。
[mw_shl_code=c,true] int main(void)
{
u8 cnt=0;
u16 len =0;
u8 buf[500];
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
RS485_Init(19200); //初始化RS485
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
while(1)
{
RS485_Receive_Data(buf,cnt);
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;
USART_RX_BUF[len]=0x0d;
if((USART_RX_BUF[0]==0x2f)&&(USART_RX_BUF[1]==0x34)) //一号从机
{
FLAG=1;
RS485_Init(9600);
}
else //二号从机
{
USART_Cmd(USART2, DISABLE);
RS485_Init(19200);
delay_ms(50);
USART_RX_BUF[len+1]=0x0a;
}
RS485_Send_Data(USART_RX_BUF,len);
USART_RX_STA=0;
}
}
}[/mw_shl_code]
[mw_shl_code=c,true]//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t,k;
if(FLAG==1)
{
k=len+1;
FLAG=0;
}
else k=len+2;
RS485_TX_EN=1; //设置为发送模式
for(t=0;t<k;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2,buf[t]);
buf[t]=0;
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
RS485_RX_CNT=0;
RS485_TX_EN=0; //设置为接收模式
}[/mw_shl_code]
[mw_shl_code=c,true]//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u16 len)
{
u16 rxlen=RS485_RX_CNT;
u16 i=0;
len=0; //默认为0
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
USART_SendData(USART1,RS485_RX_BUF);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
len = RS485_RX_CNT; //记录本次数据长度
RS485_RX_CNT=0; //清零
}
}
[/mw_shl_code]
|