485总线是一主多听的形式,必然分主机程序和从机程序。
在主机程序中需要做的就是发送从机地址,并开启串口中断,等待从机响应。
而从机首先出于接收状态,当总线有数据传输时,相应中断。对数据进行拆包(检验包头,帧头是否正确),读取地址数据存入全局变量,并与本机地址进行对比,正确函数则返回0x01,错误函数则返回0x00,广播地址则返回0x02。以上为从机中中断函数做的事,而从机的主函数则一直检验函数的返回值是否正确,若正确则执行主机发送的命令。
注:对数据拆包读取地址时,不能直接在函数中修改全局变量Serial_buf[],而是在函数的入口参数加入指向变量地址的指针。例如下面程序:
Serial_Address(unsigned char *s1)
{
unsigned char i;
unsigned char a[2]={0x00,0x01};
for(i=0;i<2;i++)
{
if((*(s1+i))!=0x99)
break; //不是广播地址
if(i==2)
return(0x02);//是广播地址
}
for(i=0;i<2;i++)
{
if((*(s1+i))!=a[i])
return(0x00);//地址不同
}
return(0x01); //地址相同
}
此程序中入口参数为s1,是指向存储地址的数组Serial_buf[]的指针变量,在此函数内用*s代替Serial_buf[]即可。
//我是分隔符
调试RS485总线遇到的问题:
1.这个问题准确来说是串口的问题,调试成功的程序刚下进去能够进行读写,并发送到上位机,而之后再开启的时候,就无法发送串口数据,这个问题很让人烦躁,找到之前调试好的程序都不行。后来发现下载的时候必须每次拔掉USB才能下载,就考虑是不是电脑串口驱动出了问题,就重新安装和电脑系统匹配的串口驱动,问题终于解决了。