示例#1
0
文件: GPRS.c 项目: 008agent/EKLZ_ALKO
// регистрация в Интернет посредством GPRS
Status On_GPRS(uint32_t timeout) {
  Timer1_Start(timeout);
  while(!Timer1_Status()) {
    modem_QISTAT();
    switch (qistat) {
    case IP_INITIAL:
      modem_QIREGAPP(OFF);   // регистрируем подключение GPRS
      break;
    case IP_START:
      modem_QIACT();      // регистрируемся в сети
    case IP_CONFIG:
    case IP_GPRSACT:
      modem_QILOCIP();    // Запрашиваем локальный IP адрес
      break;
    case IP_STATUS:
    case IP_CONNECTING:
    case IP_CLOSE:
    case CONNECT_OK:
         Timer1_Stop();
         return SUCCESS;
    case IP_IND:
      break;
    case PDP_DEACT:
    default:
      modem_QIDEACT();
    }
  } // End while
  Timer1_Stop();
  return ERROR;
}
示例#2
0
文件: GPRS.c 项目: 008agent/EKLZ_ALKO
Status Server_Send(char *output, uint32_t len, uint32_t time) {
  // Вывод данных из буфера output длиной len за время time
  uint32_t count = 0;
  uint32_t pktlen;

  if (!connect) return ERROR; // Пропал коннект, ничего не делаем

  modem_QISDE(OFF);   // Отключим эхо при выводе
  Timer1_Start(time);
  while(!Timer1_Status() && len) {
    if (len > 1460) {
      pktlen = 1460;
    } else pktlen = len;
    modem_QISEND(output, pktlen);
    if (!connect) return ERROR;   // В процессе передачи связь разорвалась
    if (mdm_err) break;
    if (send_ok == 1) {
      len -= pktlen;
      output += pktlen;
    }
  }
  Timer1_Stop();
  if (len) return ERROR;
  
  return SUCCESS;
}
示例#3
0
文件: GPRS.c 项目: 008agent/EKLZ_ALKO
// Ожидание очистки выходного буфера
Status Server_Flush(uint32_t time) {
  Timer1_Start(time);
  while (!Timer1_Status()) {
    modem_QISACK(0);
    if (qi_sent == qi_acked) break;
  }
  Timer1_Stop();
  if (qi_sent == qi_acked) return SUCCESS;
  return ERROR;
}
示例#4
0
// ============================= Отправляет команду на СП из буфера rd_UART и читает ответ в wr_UART ============================================= //
Status SendRcvdCmd()
{
  uint8_t length;
  uint16_t delay = 100;
  unsigned char *p_Out = &data_wr_UART[0];
  Timer1_Start(2500);      
  
  //-----------очистка буфера от мусора(заполнение нулями)
  memset(data_wr_UART,0,255);
  
  CS_Force(0);                  //активируем SS
  if(WAIT)                      //если перепад при неактивном WAIT
  {
    CS_Force(1);                //сбрасываем SS
    while(WAIT);                //ждем перепада WAIT в активное состояние
    CS_Force(0);                //снова активируем SS
  }           
  
  //------------отправка команды
  for(length=0;length<UART_RCV_COUNT;length++)
  {
     delay = 50;
     while(delay--);
     SPY_Byte(data_rd_UART[length]);
  }
    
  CS_Force(1); 
  Timer1_Stop();
  while(!WAIT);  //ждем перепада в 1

  while(WAIT);   //ждем готовности(перепада в 0) 
  Timer1_Start(2500); 
  CS_Force(0);

  //-------------получение ответа
  SPY_Byte(0);//отправка лишнего байта чтобы избавиться от мусора(остатка последней команды)
  for(length=1;length<255;length++)
  {
     *p_Out++ = SPY_Byte(length);
     delay = 50;
     while(delay--);
     if(WAIT) break;    //если придет WAIT==1, значит пора прекратить прием данных
  }
  CS_Force(1);

  return SUCCESS;
}
示例#5
0
文件: GPRS.c 项目: 008agent/EKLZ_ALKO
// Ожидание прихода данных в течении времени time. Если данные пришли - SUCCESS
Status Server_Receive(uint32_t time) {

  uint32_t len = 0;

  Timer1_Start(time);
  while(!Timer1_Status()) {
      while (GetAnswer(answer)) {
        Parse_Ans(answer);
      }
      if (!connect) return ERROR; // Пропал коннект, ничего не делаем
      if (qirdi) {
        do {
          len = input_len;
          modem_QIRD(RING_SIZE - input_len); // Чтобы случайно из буфера не выйти
        } while (len != input_len);
        if (input_len > 5) break;
      }
    }
    Timer1_Stop();
  if (len != input_len) return ERROR;
  return SUCCESS;
}
示例#6
0
文件: proto.c 项目: nowhard/IRDA
//-----------------------------------------------------------------------------------
void ModBusProcess(void)//главный процесс modbus
{
	switch(MD_STATE)
	{
//------------------------------------------
		case(MD_RESTART):
		{
		//	buf_count=0x0;//?? при включении ведет себя неадекватно, причина неизвестна
			Timer1_Reset();
			Timer1_Stop();
			
			cnt_15=0x0;
			cnt_35=0x0;

			TIMEOUT_15=0x0; //таймаут 1.5
			TIMEOUT_35=0x0; //таймаут 3.5
		
			MD_STATE=MD_WAIT;//переходим в состояние ожидания 
		}break;
//------------------------------------------
		case(MD_WAIT)://ожидание приема
		{
			//пусто
		}break;
//------------------------------------------
		case(MD_ADDR_CHECK):// проверка адреса
		{			
			if(RecieveBuf[0]==ADRESS_DEV)//если адрес совпал
			{
				MD_STATE=MD_CRC_CHECK;	//проверяем crc
			}
			else
			{
				MD_STATE=MD_RESTART;		//иначе ждем новой посылки
			}
			
		}break;
//------------------------------------------
		case(MD_CRC_CHECK):// проверка CRC
		{
		//нет реализации crc//реализация CRC появилась
		
			unsigned int CRC=0x0;
			CRC|=((RecieveBuf[buf_count-CRC_LEN]<<8)|(RecieveBuf[buf_count-CRC_LEN+1]));

					
			if(CRC16(&RecieveBuf,buf_count-CRC_LEN)==CRC)
			{
				MD_STATE=MD_BUF_HANDLING;
			}
			else
			{		
				CRC_ERR=0x1;//несовпадение CRC
	   			MD_STATE=MD_ERR_HANDLING;//на обработчик ошибки 
			}	
		}break;
//------------------------------------------
		case(MD_BUF_HANDLING):// обработка принятого буфера
		{	
				ModBusBufHandling();//процедура обработки сообщения	
				MD_STATE=MD_BUF_TRANSFER;//после обработки передаем сообщение		
		}break;
//------------------------------------------
		case(MD_BUF_TRANSFER):// передача буфера
		{
					UDR=TransferBuf[transf_count];//передача байта, остальным займется автомат
					transf_count++;	
					MD_STATE=MD_WAIT;//забросили данные в автомат и ждем		
		}break;
//------------------------------------------
		case(MD_ERR_HANDLING):// обработка ошибок // можно не реализовывать
		{
		
		//---обработка ошибок----
			CRC_ERR=0x0;	//ошибка crc
			COMMAND_ERR=0x0;//неподдерживаемая команда	

			MD_STATE=MD_RESTART;		//иначе рестарт и ждем новой посылки
		}break;
//------------------------------------------
	}
}