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