OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14339|回复: 3

不同波特率的RS485通信问题

[复制链接]

16

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-6-22
在线时间
7 小时
发表于 2014-6-6 16:47:03 | 显示全部楼层 |阅读模式
5金钱
用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]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-6 23:34:42 | 显示全部楼层
可以监控下总线上的数据,看看是什么问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-6-22
在线时间
7 小时
 楼主| 发表于 2014-6-7 09:01:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
监控了,第一次发送二号从机的指令监测到已经从RS485发送出去了,但是没有返回数据,第二次就好了
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2011-4-8
在线时间
3 小时
发表于 2014-6-7 23:27:10 | 显示全部楼层
回复【3楼】贵在坚持:
---------------------------------
你加个CRC的识别处理看看。。。。2号机估计收到指令不对,第一次发送给1号机的时候接着往二号机发送间隔
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 09:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表