arduino 与 汉枫HP_LPT100 wifi模块:第二篇 波特率自动识别。

流程大概就是这么个流程。

arduino 与 汉枫HP_LPT100 wifi模块:第二篇 波特率自动识别。_第1张图片


#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
#define  recv 0
#define  ok  1
#define standby 2
#define debug
SoftwareSerial Wifi_Serial(rxPin,txPin);
   
volatile unsigned char Wifi_uart_baud = 1;
int  read_usb_status = standby;
int  read_wifi_status = standby;
int pos = 0;
int detect_status = 0;
unsigned char recvbuff[100];
unsigned char sendbuff[100];
int i = 0;
int wifi_length = 0;
int usb_length = 0;
unsigned long  pre_time = 0,last_time = 0;
void updata_uart_parameter()
{
  long baud ;
  
  switch(Wifi_uart_baud)
  {
    case 1: baud = 1200; break;
    case 2: baud = 2400; break;
    case 3: baud = 4800; break;
    case 4: baud = 9600; break;
    case 5: baud = 14400; break;
    case 6: baud = 19200; break;
    case 7: baud = 38400; break;
    case 8: baud = 57600; break;
    case 9: baud = 115200;break;
    default : baud= 1200; break;
  }   
  
  Wifi_Serial.begin(baud);
  Wifi_Serial.listen();
  #ifdef debug
  Serial.write("enter updata baud subroutine");
  Serial.write('\n');
  #endif
}
void setup() {
  Serial.begin(9600);
  updata_uart_parameter();
 // Wifi_Serial.begin(9600);
  pinMode(rxPin,INPUT);
  pinMode(txPin,OUTPUT);
  
  memset(recvbuff,0,sizeof(recvbuff));
  memset(sendbuff,0,sizeof(sendbuff));
  delay(100); // wait for initial 
  
  send_Serial(Wifi_Serial,"+++");
  pre_time = millis();
}
void loop() {
  
  while(Wifi_Serial.available())
  {
     //Serial.print("detect send data");
    pre_time = millis();
    read_wifi_status = recv;
    read_Serial();
    delay(2);
  }
  
  if(read_wifi_status == ok)
  {
    judge_data();
    read_wifi_status = standby;
    wifi_length = 0;
  }
  
  
  while(Serial.available())
  {
    read_usb_status = recv;
   // read_com();
    delay(2);
  }
  
  if(read_usb_status == ok)
  {
   // com_Op();
    read_usb_status = standby;
    usb_length = 0;
  }
  
  last_time = millis();
  
  if( detect_status ==0 && last_time - pre_time > 2000)  //如果2秒之内没有返回任何数据且没有进入过数据判断分支就改变波特率重发一次
  {
     #ifdef debug
    Serial.write("enter timeout subroutine");
    Serial.write('\n');
    #endif
    
    acc_uart();
    pre_time = millis();
  }
  
}
void read_Serial()
{
 char ch;
    if(wifi_length < 100)
    {
      ch = Wifi_Serial.read();
      if(ch >0)
      {
        recvbuff[wifi_length]=ch;
      }
      wifi_length ++;
      if(!Wifi_Serial.available()) read_wifi_status = ok ;    //串口缓存区没有任何数据就判断已经读完了?
    }else{
      if(pos == 0) 
      {
        Serial.write((const char *)recvbuff,100);
      }
      delay(2);
      //display_stream();
      //Serial.println("wifi data more than 100 bytes"); 
    }
   
}
void  judge_data()
{
  recvbuff[wifi_length]='\0';
  if(strcmp((const char *)recvbuff,"a") == 0)
  {
      
      detect_status = 1;
    //delay(2);
    //send_Serial(Wifi_Serial,"a");
    Serial.write("judge ok baud is:");
    Serial.println(Wifi_uart_baud);
    
    auto_login_cmd();      //判断对了就开始登录到命令行模式
    
  }else{     //数据判断不对,改变波特率重发
    
    #ifdef debug
    Serial.write("judge data recv :");
    Serial.write((const char*)recvbuff);
    Serial.write("wifi_length \n");
    Serial.print(wifi_length);
    Serial.write('\n');
    #endif 
    
    acc_uart();    
    
  }
   
  //Serial.write((const char *)recvbuff);
  
}
void acc_uart()
{
    #ifdef debug
    Serial.write("enter change baud subroutine ");
    Serial.write('\n');
    #endif
    
    if(Wifi_uart_baud< 9)
      Wifi_uart_baud++;
    else
      Wifi_uart_baud = 1;
    
    delay(400);
    updata_uart_parameter();
    send_Serial(Wifi_Serial,"+++");
    
    #ifdef debug
    Serial.write( "chang baud subroutine Wifi_uart_baud is :");
    Serial.print(Wifi_uart_baud);
    Serial.write('\n');
    #endif
}
void send_Serial(SoftwareSerial s,const char  *string)
{
    s.write(string);
}
void auto_login_cmd()
{
    
    
}

你可能感兴趣的:(arduino 与 汉枫HP_LPT100 wifi模块:第二篇 波特率自动识别。)