思路:
PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在
485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,
他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试
助手
单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检
测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令
我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序
#include //选用晶振11.0592MHz
#include
#define DATA51 DBYTE[0x80] //80H存数据
#define AddressID 0x31 //本机地址1
sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态
sbit MAX485_DIR=P3^7;
main()
{
//****************通讯设置
SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口优先级高
// TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位
无(11.0592)
TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、数据位8、停止位1。效验
位无 (11.0592M)
TL1 = 0xf4;
TR1 = 1; //开启定时器1 EA = 1; // 开总中断
ES = 1; //开串口中断
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
while(1);
}
void counter4(void) interrupt 4 using 2 //串口中断
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
{
while(RI==0);
RI=0;
if(SBUF==0x01) //发送指令
{