реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> OpenAT
kban
сообщение Apr 8 2008, 05:35
Сообщение #16


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



Цитата(de__ @ Apr 4 2008, 17:32) *
Как я понимаю здесь 2 пути: либо имея статичные IP адреса осуществить передачу через GPRS. Либо дозвоном на номер телефона в DATA режиме. Чтобы передавать данные с COM-порта - просто переключить его в DATA режим.

Насчёт режимов передачи данных - это понятно. Непонятно только то, как происходит обмен? Всмысле - как от одного модема другому передать информацию - ясно, а как в 1 модеме настроить передачу СОМ->Модем->GPRS или voice call вот это не понятно... Для работы с СОМ портом внутри модема нужно ли использовать FCM, как записать принятое в буфер и т.д.?
Go to the top of the page
 
+Quote Post
de__
сообщение Apr 8 2008, 09:04
Сообщение #17


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 19-03-08
Пользователь №: 36 045



Хм. На вопрос "а мне все здесь непонятно, расскажите мне всё, как это работает" не хочется и отвечать. Так и хочется сказать RTFM!

"Для работы с СОМ портом внутри модема нужно ли использовать FCM, как записать принятое в буфер и т.д.?"
Смысл в том что нужно объявить подписку на нужный порт. (FCM) И при подписке в одном из параметров - указатель на вашу функцию обработчик. По событиям - обрабатываем...
Грабли - передающий буфер ограничен. (смотреть документацию для каждого случая) Если нужно послать больше - рвать на куски
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 11 2008, 07:38
Сообщение #18


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



Прошу прощения, мож я чё не так написал...
Вопрос сформулмрую точнее... Если передавать данные по GSM, то делаем функцию Call_Handler(u16 Event, u32 Call_ID) где по событию Event делаем обработку... например ADL_CALL_EVENT_RING_DATA где отвечаем на звонок adl_callAnswer(), а затем по событию ADL_CALL_EVENT_ANSWER_OK подписываем
V24Handle = adl_fcmSubscribe ( USED_FLOW, V24CtrlHandler, V24DataHandler );
Интересует аналог для COM порта. Вместо adl_fcmSubscribe уже использовать adl_portSubscribe?

вопрос снимается... и правда протупил.. ещё оаз прошу прощения=)
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 15 2008, 04:48
Сообщение #19


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



В интернете нашёл хорошую ссылочку - http://www.compeljournal.ru/enews/2007/19/9
Полезная, на мой взгляд)
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 25 2008, 04:27
Сообщение #20


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



И снова здравствуйте. Сделал приложение, которое по подаче команды at+start начинает считывать данные, введённые с клавиатуры в буфер, пока не будет послан символ "a". Но есть один касяк - программа работает только 1 раз - после повторного введения команды at+start в функцию - обработчик этой команды программа приходит, но ничего не делает. В функции, обрабатывающей это событие стоит
V24Handle=adl_fcmSubscribe (ADL_PORT_UART1, (adl_fcmCtrlHdlr_f)V24CtrlHandler, (adl_fcmDataHdlr_f)V24DataHandler);
где в V24CtrlHandler я меняю командный режим на режим передачи данных, а затем в V24DataHandler после обработки данных меняю его обратно на командный режим... По-моему касяк в том, что в V24CtrlHandler программа попадает только 1 раз.... Может я не понял суть этой функции? Программа должна заходить в неё по событиям?
Код функции
bool V24CtrlHandler ( u8 Event )
{
bool bReturn = TRUE;
s32 sReturn;
TRACE (( 1, "V24 event %d", Event ));
adl_atSendResponse (ADL_AT_RSP, "\r\n Prishli v V24Ctrl handler!\r\n");

// Switch on event
switch ( Event )
{
case ADL_FCM_EVENT_FLOW_OPENNED :
sReturn = adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_DATA );
TRACE (( 1, "Switch to data : %d", sReturn ));
bFCMIsReady = TRUE;
break;

case ADL_FCM_EVENT_RESUME :
bFCMIsReady = TRUE ;
TRACE (( 1, "Resume Data Flow"));
break;

case ADL_FCM_EVENT_MEM_RELEASE :
bFCMIsReady = TRUE ;
TRACE (( 1, "Data are sent"));
break;
}

return bReturn;
}


И ещё - может дело в adl_fcmSubscribe (ADL_PORT_UART1, (adl_fcmCtrlHdlr_f)V24CtrlHandler, (adl_fcmDataHdlr_f)V24DataHandler) и adl_fcmUnsubscribe(V24Handle); ? Куда правильно нужно ставить adl_fcmUnsubscribe(V24Handle);? Если сразу же после adl_fcmSubscribe - то просто зависает в режиме передачи данных...
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 25 2008, 06:04
Сообщение #21


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



И ещё - в V24CtrlHandler на событие ADL_FCM_EVENT_FLOW_CLOSED ( как я понял из мануалов оно происходит во время adl_fcmUnsubscribe) вообще не реагирует...
Go to the top of the page
 
+Quote Post
sobr
сообщение Apr 25 2008, 06:41
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 926
Регистрация: 18-01-07
Пользователь №: 24 552



По этому кусочку кода понять что то сложно, покажи весь сишный файл, если не комерческая тайна.
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 25 2008, 07:20
Сообщение #23


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



#include "adl_global.h"

/***************************************************************************/
/* Mandatory variables */
/*-------------------------------------------------------------------------*/
/* wm_apmCustomStack */
/* wm_apmCustomStackSize */
/*-------------------------------------------------------------------------*/
/***************************************************************************/
const u16 wm_apmCustomStackSize = 1024;


/***************************************************************************/
/* Local variables */
/***************************************************************************/

/* String To Send List */
wm_lst_t StringList;

/* Flag for FCM State */
bool bFCMIsReady = TRUE;
bool flag = FALSE;

/* AT command buffer */
ascii ATCommand[ 512 ];
/* Used flow */
#define USED_FLOW ADL_PORT_UART1

static s8 V24Handle,UARTHandle;



/***************************************************************************/
/* Function : V24CtrlHandler */
/*-------------------------------------------------------------------------*/
/* Objet : FCM Control Events Handler */
/* */
/* Return : return value is not relevant */
/* */
/*-------------------------------------------------------------------------*/
/* Variable Name |IN |OUT|GLB| Utilisation */
/*--------------------+---+---+---+----------------------------------------*/
/* Event | | | | Event from GPRS Service */
/*--------------------+---+---+---+----------------------------------------*/
/***************************************************************************/
bool V24CtrlHandler ( u8 Event )
{
bool bReturn = TRUE;
s32 sReturn;
flag = FALSE;
TRACE (( 1, "V24 event %d", Event ));
adl_atSendResponse (ADL_AT_RSP, "\r\n Prishli v V24Ctrl handler\r\n");
// sReturn = adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_DATA );
// Switch on event
switch ( Event )
{
case ADL_FCM_EVENT_FLOW_OPENNED :
adl_atSendResponse (ADL_AT_RSP, "\r\n Open \r\n");
sReturn = adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_DATA );
adl_atSendResponse (ADL_AT_RSP, "\r\n Switch to data\r\n");
TRACE (( 1, "Switch to data : %d", sReturn ));
bFCMIsReady = TRUE;
break;

case ADL_FCM_EVENT_RESUME :
adl_atSendResponse (ADL_AT_RSP, "\r\n Resume \r\n");
sReturn = adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_DATA );
adl_atSendResponse (ADL_AT_RSP, "\r\n Switch to data\r\n");
bFCMIsReady = TRUE ;
TRACE (( 1, "Resume Data Flow"));

break;

case ADL_FCM_EVENT_MEM_RELEASE :
bFCMIsReady = TRUE ;
TRACE (( 1, "Data are sent"));
break;
case ADL_FCM_EVENT_FLOW_CLOSED :

adl_atSendResponse (ADL_AT_RSP, "\r\n Flow closed\r\n");
sReturn = adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_AT );\
bFCMIsReady = TRUE ;
TRACE (( 1, "Data are sent"));
break;
}

return bReturn;
}



void MyTimeout (u8 id)

{

adl_atSendResponse (ADL_AT_RSP, "\r\n Timer works!\r\n");
}

bool V24DataHandler ( u16 Length, u8 * Data )
{
adl_atSendResponse (ADL_AT_RSP, "\r\n Prishli v V24DATA handler!\r\n");
/* Scan received string */
u16 i,j,ATLastLength = wm_strlen ( ATCommand );

ascii * RecString = adl_memGet ( ( u16 ) ( Length ) );

TRACE (( 1, "V24DataHandler begin"));
wm_memcpy ( ( ascii * ) RecString, ( ascii * ) Data, Length );
adl_atSendResponse (ADL_AT_RSP, "\r\n Receive complete!\r\n");

for ( i = 0 ; i < Length ; i++ )
{
/* If string is empty, search for 'a' */
if ( ( wm_strlen ( ATCommand ) == 0 )
&& ( ( RecString [ i ] == 'a' )
|| ( RecString [ i ] == 'A' ) ) )
{
adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_AT );
flag = TRUE;
// adl_fcmUnsubscribe(V24Handle);
// return TRUE;
// continue;
}


}
adl_fcmSendData (V24Handle, RecString, wm_strlen (RecString));
ATLastLength = 0;

adl_memRelease ( RecString );
// release credit
return TRUE;

}



void AtStartHandler (adl_atCmdPreParser_t *p)

{
adl_atSendResponse (ADL_AT_RSP, "\r\nHello, world!\r\n");
V24Handle=adl_fcmSubscribe (ADL_PORT_UART1, (adl_fcmCtrlHdlr_f)V24CtrlHandler, (adl_fcmDataHdlr_f)V24DataHandler);
if(flag==TRUE)
{
adl_atSendResponse (ADL_AT_RSP, "\r\n flag==TRUE\r\n");
adl_fcmUnsubscribe(V24Handle);
}
};

void AtSwitchHandler (adl_atCmdPreParser_t *p)

{
adl_atSendResponse (ADL_AT_RSP, "\r\nSwitch\r\n");
adl_fcmSwitchV24State ( V24Handle, ADL_FCM_V24_STATE_DATA );

};

void adl_main ( adl_InitType_e InitType )
{
adl_atSendResponse (ADL_AT_RSP, "\r\n Hi user, let's start our transfere!\r\n");
ascii * RecString1 = adl_memGet ( ( u16 ) ( 256) );
/* Initialize String To Send list */
StringList = wm_lstCreate ( WM_LIST_NONE, NULL );



/* Init AT command string */
ATCommand[ 0 ] = 0;
/* Subscribe to call events */

adl_atCmdSubscribe ("at+start", (adl_atCmdHandler_t)AtStartHandler, ADL_CMD_TYPE_ACT);
adl_atCmdSubscribe ("at+switch", (adl_atCmdHandler_t)AtSwitchHandler, ADL_CMD_TYPE_ACT);


}
Вот весь файл...
Go to the top of the page
 
+Quote Post
sobr
сообщение Apr 25 2008, 09:18
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 926
Регистрация: 18-01-07
Пользователь №: 24 552



Попробуйте так...
Код
void AtStartHandler (adl_atCmdPreParser_t *p)

{
       adl_atSendResponse (ADL_AT_RSP, "\r\nHello, world!\r\n");
      
       if(flag==TRUE)
       {
             adl_atSendResponse (ADL_AT_RSP, "\r\n flag==TRUE\r\n");
             adl_fcmUnsubscribe(V24Handle);
             flag=FALSE;
       }
       else
       {
            V24Handle=adl_fcmSubscribe (ADL_PORT_UART1, (adl_fcmCtrlHdlr_f)V24CtrlHandler,    
       (adl_fcmDataHdlr_f)V24DataHandler);
       }
};
Go to the top of the page
 
+Quote Post
de__
сообщение Apr 25 2008, 10:07
Сообщение #25


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 19-03-08
Пользователь №: 36 045



Не понятно зачем вы переходите в ДАТА режим для отправки данных?

разве не достаточно просто послать
adl_atSendResponse(ADL_PORT_UART1,bufUart1);
или для текущего порта
adl_atSendResponse(ADL_AT_RSP,bufUart1);
или для вашего случая adl_atSendResponsePort(ADL_AT_RSP, p->Port, x)

Я как то написал универсальную функцию и забыл... Возможно кривовато
#define MAX_LEN_BUF_UART1 512 //максимальная длина посылки за один раз
unsigned char bufUart1[MAX_LEN_BUF_UART1+1]; //Буфер глобальный. Возможно так быстрее
unsigned int SendUart1(unsigned char *str)
{
unsigned char *pBuf;
unsigned int len, bufLen;

bufLen = len = (unsigned int)strlen(str);

if(!len) //Нулевую длину не обрабатываем
return 0;

if(len<=MAX_LEN_BUF_UART1)
{//Для буфера меньше допустимо возможного просто отправляем данные и выходим
adl_atSendResponse(ADL_PORT_UART1,str);
}
else
{ //Массив большой - пошлём кусками
pBuf = str;
do{
memset(bufUart1, 0, MAX_LEN_BUF_UART1+1);
strncpy(bufUart1, pBuf, MAX_LEN_BUF_UART1); //копируем кусок для отправки

adl_atSendResponse(ADL_PORT_UART1,bufUart1);

len = (unsigned int)strlen(pBuf);

if(len<=MAX_LEN_BUF_UART1)
break;
else
pBuf+=MAX_LEN_BUF_UART1;
}while(1);
}
return bufLen; //Возвращаем количество посланных байт
}
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 28 2008, 05:36
Сообщение #26


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



Спасибо большое за ответы! Буду работать дальше!

Ещё вопрос - как вывести буфер на экран?
Какие параметры должны быть у wm_sprintf(ascii buf, ascii fmt, ...)?
Какой буфер тут имеется ввиду - тот который выводим? И fmt - Это формат? Если так - то при попытке вывода буфера, модем почемуто перезагружается....
Go to the top of the page
 
+Quote Post
sobr
сообщение Apr 28 2008, 06:41
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 926
Регистрация: 18-01-07
Пользователь №: 24 552



Цитата(kban @ Apr 28 2008, 12:36) *
Ещё вопрос - как вывести буфер на экран?

adl_atSendResponse(ADL_AT_RSP, buf);
Go to the top of the page
 
+Quote Post
kban
сообщение Apr 30 2008, 06:04
Сообщение #28


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



И снова здравствуйте, уважаемые форумчане. Вопрос следующий - почемуто при работе с TCP сервер срабатывает на WIP_CEV_READ только 1 раз. В процессе обработки этого события вконце он отрубает клиента... Но когда этот же клиент конектится к этому серверу - он выдаёт, что коннект произошёл, а в WIP_CEV_READ не попадает, хотя клиент сообщает, что всё отослал успешно. В чём может быть касяк?
код:
case WIP_CEV_READ: {
int nread;
int i;
wip_debug ("[SAMPLE] Some data arrived\n");
adl_atSendResponse (ADL_AT_RSP, "\r\n Some data arrived\r\n");
nread = wip_read( ev->channel, rcv_buffer + rcv_offset,
sizeof( rcv_buffer) - rcv_offset);
if( nread < 0) { wip_debug( "[SAMPLE] read error %i\n", nread);
adl_atSendResponse (ADL_AT_RSP, "\r\n read error\r\n");
return; }
rcv_offset += nread;
if( rcv_offset == sizeof( rcv_buffer)) {
wip_debug( "[SAMPLE] Reception capacity exceeded, won't read more\n");
adl_atSendResponse (ADL_AT_RSP, "\r\n Reception capacity exceeded, won't read more\r\n");
} else {
wip_debug( "[SAMPLE] Wrote %i bytes of data from network to rcv_buffer. "
"%i bytes remain available in rcv_buffer\n",
nread, sizeof( rcv_buffer) - rcv_offset);

adl_atSendResponse(ADL_AT_RSP, "\n\r");

adl_atSendResponse(ADL_AT_RSP, rcv_buffer);

}
adl_atSendResponse(ADL_AT_RSP, "\n\r Povtor bufera \n\r");

adl_atSendResponse(ADL_AT_RSP, rcv_buffer);
adl_atSendResponse(ADL_AT_RSP, "\n\r");
for (i=0;i<sizeof( rcv_buffer);i++)
{
rcv_buffer[i]=0;
}
wip_close( ev->channel);
clients_count--;
break;
}
Go to the top of the page
 
+Quote Post
kban
сообщение May 8 2008, 04:41
Сообщение #29


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837



И снова здраствуйте. Подскажите пожалуйста команду, которая перезагружает модем (всмысле реализацию её на OAT).
Go to the top of the page
 
+Quote Post
sobr
сообщение May 8 2008, 05:17
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 926
Регистрация: 18-01-07
Пользователь №: 24 552



Цитата(kban @ May 8 2008, 11:41) *
И снова здраствуйте. Подскажите пожалуйста команду, которая перезагружает модем (всмысле реализацию её на OAT).

Код
adl_atCmdSend ( "at+cfun=1",NULL,NULL,NULL);
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016