?? serial.c
字號:
//本函數集來自“51單片機世界”,作者斑竹丁丁(聶小猛)。
//主頁地址http://www.mcu51.com
//串口中斷服務程序,僅需做簡單調用即可完成串口輸入輸出的處理
//出入均設有緩沖區,大小可任意設置。
//可供使用的函數名:
//char getbyte(void);從接收緩沖區取一個byte,如不想等待則在調用前檢測inbufsign是否為1。
//getline(char idata *line, unsigned char n); 獲取一行數據回車結束,必須定義最大輸入字符數
//putbyte(char c);放入一個字節到發送緩沖區
//putbytes(unsigned char *outplace,j);放一串數據到發送緩沖區,自定義長度
//putstring(unsigned char code *puts);發送一個定義在程序存儲區的字符串到串口
//puthex(unsigned char c);發送一個字節的hex碼,分成兩個字節發。
//putchar(uchar c,uchar j);輸出一個無符號字符數的十進制表示,必須標示小數點的位置,自動刪除前面無用的零
//putint(uint ui,uchar j);輸出一個無符號整型數的十進制表示,必須標示小數點的位置,自動刪除前面無用的零
//delay(unsigned char d); 延時n x 100ns
//putinbuf(uchar c);人工輸入一個字符到輸入緩沖區
//CR;發送一個回車換行
//*************************************************************************
#include <w77e58.h>
#include "global.h"
#include "serial.h"
#include "timer.h"
#include "m32.h"
extern uchar idata SysTimer;
extern char xdata ans[];
#define OLEN 32 /* size of serial transmission buffer */
xdata unsigned char outbuf[OLEN]; /* storage for transmission buffer */
unsigned char xdata *outlast=outbuf; //最后由中斷傳輸出去的字節位置
unsigned char xdata *putlast=outbuf; //最后放入發送緩沖區的字節位置
xdata unsigned char outbuf1[OLEN]; /* storage for transmission buffer */
unsigned char xdata *outlast1=outbuf1; //最后由中斷傳輸出去的字節位置
unsigned char xdata *putlast1=outbuf1; //最后放入發送緩沖區的字節位置
#define ILEN 32 /* OLD 12 size of serial receiving buffer */
#define ILEN1 12 /* size of serial receiving buffer */
idata unsigned char inbuf[ILEN];
unsigned char idata *inlast=inbuf; //最后由中斷進入接收緩沖區的字節位置
unsigned char idata *getlast=inbuf; //最后取走的字節位置
idata unsigned char inbuf_1[ILEN1];
unsigned char idata *inlast_1=inbuf_1; //最后由中斷進入接收緩沖區的字節位置
unsigned char idata *getlast_1=inbuf_1; //最后取走的字節位置
bit outbufsign0; //最后一個數據覵BUF發完標志 發完=0
bit outbufsign; //輸出緩沖區非空標志 有=1
bit inbufsign; //接收緩沖區非空標志 有=1
bit inbufful; //輸入緩沖區滿標志 滿=1
bit outbufsign01; //最后一個數據覵BUF發完標志 發完=0
bit outbufsign1; //輸出緩沖區非空標志 有=1
bit inbufsign_1; //接收緩沖區非空標志 有=1
bit inbufful_1; //輸入緩沖區滿標志 滿=1
extern uchar idata SysTimer;
extern uchar idata Uart0Timer;
#define CR putstring("\r\n") //CR=回車換行
//*****************************
//放入一個字節到發送緩沖區
void putbyte(char xdata c)
{
uchar xdata i,j;
ES=0; /*暫停串行中斷,以免數據比較時出錯? */
//if (outlast=putlast)
while ( (((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)==2)))
{ ES=1; c++;c--;ES=0;
// i=(0-TH1);
// do{i--;j=39; do {j--;}while(j!=0); }while(i!=0); //i=39
}
*putlast=c; //放字節進入緩沖區
putlast++; //發送緩沖區指針加一
if (putlast==outbuf+OLEN) putlast=outbuf; //指針到了頂部換到底部
outbufsign=1;
if (!outbufsign0) {outbufsign0=1;TI=1; } //緩沖區開始為空置為有,啟動發送
ES=1;
}
void putbyte1(char xdata c)
{
uchar xdata i,j;
ES1=0; /*暫停串行中斷,以免數據比較時出錯? */
//if (outlast=putlast)
while ( (((outlast1-putlast1)==2) && (outlast1 > putlast1 )) || ((outlast1 < putlast1) && (OLEN-(putlast1-outlast1)==2)))
{ ES1=1; c++;c--;ES1=0;
}
*putlast1=c; //放字節進入緩沖區
putlast1++; //發送緩沖區指針加一
if (putlast1==outbuf1+OLEN) putlast1=outbuf1; //指針到了頂部換到底部
outbufsign1=1;
if (!outbufsign01) {outbufsign01=1;TI_1=1; } //緩沖區開始為空置為有,啟動發送
ES1=1;
}
#if 0
//******************************
//放一串數據到發送緩沖區
void putbytes(unsigned char xdata* outplace,int xdata j)
{
int xdata i;
for(i=0;i<j;i++)
{
putbyte(*outplace);
outplace++;
}
}
//******************************
//放一串數據到發送緩沖區
void putbytes1(unsigned char xdata* outplace,int xdata j)
{
int xdata i;
for(i=0;i<j;i++)
{
putbyte1(*outplace);
outplace++;
}
}
#endif
#if 0
//******************************
//輸出一個無符號字符數的十進制表示,必須標示小數點的位置,自動刪除前面無用的零
//例如putchar(0x32,2),輸出"4.8".
//putchar(0x32,3),輸出"0.48".
//putchar(0x32,1),輸出"48".
void putchar(uchar c,uchar j)
{
uchar idata free[4];uchar data i;
i=0;
free[i++]=(c/100+0x30);
if (j==3) free[i++]='.';
free[i++]=(c%100)/10+0x30;
if (j==2) free[i++]='.';
if (j==2 && free[i-3]==0x30) free[i-3]=0x20;
free[i++]=(c%10)+0x30;
if (j==1 && free[i-3]==0x30) free[i-3]=0x20;
if (j==1 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20;
putbytes(free,i);
}
//******************************
//輸出一個無符號整型數的十進制表示,必須標示小數點的位置,自動刪除前面無用的零
void putint(uint ui,uchar j)
{uchar idata free[6];
uchar data i;
i=0;
free[i++]=(ui/10000+0x30);
if (j==5) free[i++]='.';
free[i++]=((ui%10000)/1000+0x30);
if (j==4) free[i++]='.';
if (j==4 && free[i-3]==0x30) free[i-3]=0x20;
free[i++]=((ui%1000)/100+0x30);
if (j==3) free[i++]='.';
if (j==3 && free[i-4]==0x30) free[i-4]=0x20;
if (j==3 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;
free[i++]=((ui%100)/10+0x30);
if (j==2) free[i++]='.';
if (j==2 && free[i-5]==0x30) free[i-5]=0x20;
if (j==2 && free[i-5]==0x20 && free[i-4]==0x30) free[i-4]=0x20;
if (j==2 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;
free[i++]=(ui%10+0x30);
if (j==1 && free[i-5]==0x30) free[i-5]=0x20;
if (j==1 && free[i-5]==0x20 && free[i-4]==0x30) free[i-4]=0x20;
if (j==1 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;
if (j==1 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20;
putbytes(free,i);
}
#endif
//***************************************
//發送一個定義在程序存儲區的字符串到串口
void putstring(unsigned char *puts)
{
for (;*puts!=0;puts++) //遇到停止符0結束
{
putbyte(*puts);
}
}
void putstring1(unsigned char *puts)
{
for (;*puts!=0;puts++) //遇到停止符0結束
{
putbyte1(*puts);
}
}
#if 0
//*************************************
//發送一個字節的hex碼,分成兩個字節發。
unsigned char code hex_[]={"0123456789ABCDEF"};
void puthex(unsigned char c)
{
int ch;
ch=(c>>4)&0x0f;
putbyte(hex_[ch]);
ch=c&0x0f;
putbyte(hex_[ch]);
}
#endif
//*************************************
//從接收緩沖區取一個byte,如不想等待則在調用前檢測inbufsign是否為1。
uchar getbyte (void)
{
char idata c ;
while (!inbufsign); //緩沖區空等待
ES=0;
c= *getlast; //取數據
getlast++; //最后取走的數據位置加一
inbufful=0; //輸入緩沖區的滿標志清零
if(getlast==inbuf+ILEN) getlast=inbuf; //地址到頂部回到底部
if (getlast==inlast) inbufsign=0; //地址相等置接收緩沖區空空標志,再取數前要檢該標志
ES=1;
return (c); //取回數據
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -