Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Код программы





#include "gprs.h";

 

#include "ch.h"

#include "hal.h"

 

#include <string.h>

 

#include "util.h"

#include "led.h"

 

#define GPRS_CMD_BUF 256

#define ATZ_RETRY 5

#define CMD_WAIT_TIME 250

 

#define GPRS_SERIAL SD2

 

SerialConfig SD2_Config = {

.sc_speed = 115200,

.sc_cr2 = USART_CR2_STOP1_BITS,

.sc_cr3 = USART_CR3_RTSE | USART_CR3_CTSE

};

 

uint8_t *gprs_data = NULL;

 

static WORKING_AREA(waGPRSThread, 256);

static msg_t GPRSThread (void *arg) {

(void)arg;

 

if (gprs_data!= NULL) {

chHeapFree(gprs_data);

}

 

gprs_data = chHeapAlloc(NULL, GPRS_CMD_BUF);

size_t gprs_bytes_read;

uint16_t signal_level;

uint16_t i;

char num_buf[16];

uint8_t num_len;

chRegSetThreadName("gprs_thread");

 

if (gprs_data == NULL) {

while (TRUE) {

//palTogglePad(GPIO_LED_1_PORT, GPIO_LED_1_PIN);

chThdSleepMilliseconds(50);

}

}

 

sdStart(&GPRS_SERIAL, &SD2_Config);

palSetPadMode(GPRS_USART_PORT, GPRS_USART_TX_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPRS_USART_PORT, GPRS_USART_RX_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPRS_USART_PORT, GPRS_USART_CTS_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPRS_USART_PORT, GPRS_USART_RTS_PIN, PAL_MODE_ALTERNATE(7));

 

palSetPadMode(GPIO_GPRS_PWR_BAT_PORT, GPIO_GPRS_PWR_BAT_PIN, PAL_MODE_OUTPUT_PUSHPULL);

palSetPadMode(GPIO_GPRS_RESET_PORT, GPIO_GPRS_RESET_PIN, PAL_MODE_OUTPUT_OPENDRAIN);

 

// Turn on GPRS power

palClearPad(GPIO_GPRS_PWR_BAT_PORT, GPIO_GPRS_PWR_BAT_PIN);

 

chThdSleepSeconds(5);

 

while (TRUE) {

//palTogglePad(GPIO_LED_1_PORT, GPIO_LED_1_PIN);

 

if (init_modem() == E_OK)

break;

}

 

set_led_0_prescaler(5);

 

uint8_t counter = 0;

 

while (TRUE) {

counter++;

if (counter == 10) {

counter = 0;

send_tcp_message();

}

 

//palTogglePad(GPIO_LED_1_PORT, GPIO_LED_1_PIN);

 

if (is_gprs_network_ok() == TRUE) {

//sdWrite(&SD1, "NETWORK REGISTERED", sizeof("NETWORK REGISTERED") - 1);

} else {

//sdWrite(&SD1, "NO NETWORK", sizeof("NO NETWORK") - 1);

}

 

chThdSleepMilliseconds(100);

 

if (gprs_get_signal_level(&signal_level) == E_OK) {

 

/* sdWrite(&SD1, "SIGNAL LEVEL: ", sizeof("SIGNAL LEVEL: ") - 1);

stoa(signal_level, num_buf, &num_len);

sdWrite(&SD1, num_buf, num_len - 1);

sdWrite(&SD1, "\r\n", sizeof("\r\n") - 1);*/

 

} else {

//sdWrite(&SD1, "SIGNAL LEVEL: ERR\r\n", sizeof("SIGNAL LEVEL: ERR\r\n") - 1);

}

 

chThdSleepMilliseconds(1000);

}

 

chHeapFree(gprs_data);

}

 

uint8_t init_modem () {

uint16_t i;

uint16_t bytes_read;

 

for (i = 0; i < ATZ_RETRY; i++) {

sdWrite(&GPRS_SERIAL, "ATE0\r\n", sizeof ("ATE0\r\n"));

chThdSleepMilliseconds(200);

 

if (gprs_cmd("ATZ\r\n", sizeof ("ATZ\r\n") - 1, "\r\nOK\r\n", sizeof ("\r\nOK\r\n") - 1) == E_OK)

break;

 

chThdSleepMilliseconds(500);

}

 

if (i >= ATZ_RETRY)

return E_NOT_RESPONDING;

 

 

return E_OK;

}

 

uint8_t gprs_cmd (char * cmd_str, uint16_t cmd_len, char * answer_str, uint16_t answer_len) {

uint16_t bytes_read;

 

// Flush buffer

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

sdWrite(&GPRS_SERIAL, cmd_str, cmd_len);

chThdSleepMilliseconds(CMD_WAIT_TIME);

 

if (answer_str == NULL) {

return E_OK;

}

 

bytes_read = sdAsynchronousRead(&GPRS_SERIAL, gprs_data, answer_len);

 

if (bytes_read == answer_len) {

if (strncmp(gprs_data, answer_str, bytes_read) == 0) {

return E_OK;

}

}

 

return E_INVALID_ANSWER;

}

 

uint8_t gprs_cmd_read (char * cmd_str, uint16_t cmd_len, uint16_t *answer_len) {

uint16_t bytes_read;

 

sdWrite(&GPRS_SERIAL, "ATE0\r\n", sizeof ("ATE0\r\n"));

chThdSleepMilliseconds(200);

 

// Flush buffer

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

sdWrite(&GPRS_SERIAL, cmd_str, cmd_len);

chThdSleepMilliseconds(1000);

bytes_read = sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

*answer_len = bytes_read;

 

if (bytes_read == 0)

return E_NOT_RESPONDING;

 

return E_OK;

}

 

uint8_t gprs_get_signal_level (uint16_t *signalLevel) {

uint16_t bytes_read;

char signalLevelStr[3] = {0, 0, 0};

 

if (gprs_cmd_read("AT+CSQ\r\n", sizeof ("AT+CSQ\r\n") - 1, &bytes_read)!= E_OK) {

return E_NOT_RESPONDING;

}

 

if (bytes_read < 13)

return E_INVALID_ANSWER;

 

if (strncmp(gprs_data, "\r\n+CSQ:", sizeof ("\r\n+CSQ:") - 1)!= 0) {

return E_INVALID_ANSWER;

}

 

signalLevelStr[0] = gprs_data[8];

 

if (gprs_data[9]!= ',')

signalLevelStr[1] = gprs_data[9];

 

*signalLevel = atos(signalLevelStr);

 

return E_OK;

}

 

void init_gprs () {

// GPRS Thread

chThdCreateStatic(waGPRSThread, sizeof (waGPRSThread), NORMALPRIO, GPRSThread, NULL);

}

 

uint8_t is_gprs_network_ok () {

sdWrite(&GPRS_SERIAL, "ATE0\r\n", sizeof ("ATE0\r\n"));

chThdSleepMilliseconds(200);

 

if (gprs_cmd("AT+CREG?\r\n", sizeof ("AT+CREG?\r\n") - 1, "\r\n+CREG 0,1\r\n", sizeof ("\r\n+CREG 0,1\r\n") - 1) == E_OK)

return TRUE;

 

return FALSE;

}

 

uint8_t send_tcp_message () {

uint16_t bytes_read;

uint8_t i;

 

if (is_gprs_network_ok()!= TRUE) {

 

// return E_NO_NETWORK;

}

 

chThdSleepMilliseconds(100);

 

// Enable embedded TCP/IP stack

gprs_cmd("AT+WIPCFG=1\r\n", sizeof ("AT+WIPCFG=1\r\n") - 1, NULL, 0);

 

chThdSleepMilliseconds(250);

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

// Open GPRS bearer

gprs_cmd("AT+WIPBR=1,6\r\n", sizeof ("AT+WIPBR=1,6\r\n") - 1, NULL, 0);

 

chThdSleepMilliseconds(250);

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

// Set GPRS AP

gprs_cmd("AT+WIPBR=2,6,11,\"internet\"\r\n", sizeof ("AT+WIPBR=2,6,11,\"internet\"\r\n") - 1, NULL, 0);

 

chThdSleepMilliseconds(250);

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

// Connect to GPRS

gprs_cmd("AT+WIPBR=4,6,0\r\n", sizeof ("AT+WIPBR=4,6,0\r\n") - 1, NULL, 0);

 

chThdSleepSeconds(3);

 

bytes_read = sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

 

if (bytes_read > 0) {

if (strncmp(gprs_data, "\r\nOK", sizeof ("\r\nOK") - 1)!= 0) {

 

 

//return E_GPRS_CONNECT_ERROR;

}

} else {

//return E_GPRS_CONNECT_ERROR;

}

 

// Establish connection

gprs_cmd("AT+WIPCREATE=2,1,\"195.209.231.43\",5555\r\n", sizeof ("AT+WIPCREATE=2,1,\"195.209.231.43\",5555\r\n") - 1, NULL, 0);

 

chThdSleepSeconds(1);

 

gprs_cmd("AT+WIPDATA=2,1,1\r\n", sizeof ("AT+WIPDATA=2,1,1\r\n") - 1, NULL, 0);

 

chThdSleepSeconds(3);

 

gprs_cmd("Hello from wismo!\r\n", sizeof ("Hello from wismo!\r\n") - 1, NULL, 0);

 

chThdSleepMilliseconds(250);

gprs_cmd("+++", sizeof ("+++") - 1, NULL, 0);

chThdSleepMilliseconds(250);

 

}

 







Дата добавления: 2015-08-27; просмотров: 601. Нарушение авторских прав; Мы поможем в написании вашей работы!




Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...


ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...


Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...


Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

Кран машиниста усл. № 394 – назначение и устройство Кран машиниста условный номер 394 предназначен для управления тормозами поезда...

Приложение Г: Особенности заполнение справки формы ву-45   После выполнения полного опробования тормозов, а так же после сокращенного, если предварительно на станции было произведено полное опробование тормозов состава от стационарной установки с автоматической регистрацией параметров или без...

Измерение следующих дефектов: ползун, выщербина, неравномерный прокат, равномерный прокат, кольцевая выработка, откол обода колеса, тонкий гребень, протёртость средней части оси Величину проката определяют с помощью вертикального движка 2 сухаря 3 шаблона 1 по кругу катания...

Принципы и методы управления в таможенных органах Под принципами управления понимаются идеи, правила, основные положения и нормы поведения, которыми руководствуются общие, частные и организационно-технологические принципы...

ПРОФЕССИОНАЛЬНОЕ САМОВОСПИТАНИЕ И САМООБРАЗОВАНИЕ ПЕДАГОГА Воспитывать сегодня подрастающее поколение на со­временном уровне требований общества нельзя без по­стоянного обновления и обогащения своего профессио­нального педагогического потенциала...

Эффективность управления. Общие понятия о сущности и критериях эффективности. Эффективность управления – это экономическая категория, отражающая вклад управленческой деятельности в конечный результат работы организации...

Studopedia.info - Студопедия - 2014-2025 год . (0.011 сек.) русская версия | украинская версия