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

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

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





#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. Нарушение авторских прав; Мы поможем в написании вашей работы!




Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...


Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...


Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

ТЕХНИКА ПОСЕВА, МЕТОДЫ ВЫДЕЛЕНИЯ ЧИСТЫХ КУЛЬТУР И КУЛЬТУРАЛЬНЫЕ СВОЙСТВА МИКРООРГАНИЗМОВ. ОПРЕДЕЛЕНИЕ КОЛИЧЕСТВА БАКТЕРИЙ Цель занятия. Освоить технику посева микроорганизмов на плотные и жидкие питательные среды и методы выделения чис­тых бактериальных культур. Ознакомить студентов с основными культуральными характеристиками микроорганизмов и методами определения...

САНИТАРНО-МИКРОБИОЛОГИЧЕСКОЕ ИССЛЕДОВАНИЕ ВОДЫ, ВОЗДУХА И ПОЧВЫ Цель занятия.Ознакомить студентов с основными методами и показателями...

Меры безопасности при обращении с оружием и боеприпасами 64. Получение (сдача) оружия и боеприпасов для проведения стрельб осуществляется в установленном порядке[1]. 65. Безопасность при проведении стрельб обеспечивается...

Типовые ситуационные задачи. Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической   Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической нагрузке. Из медицинской книжки установлено, что он страдает врожденным пороком сердца....

Типовые ситуационные задачи. Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт. ст. Влияние психоэмоциональных факторов отсутствует. Колебаний АД практически нет. Головной боли нет. Нормализовать...

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

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