// регистрация в Интернет посредством 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; }
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; }
// Ожидание очистки выходного буфера 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; }
// ============================= Отправляет команду на СП из буфера 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; }
// Ожидание прихода данных в течении времени 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; }
//----------------------------------------------------------------------------------- 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; //------------------------------------------ } }