新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 實(shí)現(xiàn)單片機(jī)與PC機(jī)多機(jī)通訊的程序

實(shí)現(xiàn)單片機(jī)與PC機(jī)多機(jī)通訊的程序

作者: 時(shí)間:2016-11-30 來源:網(wǎng)絡(luò) 收藏

/*-------------------------------- 多機(jī)通信協(xié)議格式 ------------------------------------*/
/* 數(shù)據(jù)包的格式如下所示(共10個(gè)字節(jié)組成): */
/* 0x2A,0xEB,0x8D,地址碼,指令碼,數(shù)據(jù)長(zhǎng)度碼,數(shù)據(jù)碼,數(shù)據(jù)碼,校驗(yàn)碼,0xAD */
void Data_analysis()
{
static uchar recdata_sum=0; //存放累加和
static uchar lencnt=0; //數(shù)據(jù)長(zhǎng)度計(jì)數(shù)器
switch(state_flag)
{
case 0:
{
if(rec_data == 0x2A) // 是否幀頭第一個(gè)數(shù)據(jù)
state_flag = 1;
else
state_flag = 0; // 標(biāo)志復(fù)位
break;
}
case 1:
{
if(rec_data == 0xEB) // 是否幀頭第二個(gè)數(shù)據(jù)
state_flag = 2;
else
state_flag = 0; //標(biāo)志復(fù)位
break;
}
case 2:
{
if(rec_data == 0x8D) // 是否幀頭第三個(gè)數(shù)據(jù)
state_flag = 3;
else
state_flag = 0; // 標(biāo)志復(fù)位
break;
}
case 3:
{
if(rec_data == ID) // 判斷目的地址是否正確
{
state_flag = 4;
recdata_sum=rec_data; //開始累加
}
else
state_flag = 0; //標(biāo)志復(fù)位
break;
}
case 4:
{
state_flag = 5;
cmd=rec_data; //指令碼存儲(chǔ)
recdata_sum+=rec_data; //累加
break;
}
case 5:
{
lencnt = 0; //數(shù)據(jù)長(zhǎng)度計(jì)數(shù)器清零
data_count=rec_data; //數(shù)據(jù)長(zhǎng)度碼存儲(chǔ)
recdata_sum+=rec_data; //累加
if (data_count!=0) //后面有數(shù)據(jù)碼
state_flag=6;
else
state_flag=8;
break;
}
case 6:
case 7:
{
Data[lencnt++]=rec_data; //數(shù)據(jù)碼保存
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) //數(shù)據(jù)校驗(yàn),判斷累加和是否相等
state_flag=9;
else
{
retval=1; //置錯(cuò)誤標(biāo)志,數(shù)據(jù)包傳送不正確。
state_flag=0;
}
recdata_sum=0;//累加和清零
break;
}
case 9:
{
if (rec_data==0xAD)
{
retval=2; //置接收成功標(biāo)志,數(shù)據(jù)包傳送成功。
state_flag=0;
}
else
state_flag=0;
break;
}

本文引用地址:http://butianyuan.cn/article/201611/323815.htm

}
}

//主程序 , 不斷掃描串口接收到的命令
void main()
{
PortInit(); //各端口初始化
TimerInit(); //定時(shí)器初始化
UsartInit(); //串口初始化
Send(0xce);
Send(0x7b);
Send(0x00);
Send(0xed);
while(1)
{
usart_cmd_scan(); //串口命令掃描
}
}


/*
*函數(shù)名:usart_cmd_scan
* 描 述:串口命令掃描
* 輸 入:無
* 輸 出:無
* 備 注:掃描PC通過串口發(fā)送的命令
*/
void usart_cmd_scan()
{
uchar sendcmd; //下位機(jī)向PC發(fā)送的命令碼
switch(retval)
{
case 1: //數(shù)據(jù)發(fā)送錯(cuò)誤,請(qǐng)求PC重發(fā)
{
sendcmd=2; //向PC發(fā)送的重發(fā)數(shù)據(jù)命令,PC識(shí)別后向下位機(jī)重發(fā)數(shù)據(jù)包。
Send(0xce);
Send(0x7b);
Send(sendcmd);
Send(0xed); //向PC發(fā)送命令

retval=0; //標(biāo)志清零,防止重復(fù)掃描,重復(fù)執(zhí)行。 2013/9/24
break;

}
case 2: //數(shù)據(jù)發(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; //標(biāo)志清零,防止重復(fù)掃描,重復(fù)執(zhí)行。
}
}


/*
* 函數(shù)名:Send
* 描 述:串口數(shù)據(jù)發(fā)送函數(shù)
* 輸 入:sendcmd - 待發(fā)送的數(shù)據(jù)
* 輸 出:無
* 備 注:
*/
void Send(uint8 sendcmd)
{
ES=0; //關(guān)閉串口
SBUF=sendcmd; //發(fā)送數(shù)據(jù),向PC發(fā)送。
while(!TI);
TI=0; //發(fā)送完成,TI清零
ES=1; //開串口
}

以上是我寫的這個(gè)程序,希望大家指點(diǎn)一下。
程序運(yùn)行整體可以,但是有個(gè)問題,也希望大神們能幫忙看一下什么問題
每次在單片機(jī)關(guān)機(jī)后,再重新上電后,發(fā)送都沒反應(yīng),只有手動(dòng)按下開發(fā)板的復(fù)位鍵后才能正常通信,當(dāng)再次斷電上電后,又不行了,又得按復(fù)位鍵才正常。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉