pos機(jī)顯示請(qǐng)連接串口線(xiàn),51單片機(jī)串口通信 環(huán)形緩沖區(qū)隊(duì)列

 新聞資訊  |   2023-05-20 10:22  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)顯示請(qǐng)連接串口線(xiàn),51單片機(jī)串口通信 環(huán)形緩沖區(qū)隊(duì)列的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)顯示請(qǐng)連接串口線(xiàn)的問(wèn)題,今天pos機(jī)之家(www.rcqwhg.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!

本文目錄一覽:

1、pos機(jī)顯示請(qǐng)連接串口線(xiàn)

pos機(jī)顯示請(qǐng)連接串口線(xiàn)

最近在做畢業(yè)設(shè)計(jì)剛好涉及到51單片機(jī),簡(jiǎn)單的研究一下發(fā)現(xiàn)51單片機(jī)串口只有一個(gè)字節(jié)的緩存,如果遇到單片機(jī)串口中斷沒(méi)有及時(shí)處理SBUF的值或者串口中斷長(zhǎng)時(shí)間未退出很容易照成數(shù)據(jù)丟失,于是就自己寫(xiě)了個(gè)緩沖區(qū),代價(jià)就是消耗一部分內(nèi)存空間,時(shí)間-空間本來(lái)就是一對(duì)矛盾體,想減少串口通信中數(shù)據(jù)丟失問(wèn)題只能犧牲部分空間,來(lái)減少數(shù)據(jù)通信過(guò)程中的丟失問(wèn)題。

核心代碼如下所示:

/**********************************************************/

#define BUFFER_MAX 16 //緩沖區(qū)大小

typedef struct _circle_buffer{

unsigned char head_pos; //緩沖區(qū)頭部位置

unsigned char tail_pos; //緩沖區(qū)尾部位置

unsigned char circle_buffer[BUFFER_MAX]; //緩沖區(qū)數(shù)組

}circle_buffer;

circle_buffer buffer;

void bufferPop(unsigned char* _buf)

{

if(buffer.head_pos==buffer.tail_pos) //如果頭尾接觸表示緩沖區(qū)為空

*_buf=0xFF;

else

{

*_buf=buffer.circle_buffer[buffer.head_pos]; //如果緩沖區(qū)非空則取頭節(jié)點(diǎn)值并偏移頭節(jié)點(diǎn)

if(++buffer.head_pos>=BUFFER_MAX)

buffer.head_pos=0;

}

}

void bufferPush(const unsigned char _buf)

{

buffer.circle_buffer[buffer.tail_pos]=_buf; //從尾部追加

if(++buffer.tail_pos>=BUFFER_MAX) //尾節(jié)點(diǎn)偏移

buffer.tail_pos=0; //大于數(shù)組最大長(zhǎng)度 制零 形成環(huán)形隊(duì)列

if(buffer.tail_pos==buffer.head_pos) //如果尾部節(jié)點(diǎn)追到頭部節(jié)點(diǎn) 則修改頭節(jié)點(diǎn)偏移位置丟棄早期數(shù)據(jù)

if(++buffer.head_pos>=BUFFER_MAX)

buffer.head_pos=0;

}

考慮到看到此博文的人可能有很多小白并不知道如何使用,在此簡(jiǎn)單的說(shuō)一下,假設(shè)你已經(jīng)能進(jìn)行簡(jiǎn)單的串口發(fā)送接收了,然后串口中斷部分可以這樣寫(xiě)

void serial1(void) interrupt 4

{

if(RI)

{

bufferPush(SBUF);

RI=0;

}

if(TI)

{

TI=0;

}

}

在主程序中我們只需要調(diào)用函數(shù)就行了如:

void main()

{

unsigned char dat ;

//讀取緩沖區(qū)一個(gè)字符,如果dat=0xff表示緩沖區(qū)為空,所以接收的字符不能有0xff。

bufferPop(&dat);

}

bufferPop函數(shù)中沒(méi)調(diào)用一次,便從緩沖區(qū)取出一個(gè)字符,頭部指針就會(huì)進(jìn)行偏移,具體看源碼并不是很復(fù)雜 只是一個(gè)數(shù)組類(lèi)型的環(huán)形FIFO緩沖區(qū)。

有一點(diǎn)要注意的是,如果緩沖區(qū)滿(mǎn)的話(huà),后面的數(shù)據(jù)會(huì)覆蓋最前面的數(shù)據(jù)。

你可以把緩沖區(qū)設(shè)置大些,就可以盡可能的減少數(shù)據(jù)覆蓋問(wèn)題,但是帶來(lái)的額外問(wèn)題就是51或者其他系列的單片機(jī)RAM是非常小的,并不像PC中緩沖區(qū)動(dòng)不動(dòng)就1024KB。所以緩沖區(qū)設(shè)置多大,根據(jù)自己需求調(diào)整就行了。

以上就是關(guān)于pos機(jī)顯示請(qǐng)連接串口線(xiàn),51單片機(jī)串口通信 環(huán)形緩沖區(qū)隊(duì)列的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)顯示請(qǐng)連接串口線(xiàn)的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://www.rcqwhg.com/news/49732.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。