網(wǎng)上有很多關(guān)于pos機顯示請連接串口線(xiàn),51單片機串口通信 環(huán)形緩沖區隊列的知識,也有很多人為大家解答關(guān)于pos機顯示請連接串口線(xiàn)的問(wèn)題,今天pos機之家(m.xjcwpx.cn)為大家整理了關(guān)于這方面的知識,讓我們一起來(lái)看下吧!
本文目錄一覽:
pos機顯示請連接串口線(xiàn)
最近在做畢業(yè)設計剛好涉及到51單片機,簡(jiǎn)單的研究一下發(fā)現51單片機串口只有一個(gè)字節的緩存,如果遇到單片機串口中斷沒(méi)有及時(shí)處理SBUF的值或者串口中斷長(cháng)時(shí)間未退出很容易照成數據丟失,于是就自己寫(xiě)了個(gè)緩沖區,代價(jià)就是消耗一部分內存空間,時(shí)間-空間本來(lái)就是一對矛盾體,想減少串口通信中數據丟失問(wèn)題只能犧牲部分空間,來(lái)減少數據通信過(guò)程中的丟失問(wèn)題。
核心代碼如下所示:
/**********************************************************/
#define BUFFER_MAX 16 //緩沖區大小
typedef struct _circle_buffer{
unsigned char head_pos; //緩沖區頭部位置
unsigned char tail_pos; //緩沖區尾部位置
unsigned char circle_buffer[BUFFER_MAX]; //緩沖區數組
}circle_buffer;
circle_buffer buffer;
void bufferPop(unsigned char* _buf)
{
if(buffer.head_pos==buffer.tail_pos) //如果頭尾接觸表示緩沖區為空
*_buf=0xFF;
else
{
*_buf=buffer.circle_buffer[buffer.head_pos]; //如果緩沖區非空則取頭節點(diǎn)值并偏移頭節點(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) //尾節點(diǎn)偏移
buffer.tail_pos=0; //大于數組最大長(cháng)度 制零 形成環(huán)形隊列
if(buffer.tail_pos==buffer.head_pos) //如果尾部節點(diǎn)追到頭部節點(diǎn) 則修改頭節點(diǎn)偏移位置丟棄早期數據
if(++buffer.head_pos>=BUFFER_MAX)
buffer.head_pos=0;
}
考慮到看到此博文的人可能有很多小白并不知道如何使用,在此簡(jiǎn)單的說(shuō)一下,假設你已經(jīng)能進(jìn)行簡(jiǎn)單的串口發(fā)送接收了,然后串口中斷部分可以這樣寫(xiě)
void serial1(void) interrupt 4
{
if(RI)
{
bufferPush(SBUF);
RI=0;
}
if(TI)
{
TI=0;
}
}
在主程序中我們只需要調用函數就行了如:
void main()
{
unsigned char dat ;
//讀取緩沖區一個(gè)字符,如果dat=0xff表示緩沖區為空,所以接收的字符不能有0xff。
bufferPop(&dat);
}
bufferPop函數中沒(méi)調用一次,便從緩沖區取出一個(gè)字符,頭部指針就會(huì )進(jìn)行偏移,具體看源碼并不是很復雜 只是一個(gè)數組類(lèi)型的環(huán)形FIFO緩沖區。
有一點(diǎn)要注意的是,如果緩沖區滿(mǎn)的話(huà),后面的數據會(huì )覆蓋最前面的數據。
你可以把緩沖區設置大些,就可以盡可能的減少數據覆蓋問(wèn)題,但是帶來(lái)的額外問(wèn)題就是51或者其他系列的單片機RAM是非常小的,并不像PC中緩沖區動(dòng)不動(dòng)就1024KB。所以緩沖區設置多大,根據自己需求調整就行了。
以上就是關(guān)于pos機顯示請連接串口線(xiàn),51單片機串口通信 環(huán)形緩沖區隊列的知識,后面我們會(huì )繼續為大家整理關(guān)于pos機顯示請連接串口線(xiàn)的知識,希望能夠幫助到大家!
