Hi!
I’m glad to be the first one that puts a code on this section.
Any improvements to my code will be appreciated.
Title
Simple UART Echo Program
Synopsis
My code is a simple application that set UART1 to Data mode, reads Data and then echoes it to the same port.
If ‘Esc’ key is pressed UART1 is set back to AT mode.
Software version
Developer Studio 1.1.2
Build Version 1.1.2.201005261706-R4588
Hardware version
WMP150
Features/Services covered
FCM
Plug-ins used
/*
| DESCRIPTION:
| UART Example
|
|
| Refer to: AT_Command_Interface_Guide.pdf
| Refer to: ADL_User_Guide_v6_31.pdf
|
| Program state diagram:
| ----------------------
| (Config uart)-->(set data mode)-->(echo uart1 char) --ESC recived-->(switch to AT MODE)
|
*/
/*----------------------------- includes ---------------------------------*/
#include "adl_global.h" /* Application development layer */
/*-------------------------------- defines -------------------------------*/
#define UART_1 ADL_AT_PORT_TYPE(ADL_PORT_UART1,ADL_AT_RSP) /* refer to ADL User Guide pag 67, rspflag */
/* --- UART Config enums --- */
/* Data format */
enum UART_FORMAT{
NO_USE,
DATA8_STOP2,
DATA8_STOP1_PARITY1,
DATA8_STOP1,
DATA7_STOP2,
DATA7_STOP1_PARITY1,
DATA7_STOP1
};
/* parity bit config */
enum UART_PARITY{
ODD,
EVEN,
MARK,
SPACE,
NONE_PARITY
};
/* flow control */
enum UART_FLOW_CONTROL{
CTS_RTS,
NO_CTS_RTS
};
/* UART mode type */
enum UART_TYPE{
DATAMODE,
ATMODE
};
/*----------------------------- data types ---------------------------*/
/*------------------------------ variables ---------------------------*/
/* can anybody help me with stack size???? */
const u16 wm_apmCustomStackSize = 1024*3; /* application stack size (trial&error to determine size)*/
s8 handle_uart1; /* UART1 handler */
u8 mode_uart1; /* UART1 mode type */
/*---------------------------- Function prototypes --------------------------*/
/*---------------------------------------------------------------------------
| Portability: WMP 100/150
|----------------------------------------------------------------------------
| Routine description:
| * Configures UART1 as specified by parameters
| If all ok returns 0 else -1
|---------------------------------------------------------------------------
| Parameters description:
| u8 mode: AT COMMANDS or DATA mode
| int speed: port baud rate
| u8 format: data format
| u8 parity: parity bit
| u8 flow_control: flow control
| *see defines
/---------------------------------------------------------------------------*/
int initUART1(u8 mode, int speed, u8 format, u8 parity, u8 flow_control);
/*---------------------------------------------------------------------------
| Portability: WMP 100/150
|----------------------------------------------------------------------------
| Routine description:
| * Handler of control events in UART, sets UART mode
| If all ok returns TRUE else FALSE
|---------------------------------------------------------------------------
| Parameters description:
| adl_fcmEvent_e evnt: FCM event that raised handler.
/---------------------------------------------------------------------------*/
static bool EvhCrtlUart1(adl_fcmEvent_e evnt);
/*---------------------------------------------------------------------------
| Portability: WMP 100/150
|----------------------------------------------------------------------------
| Routine description:
| * Handler when data recived, echo data until ESC recived, then switch to ATMODE
|---------------------------------------------------------------------------
| Parameters description:
| u16 datalength: number of bytes recived
| u8 *data: pointer to data recived
/---------------------------------------------------------------------------*/
static bool EvhDataUart1(u16 datalength, u8 *data);
/*---------------------------------------------------------------------------
| Portability: WMP 100/150
|----------------------------------------------------------------------------
| Routine description:
| * Handler of port configuration using AT, al responses are ignored
|---------------------------------------------------------------------------
| Parameters description:
| adl_atResponse_t *Rsp: response from AT command
/---------------------------------------------------------------------------*/
static void EvhConfUartx(adl_atResponse_t *Rsp);
/*-------------------------------- Functions --------------------------------*/
int initUART1(u8 mode, int speed, u8 format, u8 parity, u8 flow_control){
char comand[15];
/* Check if port available*/
if(adl_fcmIsAvailable(ADL_FCM_FLOW_V24_UART1))
{
/* Save UART operation mode: DATA o AT*/
mode_uart1=mode;
/* subscribe to FCM uart service */
handle_uart1=adl_fcmSubscribe(ADL_FCM_FLOW_V24_UART1, EvhCrtlUart1,EvhDataUart1);
/* config parity with AT Command*/
wm_sprintf(comand,"AT+ICF=%d,%d", format, parity);
adl_atCmdCreate(comand, UART_1,EvhConfUartx,NULL);
/* speed with AT Command*/
wm_sprintf(comand,"AT+IPR=%d", speed);
adl_atCmdCreate(comand, UART_1,EvhConfUartx,NULL);
/* flow control with AT Command*/
switch(flow_control){
/* hardware flow control */
case CTS_RTS:
adl_atCmdCreate("AT+IFC=2,2",UART_1,EvhConfUartx,NULL);
break;
/* no hardware flow control */
case NO_CTS_RTS:
adl_atCmdCreate("AT+IFC=0,0",UART_1,EvhConfUartx,NULL);
break;
}
/* save configuration */
adl_atCmdCreate("AT&W", UART_1, (adl_atRspHandler_t)EvhConfUartx,NULL);
return 0;
}
return -1;
}/*initUART1*/
static bool EvhCrtlUart1(adl_fcmEvent_e evnt){
switch (evnt)
{
/* when com is open, operation mode is defined */
case ADL_FCM_EVENT_FLOW_OPENNED:
/* DATA MODE */
if(mode_uart1 == DATAMODE){
adl_atSendResponse(ADL_AT_RSP, "\r\nUART1: Data Mode");
adl_fcmSwitchV24State(handle_uart1,ADL_FCM_V24_STATE_DATA);
}
/* AT MODE */
else if(mode_uart1 == ATMODE){
adl_atSendResponse(ADL_AT_RSP, "\r\nUART1: AT Mode");
adl_fcmSwitchV24State(handle_uart1,ADL_FCM_V24_STATE_AT);
}
break;
case ADL_FCM_EVENT_V24_DATA_MODE:
/* DATA MODE OK */
break;
case ADL_FCM_EVENT_V24_AT_MODE:
/* AT MODE OK */
break;
case ADL_FCM_EVENT_RESUME:
break;
case ADL_FCM_EVENT_MEM_RELEASE:
break;
default:
return FALSE;
break;
}
return TRUE;
}/*EvhCrtlUart1*/
static bool EvhDataUart1(u16 datalength, u8 *data){
/* when data recived echo it */
s8 error;
/* check for ESC to switch to AT MODE */
if(data[0] == 27)
{
adl_fcmSwitchV24State(handle_uart1,ADL_FCM_V24_STATE_AT);
}
else
{
error = adl_fcmSendData(handle_uart1,data,datalength);
switch(error){
case ADL_RET_ERR_PARAM:
adl_atSendResponse(ADL_AT_RSP,"FCM send data: parameter incorrect value");
break;
case ADL_RET_ERR_UNKNOWN_HDL:
adl_atSendResponse(ADL_AT_RSP,"FCM send data: unknown handle");
break;
case ADL_RET_ERR_BAD_STATE:
adl_atSendResponse(ADL_AT_RSP,"FCM send data: not ready to send data");
break;
case ADL_FCM_RET_ERR_WAIT_RESUME:
adl_atSendResponse(ADL_AT_RSP,"FCM send data: flow has no more credit");
break;
case ADL_RET_ERR_SERVICE_LOCKED:
adl_atSendResponse(ADL_AT_RSP,"FCM send data: from a low level");
break;
}
}
return TRUE;
}/*EvhDataUart1*/
static void EvhConfUartx(adl_atResponse_t *Rsp){
}/*EvhConfUartx*/
void adl_main ( adl_InitType_e InitType )
{
initUART1(DATAMODE, 115200 , DATA8_STOP1 , NONE_PARITY , NO_CTS_RTS);
}/*adl_main*/
EDIT 15/03/2011: bugs fixed.