|
|
  |
OpenAT |
|
|
|
Apr 8 2008, 05:35
|
Частый гость
 
Группа: Новичок
Сообщений: 97
Регистрация: 29-10-07
Пользователь №: 31 837

|
Цитата(de__ @ Apr 4 2008, 17:32)  Как я понимаю здесь 2 пути: либо имея статичные IP адреса осуществить передачу через GPRS. Либо дозвоном на номер телефона в DATA режиме. Чтобы передавать данные с COM-порта - просто переключить его в DATA режим. Насчёт режимов передачи данных - это понятно. Непонятно только то, как происходит обмен? Всмысле - как от одного модема другому передать информацию - ясно, а как в 1 модеме настроить передачу СОМ->Модем->GPRS или voice call вот это не понятно... Для работы с СОМ портом внутри модема нужно ли использовать FCM, как записать принятое в буфер и т.д.?
|
|
|
|
|
Apr 8 2008, 09:04
|
Участник

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

|
Хм. На вопрос "а мне все здесь непонятно, расскажите мне всё, как это работает" не хочется и отвечать. Так и хочется сказать RTFM!
"Для работы с СОМ портом внутри модема нужно ли использовать FCM, как записать принятое в буфер и т.д.?" Смысл в том что нужно объявить подписку на нужный порт. (FCM) И при подписке в одном из параметров - указатель на вашу функцию обработчик. По событиям - обрабатываем... Грабли - передающий буфер ограничен. (смотреть документацию для каждого случая) Если нужно послать больше - рвать на куски
|
|
|
|
|
Apr 25 2008, 04:27
|
Частый гость
 
Группа: Новичок
Сообщений: 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 - то просто зависает в режиме передачи данных...
|
|
|
|
|
Apr 25 2008, 07:20
|
Частый гость
 
Группа: Новичок
Сообщений: 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);
} Вот весь файл...
|
|
|
|
|
Apr 25 2008, 10:07
|
Участник

Группа: Новичок
Сообщений: 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; //Возвращаем количество посланных байт }
|
|
|
|
|
Apr 30 2008, 06:04
|
Частый гость
 
Группа: Новичок
Сообщений: 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; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|