📄 uart.c
字号:
// edit by chendong ,2004-4-22
//ULCON1: [31..8] [7] [6] [5..3] [2] [1..0]
// IR X PMD STB WL
// 0 1 000 0 11
// NORMAL UCLK NO P 1STOP 8BIT
//UCON1: [31..8] [7] [6] [5] [4..3] [2] [1..0]
// LPB SBK DSR TxM RxSI RxM
// 00 0 0 01 0 01
//
//USTAT1 [31..8] [7] [6] [5] [4] [3] [2] [1] [0]
// TC TBE RDR DTR BKD FE PE OV
// @ @
//UBRDIV1 [31..16] [15..4] [3..1]
// CNT0 CNT1
// 101111 0000 >>>38400
#include "vd.h"
extern B32 ltoa(B32 value,char data[],B32 radix); //transfer value to string,radix=[2..36]
void uartinit(void);
void uartsend(char data[]);
char uartreceive(char data[]);
char queuepush_T(char data);
char queuepop_T(void);
B16 queuetest_T(void);
char queuepush_R(char data);
char queuepop_R(void);
B16 queuetest_R(void);
void uartpush(char data[]);
void uartpushdata(char data[],int num);
B16 uartpop(char data[]);
void B32tos(B32 value,char data[]);
char dataall[255];
B8 UARTBUF_T[65536];
B8 UARTBUF_R[65536];
B16 UARTBUF_T_T=0; //T=TOP B=BOTTOM
B16 UARTBUF_R_T=0; //T 指向最后应该输入数据的位置
B16 UARTBUF_T_B=0; //B 指向最早输入数据的位置
B16 UARTBUF_R_B=0; //B=T 意味着空 T+1=B 意味着满
void uartinit(void)
{
ULCON1=0x00000003;//串口0,速率38400,内部晶阵。
UCON1=0x00000009;
UBRDIV1=0x00000280;
}
void uartsend(char data[])
{
B32 i;
for(i=0;data[i]!='\0';i++)
{
while((USTAT1&0x00000040)==0x00000000);
UTXBUF1=(B32)data[i]; //汉字的显示先写入高字节,再写入低字节, 注意下面的说明
}
}
char uartreceive(char data[])
{
if((USTAT1&0x00000020)!=0x00000000)
{
data[0]=(char)URXBUF1;
data[1]='\0';
return(1);
}
else
return(0);
}
///////////////////////////////
B16 queuetest_T()
{
B16 data;
if(UARTBUF_T_T>=UARTBUF_T_B)
data=UARTBUF_T_T-UARTBUF_T_B;
else
data=UARTBUF_T_T-UARTBUF_T_B+65536;
return(data);
}
char queuepush_T(char data)
{
if(((USTAT1&0x00000040)!=0x00000000)&(UARTBUF_T_T==UARTBUF_T_B))
UTXBUF1=(int)data;
else if(UARTBUF_T_T+1!=UARTBUF_T_B)
{
UARTBUF_T[UARTBUF_T_T]=data;
UARTBUF_T_T++;
}
else
{
uartsend("TXDBUFF overflow!");
ltoa((B32)UARTBUF_T_T,dataall,10);
uartsend(dataall);
uartsend("\n\r");
ltoa((B32)UARTBUF_T_B,dataall,10);
uartsend(dataall);
uartsend("\n\r");
return(0);
}
return(1);
}
char queuepop_T(void)
{
char data;
if(UARTBUF_T_T!=UARTBUF_T_B)
{
data=UARTBUF_T[UARTBUF_T_B];
UARTBUF_T_B++;
}
return(data);
}
void uartpush(char data[])
{
int i=0;
while(data[i]!='\0')
{
queuepush_T(data[i]);
i++;
}
//if((USTAT1&0x00000040)!=0x00000000)
//if(queuetest_T()!=0)
//UTXBUF1=queuepop_T();
}
void uartpushdata(char data[],int num)
{
int i=0;
for(i=0;i<num;i++)
queuepush_T(data[i]);
if((USTAT1&0x00000040)!=0x00000000)
if(queuetest_T()!=0)
UTXBUF1=queuepop_T();
}
//////////////////////////////////
B16 queuetest_R() //返回值为队列中的数据数目
{
B16 data;
if(UARTBUF_R_T>=UARTBUF_R_B)
data=UARTBUF_R_T-UARTBUF_R_B;
else
data=UARTBUF_R_T-UARTBUF_R_B+65536;
return(data);
}
char queuepush_R(char data)
{
if(UARTBUF_R_T+1!=UARTBUF_R_B)
{
UARTBUF_R[UARTBUF_R_T]=data;
UARTBUF_R_T++;
}
else
{
uartsend("RXDBUFF overflow!");
return(0);
}
return(1);
}
char queuepop_R(void)
{
char data;
if(UARTBUF_R_T!=UARTBUF_R_B)
{
data=UARTBUF_T[UARTBUF_R_B];
UARTBUF_R_B++;
}
else if((USTAT1&0x00000020)!=0x00000000)
{
data=(char)URXBUF1;
}
return(data);
}
B16 uartpop(char data[])
{
B16 i,num;
num=queuetest_R();
for(;i<num;i++)
data[i]=queuepop_R();
data[i]='\0';
return(num); //返回数据个数
}
//////////////////////////
void B32tos(B32 value,char data[])
{
data[0]=value%256;
value=value/256;
data[1]=value%256;
value=value/256;
data[2]=value%256;
value=value/256;
data[3]=value%256;
data[4]='\0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -