串口数据问题
#include <mega64.h>#include <string.h>
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
char rx_buffer1;
#if RX_BUFFER_SIZE1<256
//i需要长整数型才能使用
//unsigned int 16位 0~65535
unsigned int i=0;
char flag = 0;
unsignedchar rx_wr_index1,rx_rd_index1,rx_counter1,huanflag = 0,huanflag1 = 0,enterflag = 0,ureceive,flags = 0,flagu = 0,flagb = 0,flagm = 0,flagi = 0,flagt = 0;
//数组的结束符用16进制表示为 0A 0D;因为加了换车
char inbox, login1[] ={0x47,0x45,0x54,0x20,0x2F,0x20,0x48,0x54,0x54,0x50,0x2F,0x31,0x2E,0x31};
char login2[]={"GET / HTTP/1.1"};
char submit[]={"submit"};
char requesttop={"HTTP/1.1 200 OK","Cache-Control:private","Connection:Keep-Alive","Content-Type:text/html;charset=utf-8","Content-Length:1545","Last-Modified:Wed,17 Mar 2013 16:04:30 GMT",
"Date:Wed,17 Mar 2013 16:04:30 GMT",""};
char posttop={"HTTP/1.1 200 OK","Cache-Control:private","Connection:Keep-Alive","Content-Type:text/html;charset=utf-8","Content-Length:5224","Last-Modified:Wed,17 Mar 2013 16:04:30 GMT",
"Date:Wed,17 Mar 2013 16:04:30 GMT",""};
char flash loginye={
};
char flash statue= {
0x3C,0x2F,0x68,0x74,0x6D,0x6C,0x3E
};
#pragma used+
void putchar1(unsigned char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-
void uart_prints1(char flash *s)
{
while(*s)
{
putchar1(*s);
s++;
}
}
//带回车的字符串输出
int uart_print(char *s)
{
while(*s)
{
putchar1(*s);
s++;
}
putchar1(0x0a);//回车换行
putchar1(0x0d);
return 1;
}
//不带回车换行的字符串输出
void uart_prints(char *s)
{
while(*s)
{
putchar1(*s);
s++;
}
}
// USART1 Receiver interrupt service routine
interrupt void usart1_rx_isr(void)
{
/********************************************/
ureceive=UDR1;
//if(ureceive!=0x0A)
//{
//inbox = ureceive;
//i++;
//flag = 0;
//}
//if(ureceive==0x0A)
//{
//inbox = ureceive;
//flag =1;
////i = 0;
//}
/*************************/
inbox = ureceive;
i++ ;
//或者使用指针
//*inbox = ureceive;
// inbox++;
if(ureceive == 0x0D && enterflag == 0 && huanflag == 0 && huanflag1 ==0){ //第一次接受到0a时置huanflag为1
//存入数据
// inbox = ureceive;
//设置换行标志符为一
huanflag1 = 1;
// i++;
}else if(ureceive == 0x0A && enterflag == 0 && huanflag == 0 && huanflag1 == 1){ //第一次接受到0a时置enterflag为1
// //存入数据
// inbox = ureceive;
//设置回车标志符为一
enterflag = 1;
// i++;
}
//因为假如接受到od后,紧接着就接再次接受到0A,所以在od跟0a之间不需要再判断
else if(ureceive == 0x0D && enterflag == 1 && huanflag == 0 && huanflag1 == 1) //第二次接受到0a,
{
//存入数据
// inbox = ureceive;
// i++;
//设置换行标志符为一
huanflag = 1;
}
//最后判断一次0A 成功就flag总标志位加1,等接受到0d 0a 0d 0a 0d 0a 0d 0a时哈哈,掂左,试试
else if(ureceive == 0x0A && enterflag == 1 && huanflag == 1 && huanflag1 == 1) ////第一次接受到0a时置
{
//存入数据
// inbox = ureceive;
//设置总标志位为1表示头文件接受完毕
flag++;
putchar1(flag);
//设置换行标志符为0
enterflag = 0;
huanflag = 0;
huanflag1 = 0;
}
else if(ureceive != 0x0A && enterflag == 0 && huanflag == 0 && huanflag1 ==1)//第一个0d后数据不为0a时不考虑其他情况直接加入,不职位
{
//存入数据
// inbox = ureceive;
//设置换行标志符为一
huanflag = 0;
// i++;
}
else if(ureceive != 0x0D && enterflag == 1 && huanflag == 0 && huanflag1 ==1)//第一个0a后数据不为0a时不考虑其他情况直接加入,不职位
{
// //存入数据
// inbox = ureceive;
//设置换行标志符为一
huanflag1 = 0;
// enterflag = 0;
// i++;
}
else if(ureceive != 0x0A && enterflag == 1 && huanflag == 1 && huanflag1 ==1)//第二个0d后数据不为0a时不考虑其他情况直接加入,不职位
{
// 存入数据
// inbox = ureceive;
//设置换行标志符为一
huanflag1 = 0;
enterflag = 0;
huanflag = 0;
// i++;
}
// else if(strstr(inbox,"submit"))
//{ flag++;
// uart_print("xxxx");
// putchar1(flag);
//}
//else{
// uart_prints("2");
}
void main(void)
{
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
TIMSK=0x00;
ETIMSK=0x00;
// USART1 Baud Rate: 9600
UCSR1A=0x00;
UCSR1B=0x98;
UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x33;
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
if(flag == 1)
{
uart_prints(inbox);
inbox='\0';
uart_prints("我是谁");
}
/******************
if(strstr(inbox,login2))
{
int k;
for(k = 0;k<=8;k++)
{
uart_prints(requesttop);
putchar1(0x0a);//回车换行
putchar1(0x0d);
}
flag = 0;
i = 0;
uart_prints1(loginye);
// memset(inbox,0,sizeof(inbox)/sizeof(char));
//inbox='\0';
//uart_prints("2223");
}
}
// else if(flag == 2){
// if(strstr(inbox,"user_name=liweiyuan&user_password=woaishui"))
// {
// int m;
// flag = 0;
// i = 0;
//
// for(m = 0;m<=8;m++)
// {
// uart_prints(posttop);
// putchar1(0x0a);//回车换行
// putchar1(0x0d);
// }
// uart_prints1(statue);;
// }
// }
// if(strstr(inbox,login2) && strstr(inbox,"654321") && strstr(inbox,"123456"))
// {
// int m;
// for(m = 0;m<=8;m++)
// {
// uart_prints(posttop);
// putchar1(0x0a);//回车换行
// putchar1(0x0d);
// }
// uart_prints1(statue);
// flag = 0;
// }else
// {
// int k;
// for(k = 0;k<=8;k++)
// {
// uart_prints(requesttop);
// putchar1(0x0a);//回车换行
// putchar1(0x0d);
// }
// }
// }
***/
};
}
发送一串数据加上0X0D,0X0A,0X0D,0X0A能够完全没有数据返回了,inbox好像数据没有了
是什么情况,发少于256个数据可以接受到并返回inbox的数据,超过就不行
没有人可以给小弟讲讲么?
页:
[1]