liweiyuangangan 发表于 2013-3-29 23:34:19

串口数据问题

#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的数据,超过就不行

liweiyuangangan 发表于 2013-3-30 08:38:59

没有人可以给小弟讲讲么?
页: [1]
查看完整版本: 串口数据问题