日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

51单片机串口通信(字符串接收和发送)

發(fā)布時(shí)間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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ò),歡迎將生活随笔推薦給好友。