思路:
PC方面:可以用MSCOMM控件先發壹個字符表示接收地址,後延遲1ms,(註意PC端在485通訊在字符發送過程中壹定要加延遲,這是我多次測試的總結,如果是用調試助手的話,他內部代碼已經加過延遲了,就不必考慮這個問題)再發控制指令,初學者建議直接用調試助手
單片機方面:首先對接收數據進行核對,如果不是本地地址,放棄,如果是本地地址,在檢測命令是否正確,如果正確,做出處理後返回PC本地地址並發送命令
我舉個例子教妳怎麽玩多站通訊,下面是我已經通過測試的壹個程序
#include <reg51.h> //選用晶振11.0592MHz
#include <absacc.h>
#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) //發送指令
{
MAX485_DIR=1; //開發送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //發送o
while(TI==0);
TI=0;
SBUF=0x6b; //發送k
MAX485_DIR=0; //開接收
}
if(SBUF==0x00) //接收
{
//這裏怎麽處理就看妳自己要怎麽做了,妳沒要求,我也不好怎麽寫,就自己寫吧
}
}
}
程序調試通過,可以直接套用