📄 myserial.c.txt
字号:
#include <AT89X51.h>
//static unsigned char data CN[4];
//unsigned char TS[8] = {254,252,248,240,224,192,128,0};
char CT=0; //接收字符序列
char CT1=0;
unsigned char tempchar;//异或结果暂存
unsigned char tempchar1;
int startaddress2=0x8000;//发送数据的存放地址
int startaddress1=0x8030;//接收数据的存放地址
unsigned char datalength=16;//数据长度
unsigned char blocklength=4;//进行传输时的数据块长度
char xdata * Pointdata2;//外部数据存储器地址指针,发送区指针
char xdata * Pointdata1;//外部数据存储器地址指针,接收区指针
unsigned char data * recieve;//接收暂存
unsigned char flag=0;//默认=0是发送,等于1是接收
void main(void)
{
void InitCom(unsigned char BaudRate);
void ComOutChar(unsigned char OutData);
void ComInChar(char * InData);
void ComOutBlock();
void TransportFeed(unsigned char feed);
void transportfalse();
unsigned int a=0;
unsigned char b='a';//数据
//数据输出区初始化
Pointdata2=startaddress2;
/* for(a=0;a<datalength;a++)
{
*Pointdata2=b++;
if(a==1) *Pointdata2='a';
if(a==2) *Pointdata2=0xFF;
if(a==3) *Pointdata2=0x9E;
Pointdata2++;
}*/
Pointdata2=startaddress2;
Pointdata1=startaddress1;
CT = 0; //接收字符序列
tempchar=0;//接收暂存;
CT1=0;
tempchar1=0;
InitCom(6); //设置波特率为9600 1-8 波特率300-57600
EA = 1;
ES = 1; //开串口中断
// ComOutBlock();
// ComOutBlock();
flag=1;
do
{
for (a=0; a<30000; a++)
P3_6 = 1;
for (a=0; a<30000; a++) //指示灯闪动
P3_6 = 0;
}
while(1);
}
//串口初始化 晶振为11.0592M 方式1 波特率300-57600
void InitCom(unsigned char BaudRate)
{
unsigned char THTL;
switch (BaudRate)
{
case 1: THTL = 64; break; //波特率300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1 定时方式2
TCON = 0x40; //设定时器1 开始计数
TH1 = THTL;
TL1 = THTL;
PCON = 0x80; //波特率加倍控制,SMOD 位
RI = 0; //清收发标志
TI = 0;
TR1 = 1; //启动定时器
}
void dataprocesser()//处理接收到的数据,进行存储
{
unsigned char a=0;
unsigned char data * rc=recieve;
for(a=0;a<blocklength;a++)
{
*Pointdata1=*rc;
Pointdata1++;
rc++;
}
}
void ComInINT(void) interrupt 4 using 1
{
if (RI&flag) //接收中断处理程序
{
if (CT>=blocklength)//第blocklength+1个字符为校验位,要进行处理
{
CT = -1; //收完一组数据,序列指针清零
RI = 0;
recieve-=blocklength;
if(tempchar==SBUF)//校验正确
{
ComOutChar(1);
dataprocesser();
}
else//没有通过校验
{
ComOutChar(0);
//无论成功与否要进行反馈通知发送方
}
}
else
{
*recieve=SBUF;
recieve++;
}
if(CT==0)
tempchar=SBUF;
else
if (CT>0)//如果是接收的第一个字符暂时无法进行异或运算
tempchar^=SBUF;
CT++;
RI = 0; //RI 清零
}
}
void ComOutBlock()//发送一个数据块
{
unsigned char a=0;
char temp;
char feed;
CT1=0;
flag=0;
for(a=0;a<=blocklength;a++)
{
temp=*Pointdata2;
if(CT1==0)
{
tempchar1=temp;
ComOutChar(temp);
Pointdata2++;
}
if(CT1>0&&CT1<blocklength)
{
tempchar1^=temp;
ComOutChar(temp);
Pointdata2++;
}
if(CT1==blocklength)
{
temp=tempchar1;
CT1=-1;
ComOutChar(tempchar1);
ComInChar(&feed);
if(feed=='a')
{
//Pointdata2+=1;
// Pointdata2-=1;
//transportsuc();//发送成功
}
else
{
transportfalse();//发送失败
}
}
CT1++;
}
}
void transportfalse()//发送失败处理程序
{
CT1=0;
Pointdata2=Pointdata2-blocklength;
ComOutBlock();
}
void ComInChar(char * feed)//从串口接收一个字符
{
char * InData=feed;
while(!RI); //空语句判断字符是否收完
*InData=SBUF;
RI = 0; //清RI
}
void ComOutChar(unsigned char OutData)//向串口发送一个字符
{
SBUF = OutData; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -