代碼規(guī)范性書寫_第1頁
代碼規(guī)范性書寫_第2頁
代碼規(guī)范性書寫_第3頁
代碼規(guī)范性書寫_第4頁
代碼規(guī)范性書寫_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

串口通訊

代碼規(guī)范性書寫

電子組代碼規(guī)范性書寫1.首先最基本的。寫出的代碼要有層次感,讓他們看時不會太費力,思路清晰即可,并且盡可能少滴出現(xiàn)編寫錯誤。2.了解一些編譯常見問題處理。3.STC89與STC12程序之間移植的注意項。了解主要不同點與相同點?!居布崿F(xiàn)與CPU實現(xiàn)區(qū)別】4.代碼結(jié)構(gòu)規(guī)整,思路清晰。。一個好的思路等于解決了一大半工作量voidDelay1ms() { unsignedchari,j; _nop_(); _nop_(); _nop_(); i=11; j=190; do { while(--j); }while(--i);}//STC12voidDelay1ms() { unsignedchari,j; _nop_(); i=2; j=199; do { while(--j); }while(--i);}//STC89延時函數(shù)的問題【寄存器,定時器,串口,CPU實現(xiàn)和定時器】振蕩(時鐘)周期,機器周期,指令周期三者不同STC12默認(rèn)是1T模式,STC89默認(rèn)是12T模式為什么STC官網(wǎng)說只能快6~7倍

//AUXR&=0x7F;

TMOD&=0xF0;

TMOD|=0x01;

TL0=0xA4;

TH0=0xFF;

TF0=0;

TR0=1; 上面關(guān)于延時函數(shù)的不同,但是下面的的定時器初始化函數(shù)同樣與時間有關(guān),但是在移植時卻不需要更改。一般通訊格式與穩(wěn)定性上位機與下位機的通信上位機是指可以直接發(fā)出操控命令的計算機,一般是,屏幕上顯示各種信號變化。下位機是直接控制設(shè)備獲取設(shè)備狀況的計算機,一般是單片機、PLC等。上位機發(fā)出的命令首先給下位機,下位機再根據(jù)此命令解釋成相應(yīng)時序信號直接控制相應(yīng)設(shè)備。下位機不時讀取設(shè)備狀態(tài)數(shù)據(jù)(一般為模擬量),轉(zhuǎn)換成數(shù)字信號反饋給上位機。在通訊過程中,下位機上位機都需要一個共同的通訊協(xié)議負(fù)責(zé)信息交流,并提高穩(wěn)定性?!旧衔粰C與下位機通訊具體過程】(最普通)常用到的通訊格式為幀頭(包頭/開始標(biāo)志位)+數(shù)據(jù)包+幀尾(包尾/結(jié)束標(biāo)志位)簡單的設(shè)計解決了許多問題1.上位機、下位機都需要明確到底哪些才是自己需要接受的數(shù)據(jù)。2.不同的幀頭幀尾可以對數(shù)據(jù)包內(nèi)容進(jìn)行分類接受(此功能也可在數(shù)據(jù)包內(nèi)實現(xiàn))3.方便上位機與下位機編程。幀頭幀尾提供了通訊開始與通訊結(jié)束的兩個標(biāo)志位。可控制內(nèi)容輸入、輸出。在數(shù)據(jù)包發(fā)送數(shù)據(jù)時常用兩種形式1.使用十六進(jìn)制格式發(fā)送——優(yōu)勢:最短數(shù)據(jù)長度包含最多的信息。且單片機不用進(jìn)行或進(jìn)行簡單解析(不一定,有時解析難度還是較大)。缺點:調(diào)試不太方便,直觀性不強。2.使用十進(jìn)制格式發(fā)送——優(yōu)劣與上十六進(jìn)制格式正好相反。如:如果發(fā)送一個值為100的數(shù)據(jù)。

你可以發(fā)送一個0x64進(jìn)行傳輸。也可以發(fā)送0x310x300x30單片機接收到時進(jìn)行解析數(shù)據(jù)包的常用簡單結(jié)構(gòu)目前簡單數(shù)據(jù)包應(yīng)用的格式有1.以固定長度進(jìn)行識別如:類似S40034D格式假如我們按照一個約定數(shù)據(jù)包內(nèi)第一個數(shù)據(jù)為2位,第2個數(shù)據(jù)為3位。(上位機與下位機已經(jīng)約定好的)則數(shù)據(jù)包信息為4034。。如果我們發(fā)送信息為11時就要發(fā)送S01001D2.以特殊字符作為數(shù)據(jù)分割點進(jìn)行識別如:類似上面S40034D格式4034數(shù)字我們可以用字母將數(shù)據(jù)分割為即發(fā)送S40A34D。若發(fā)送11數(shù)字就可以發(fā)送S1A1D兩種通訊格式各有優(yōu)略,各自按照自己的習(xí)慣和具體通訊數(shù)據(jù)類型進(jìn)行選擇第一種數(shù)據(jù)處理方便,長度固定,但可能耗費較多資源。第二種需要分配空間,動態(tài)長度存儲,需要算法進(jìn)行解析處理。關(guān)于串口發(fā)送和接收函數(shù)的糾結(jié)糾結(jié)1:到底在發(fā)送的時候需不需要關(guān)閉串口中斷(ES=0)糾結(jié)2:為什么串口自己寫,少了一點點差別為什么很大串口的發(fā)送和接受方式有兩種方法:中斷法、輪詢法(不用中斷)首先,明確,串口接受數(shù)據(jù)、發(fā)送數(shù)據(jù)時是不需要CPU參與具體時序過程(不同于CPU模擬的IIC通訊,需要CPU模擬)的,是由定時器與串行口等硬件共同協(xié)助工作的。當(dāng)CPU置于SBUF=A語句時,就相當(dāng)于通知串口硬件工作并把A的八位的ASCII碼值一位一位滴發(fā)送出去。發(fā)送結(jié)束后有TI置1作為發(fā)送結(jié)束的中斷請求。當(dāng)上位機發(fā)送數(shù)據(jù)過來時,CPU是并不知道這件事的,等到一個字節(jié)接收完畢后,由硬件將RI置1,通知CPU有一字節(jié)數(shù)據(jù)到來,并已經(jīng)存至SBUF中可以取走。

RI、TI都是由硬件置1,由軟件清零的。#include“STC12C5A60S2.H“//忽略串口初始化程序unsignedcharbuf,rec_flag=0;statick=0;voidmain(){ Init_USRT(); while(1) { if(rec_flag==1) { rec_flag=0; SBUF=buf+k; } }}voidserial_ser()interrupt4{

if(TI)//發(fā)送中斷服務(wù)函數(shù) { TI=0;

k++; } if(RI)//接受中斷服務(wù)函數(shù) { RI=0;

buf=SBUF; rec_flag=1; }}RITI觸發(fā)的中斷進(jìn)行處理。想想問什么接收數(shù)據(jù)時常用中斷法,發(fā)送數(shù)據(jù)時常用輪詢等待法。while(!TI);TI=0;SBUF=0x0d;/*outputCR*/}if(RI){if(SBUF==XOFF){do{RI=0;while(!RI);}while(SBUF!=XON);RI=0;}}

while(!TI);TI=0;return(SBUF=c);}Printf()函數(shù)的內(nèi)部實現(xiàn)是由putchar實現(xiàn)#include<reg51.h>#defineXON0x11#defineXOFF0x13/**putchar(fullversion):expands'\n'intoCRLFandhandles*XON/XOFF(Ctrl+S/Ctrl+Q)protocol*/charputchar(charc){if(c=='\n'){if(RI){if(SBUF==XOFF){do{RI=0;while(!RI);}while(SBUF!=XON);RI=0;}}為什么printf()函數(shù)不能用中斷清零的方式進(jìn)行。而且在使用前將TI置1.

一般來說,串口發(fā)送部分都是如同你的程序所示(使用輪詢法進(jìn)行書寫),不進(jìn)入中斷,通過判斷TI來判斷是否需要發(fā)送下一個字節(jié),發(fā)送結(jié)束后一定要將TI軟件清0,否則會干擾后續(xù)的邏輯。(可以試一試,如果沒有清零且串口使能打開的情況下,后續(xù)程序就像速度減慢了許多倍一樣【不斷進(jìn)入串口中斷】)如果已打開了串口中斷,還必須把串口中斷關(guān)閉,等全部發(fā)送完以后再打開串口中斷,避

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論