網(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í),希望能夠幫助到大家!