生活随笔
收集整理的這篇文章主要介紹了
51单片机串口通信(字符串接收和发送)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://www.cnblogs.com/weifeng727/category/845655.html
#include<reg52.h>//------------------串口通信協(xié)議-----------------//
/*客戶端數(shù)據(jù)包格式解釋(長(zhǎng)度恒為15):例如:A01_fmq_01Off___#A--------數(shù)據(jù)包的開始標(biāo)記(可以為A到Z,意味著數(shù)據(jù)包可以有26種)01-----設(shè)備代號(hào)fmq_01Off___--------指令(長(zhǎng)度恒為10),指令的前4個(gè)人字符是指令頭部,指令的后6個(gè)字符是指令尾部#---------數(shù)據(jù)包的結(jié)束標(biāo)記服務(wù)器端數(shù)據(jù)包格式解釋(長(zhǎng)度恒為15):例如:A02_SenT010250#A--------數(shù)據(jù)包的開始標(biāo)記(可以為A到Z,意味著數(shù)據(jù)包可以有26種)02-----設(shè)備代號(hào)SenT010250--------指令(長(zhǎng)度恒為10),指令的前4個(gè)人字符是指令頭部,指令的后6個(gè)字符是指令尾部#---------數(shù)據(jù)包的結(jié)束標(biāo)記
*/
char buf_string[16]; //定義數(shù)據(jù)包長(zhǎng)度為15個(gè)字符
#define deviceID_1Bit '0' //用于串口通信時(shí),定義本地設(shè)備ID的第1位
#define deviceID_2Bit '2' //用于串口通信時(shí),定義本地設(shè)備ID的第2位
#define datapackage_headflag 'A' //用于串口通信時(shí),定義數(shù)據(jù)包頭部的驗(yàn)證標(biāo)記char DataPackage_DS18B20[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','S','e','n','T','X','X','X','X','X','X','#'};
char HeartBeat[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','B','e','a','t','X','X','X','X','X','X','#'};
//----------------------------------------------//
/*******************************串口通信MCU:89C52RC 11.0592MHz//11.0592MHz 0xd0 1200bps
//12MHz 0xcc 1200bps
//11.0592MHz 0xfa 9600bps
//0xf4 11.0592MHz 0xf3 12MHz 4800bps
//均在SMOD=1的情況下(波特率倍增模式)
*******************************/
//串口發(fā)送函數(shù)
void PutString(unsigned char *TXStr)
{ ES=0; while(*TXStr!=0) { SBUF=*TXStr;while(TI==0);TI=0; TXStr++;}ES=1;
}
//串口接收函數(shù)
bit ReceiveString()
{char * RecStr=buf_string;char num=0;unsigned char count=0;loop: *RecStr=SBUF;count=0;RI=0; if(num<14) //數(shù)據(jù)包長(zhǎng)度為15個(gè)字符,嘗試連續(xù)接收15個(gè)字符{num++;RecStr++; while(!RI){count++;if(count>130)return 0; //接收數(shù)據(jù)等待延遲,等待時(shí)間太久會(huì)導(dǎo)致CPU運(yùn)算閑置,太短會(huì)出現(xiàn)"數(shù)據(jù)包被分割",默認(rèn)count=130}goto loop;}return 1;
}
//定時(shí)器1用作波特率發(fā)生器
void Init_USART()
{SCON=0x50; //串口方式1,使能接收TMOD|=0x20; //定時(shí)器1工作方式2(8位自動(dòng)重裝初值)TMOD&=~0x10;TH1=0xfa; //9600bpsTL1=0xfa; PCON|=0x80; //SMOD=1TR1=1;TI=0;RI=0;//PS=1; //提高串口中斷優(yōu)先級(jí)ES=1; //開啟串口中斷使能
}
//比較指令頭部
bit CompareCMD_head(char CMD_head[])
{unsigned char CharNum;for(CharNum=0;CharNum<4;CharNum++) //指令長(zhǎng)度為10個(gè)字符{if(!(buf_string[CharNum+4]==CMD_head[CharNum])){return 0; //指令頭部匹配失敗}}return 1; //指令頭部匹配成功
}
//比較指令尾部(start:從哪里開始比較,quality:比較多少個(gè)字符,CMD_tail[]:要比較的字符串)
bit CompareCMD_tail(unsigned char start,unsigned char quality,char CMD_tail[])
{unsigned char CharNum;for(CharNum=0;CharNum<quality;CharNum++){if(!(buf_string[start+CharNum]==CMD_tail[CharNum])){return 0; }}return 1;
}
bit Deal_UART_RecData() //處理串口接收數(shù)據(jù)包函數(shù)(成功處理數(shù)據(jù)包則返回1,否則返回0)
{//PutString(buf_string);if(buf_string[0]==datapackage_headflag&&buf_string[14]=='#') //進(jìn)行數(shù)據(jù)包頭尾標(biāo)記驗(yàn)證{ switch(buf_string[1]) //識(shí)別發(fā)送者設(shè)備ID的第1位數(shù)字{case '0':switch(buf_string[2]) //識(shí)別發(fā)送者設(shè)備ID的第2位數(shù)字{case '3':if(CompareCMD_head("Ligt")) //判斷指令頭部是否為"Ligt"{//下面是指令尾部分析switch(buf_string[8]){case '0':switch(buf_string[9]){case '0': return 0;case '1':if(CompareCMD_tail(10,3,"Off")) //A03_Ligt01Off_#{//要執(zhí)行的代碼return 1;}if(CompareCMD_tail(10,3,"On_")){return 1;}return 0;default:return 0;}case '1':default:return 0;} }if(CompareCMD_head("SenT")) {}if(CompareCMD_head("jdq_")) {}if(CompareCMD_head("Try!")) {}return 0;default:return 0;}default:return 0;}}return 0;
}
/************************中斷函數(shù)
************************/
//串口中斷服務(wù)函數(shù)-----------
void USART() interrupt 4 //標(biāo)志位TI和RI需要手動(dòng)復(fù)位,TI和RI置位共用一個(gè)中斷入口
{if(ReceiveString()) {//數(shù)據(jù)包長(zhǎng)度正確則執(zhí)行以下代碼Deal_UART_RecData(); }else{//數(shù)據(jù)包長(zhǎng)度錯(cuò)誤則執(zhí)行以下代碼//LED1=~LED1; }RI=0; //接收并處理一次數(shù)據(jù)后把接收中斷標(biāo)志清除一下,拒絕響應(yīng)在中斷接收忙的時(shí)候發(fā)來(lái)的請(qǐng)求
}
/***************************主函數(shù)
***************************/
void main()
{EA=1;Init_USART();while(1){//PutString(buf_string);//空格20H,回車0DH}
}
轉(zhuǎn)載于:https://www.cnblogs.com/alan666/p/8312112.html
總結(jié)
以上是生活随笔為你收集整理的51单片机串口通信(字符串接收和发送)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。