實現單片機與PC機多機通訊的程序
/*-------------------------------- 多機通信協議格式 ------------------------------------*/
/* 數據包的格式如下所示(共10個字節(jié)組成): */
/* 0x2A,0xEB,0x8D,地址碼,指令碼,數據長度碼,數據碼,數據碼,校驗碼,0xAD */
void Data_analysis()
{
static uchar recdata_sum=0; //存放累加和
static uchar lencnt=0; //數據長度計數器
switch(state_flag)
{
case 0:
{
if(rec_data == 0x2A) // 是否幀頭第一個數據
state_flag = 1;
else
state_flag = 0; // 標志復位
break;
}
case 1:
{
if(rec_data == 0xEB) // 是否幀頭第二個數據
state_flag = 2;
else
state_flag = 0; //標志復位
break;
}
case 2:
{
if(rec_data == 0x8D) // 是否幀頭第三個數據
state_flag = 3;
else
state_flag = 0; // 標志復位
break;
}
case 3:
{
if(rec_data == ID) // 判斷目的地址是否正確
{
state_flag = 4;
recdata_sum=rec_data; //開始累加
}
else
state_flag = 0; //標志復位
break;
}
case 4:
{
state_flag = 5;
cmd=rec_data; //指令碼存儲
recdata_sum+=rec_data; //累加
break;
}
case 5:
{
lencnt = 0; //數據長度計數器清零
data_count=rec_data; //數據長度碼存儲
recdata_sum+=rec_data; //累加
if (data_count!=0) //后面有數據碼
state_flag=6;
else
state_flag=8;
break;
}
case 6:
case 7:
{
Data[lencnt++]=rec_data; //數據碼保存
recdata_sum+=rec_data; //累加
if(lencnt==data_count)
{
state_flag=8;
lencnt = 0;
}
else
state_flag=7;
break;
}
case 8:
{
if(recdata_sum==rec_data) //數據校驗,判斷累加和是否相等
state_flag=9;
else
{
retval=1; //置錯誤標志,數據包傳送不正確。
state_flag=0;
}
recdata_sum=0;//累加和清零
break;
}
case 9:
{
if (rec_data==0xAD)
{
retval=2; //置接收成功標志,數據包傳送成功。
state_flag=0;
}
else
state_flag=0;
break;
}本文引用地址:http://m.butianyuan.cn/article/201611/323815.htm
}
}
//主程序 , 不斷掃描串口接收到的命令
void main()
{
PortInit(); //各端口初始化
TimerInit(); //定時器初始化
UsartInit(); //串口初始化
Send(0xce);
Send(0x7b);
Send(0x00);
Send(0xed);
while(1)
{
usart_cmd_scan(); //串口命令掃描
}
}
/*
*函數名:usart_cmd_scan
* 描 述:串口命令掃描
* 輸 入:無
* 輸 出:無
* 備 注:掃描PC通過串口發(fā)送的命令
*/
void usart_cmd_scan()
{
uchar sendcmd; //下位機向PC發(fā)送的命令碼
switch(retval)
{
case 1: //數據發(fā)送錯誤,請求PC重發(fā)
{
sendcmd=2; //向PC發(fā)送的重發(fā)數據命令,PC識別后向下位機重發(fā)數據包。
Send(0xce);
Send(0x7b);
Send(sendcmd);
Send(0xed); //向PC發(fā)送命令
retval=0; //標志清零,防止重復掃描,重復執(zhí)行。 2013/9/24
break;
}
case 2: //數據發(fā)送成功,執(zhí)行命令
{
switch(cmd) //命令解碼
{
case 0x01:
{
Send(0xce);
Send(0x7b);
Send(0x11);
Send(0xed);
cmd=0x00;
break;
}
case 0x02:
{
Send(0xce);
Send(0x7b);
Send(0x12);
Send(0xed);
cmd=0x00;
break;
}
case 0x03:
{
Send(0xce);
Send(0x7b);
Send(0x13);
Send(0xed);
cmd=0x00;
break;
}
}
}
retval=0; //標志清零,防止重復掃描,重復執(zhí)行。
}
}
/*
* 函數名:Send
* 描 述:串口數據發(fā)送函數
* 輸 入:sendcmd - 待發(fā)送的數據
* 輸 出:無
* 備 注:
*/
void Send(uint8 sendcmd)
{
ES=0; //關閉串口
SBUF=sendcmd; //發(fā)送數據,向PC發(fā)送。
while(!TI);
TI=0; //發(fā)送完成,TI清零
ES=1; //開串口
}
以上是我寫的這個程序,希望大家指點一下。
程序運行整體可以,但是有個問題,也希望大神們能幫忙看一下什么問題
每次在單片機關機后,再重新上電后,發(fā)送都沒反應,只有手動按下開發(fā)板的復位鍵后才能正常通信,當再次斷電上電后,又不行了,又得按復位鍵才正常。
評論