基于RS-485总线的多主机通信方法
3.2.2 接收方工作流程
本文引用地址:https://www.eepw.com.cn/article/284991.htm处理一:报文过滤。通过报文头部,判断收到的报文是否为其它节点发给本节点,如果不是则不予处理。
步骤二:报文校验。对发给本节点的报文进行帧校验,如果有错误,则发“FCS错误”报文,并将已收到报文丢弃,如果校验正确则发“确认接收”报文。
步骤三:报文处理。对正确接收的报文进行分析处理。
4 程序设计
程序设计中主要对初始化程序、中断接收程序、报文发送程序、报文处理程序等程序分别进行设计。
4.1 初始化程序
初始化程序主要完成MCU和RS-485收发器管脚的初始化,并开启串口接收中断。
void InitDev(void)
{
RCC_Configuration();//配置系统时钟,使能各外设时钟
Init_485();//配置485管脚,并预置为接收使能
SysTick_Init(1000);//初始化系统滴答
GLCD_init();//初始化TFT屏
UART3Init();//对USART3进行串口参数设置、中断配置,开启接收中断
}
4.2 中断接收程序
中断接收程序主要对符合数据帧格式的报文进行接收,根据报文中的目的节点过滤掉发给其它节点的报文,并对报文进行帧校验,最后设置相应的标识位,供接收数据处理程序使用。
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3,USART_IT_RXNE)==SET)
{
u8 temp;
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
temp=USART3->DR;
//以下对收到的字符进行处理
……
为避免对方快速发送多组报文,使接收方来不及处理而导致丢失报文,我们采取双缓存的方式,即设置两个接收缓存区,轮流存储接收到的报文,对缓存区的占用情况设置标志位。
char F_REC;//缓存区存储标志
char buf_index;//当前待处理的缓存区号
u8 *buf_rev1;//接收缓存区1
u8 *buf_rev2;//接收缓存区2
u8 DataIn[128];//临时存储区
u8 dataNums;//已收到的数据长度
……
if((F_REC==0) || (F_REC==0x10))
{
//缓存区为空,或只有缓存区2被占用
buf_rev1=(u8 *)malloc(dataNums);
memcpy(buf_rev1,&DataIn,dataNums);
if(buf_index==0) buf_index=1;
F_REC|=0x01; //缓存区1已占用
}
else if(F_REC==0x01)
{
//只有缓存区1被占用
……
}
else if(F_REC==0x11)
{
//缓存区已满
……
4.3 报文发送程序
报文发送程序主要是将任意长度的报文发送到总线上。由于485总线通信始终在接收/发送之间切换,为保证总线可靠工作,状态切换时应做适当延时,等总线状态稳定后,再进行数据的收发。具体方法是在数据发送状态下,先将485_DIR置“1”,延时2ms,再发送数据,数据发送完成后,延时2ms,直接将485_DIR置“0”。这种处理可有效提高总线的稳定性,增强数据传输的可靠性。延时时间的取值与波特率有关,波特率越小,延时应越大。
……
RS_485_TX_EN;//485发送使能
RS485_Delay(2);//延时2ms
for (i=0; i
{
USART_SendData(USART3, data[i]);
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
}
/*RS485_Delay(2);*/
RS_485_RX_EN;//485接收使能
4.4 报文处理程序
为了保证中断接收程序始终能快速响应对方发来的数据,我们把报文处理程序放在中断之外,以免程序处理当前报文用时过长,影响下一组报文的接收。在主程序中通过对接收标志位的判断来调用报文处理程序,根据接收报文内容的不同给出相应的响应。
int main(void)
{
……
while(1)
{
……
if(F_REC>0)
{
if(buf_index==1) DealData(buf_rev1,buf_len1);
if(buf_index==2) DealData(buf_rev2,buf_len2);
}
5 结语
本文中介绍了一种多主机通信的485总线通信实现方法,该方法适用于工作环境相对恶劣、多主机随机通信需求较高的场合,目前已应用到某模拟训练系统,经两年多的使用,系统运行稳定可靠。在具体实践中,对于工作条件较好时,为提高效率可对通信协议进行精简设计,如缩短帧结构、简化通信过程等,藉此可减少总线占用时间,缩短节点响应时间,达到更为理想的通信效果。
参考文献:
[1]陈铁军,谢春萍. PC机与RS 485总线多机串行通信的软硬件设计[J].现代电子技术,2007(5):103-105
[2]吴桂林 郑建勇. RS485上下位机多机通信网络系统设计[J].微计算机信息,2008,24(12-3):112-113
[3]潘群,向军,王琳.RS-485串行通信接口电路的设计与应用[J].常州工学院学报,2009,22(3):38-42
[4]魏金文,马维华,吴侨. RS-485的多机通信方案探究[J]. 单片机与嵌入式系统应用,2012,10:76-78
[5]郝涛,陆宣博.基于RS485主从串口通讯协议的设计[J].装备制造技术,2013,3:38-40
[6]胡文涛.一种基于协议的提高RS-485实时性的方法[J]. 现代电子技术, 2013,36(18):10-12
[7]周建章,赵颖.基于RS- 485主从通信协议的改进[J].电子质量,2011,1:23-25
本文来源于中国科技期刊《电子产品世界》2016年第1期第45页,欢迎您写论文时引用,并注明出处。
评论