» »

[C] LPC1343 - UART - AT commands

[C] LPC1343 - UART - AT commands

JanezovJanez ::

Izdelujem program v C-ju, kateri naj bi ob zvonjenju telefona (Siemens M35) poslal nazaj ukaze AT.
Uporabljam uart.c example
http://docs.lpcware.com/lpcopen/v1.03/l...


Trenutno mi je uspelo da LPC prejme ukaz RING in pošlje nazaj ukaz AT^SCNI
AT^SCNI je ukaz za preverjanje klicateljeve številke in telefon vrne dolgo informacijo a le delček te je kot številka.
---------------------------------------------------------------------------------------------------------------------
const char inst1[] = "AT^SCNI";

if(key[0] == 'R' && key[1] == 'I' && key[2] == 'N' && key[3] == 'G')
{
Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
}
---------------------------------------------------------------------------------------------------------------------
Ta del se lepo izvede in je tudi viden preko HyperTerminala....

Težava nastane ko želim pod IF nadaljevati s telefonsko številko...
V tem primeru mi v IF stavku podpira 8 mestno številko npr:12345678
A če je dolžina številke 9 mest se if ne izvede...
---------------------------------------------------------------------------------------------------------------------
const char inst2[] = "OPEN_DOOR";

if(key[0] == '1' && key[1] == '2' && key[2] == '3' && key[3] == '4' && key[4] == '5' && key[5] == '6' && key[6] == '7' && key[7] == '8')
{
Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
}
---------------------------------------------------------------------------------------------------------------------

Kakšna ideja kako bi spremenil program????




CELOTEN PROGRAM:
---------------------------------------------------------------------------------------------------------------------

#include "chip.h"
#include "board.h"
#include "string.h"

STATIC RINGBUFF_T txring, rxring;

#define UART_RB_SIZE 64

static uint8_t rxbuff[UART_RB_SIZE], txbuff[UART_RB_SIZE];

const char inst1[] = "AT^SCNI";
const char inst2[] = "OPEN_DOOR";

void UART_IRQHandler(void)
{
Chip_UART_IRQRBHandler(LPC_USART, &rxring, &txring);
}

int main(void)
{
uint8_t key[64];

Board_Init();
Board_UART_Init();

Chip_UART_Init(LPC_USART);
Chip_UART_SetBaud(LPC_USART, 115200);
Chip_UART_ConfigData(LPC_USART, (UART_LCR_WLEN8 | UART_LCR_SBS_1BIT));
Chip_UART_SetupFIFOS(LPC_USART, (UART_FCR_FIFO_EN | UART_FCR_TRG_LEV2));
Chip_UART_TXEnable(LPC_USART);

RingBuffer_Init(&rxring, rxbuff, 1, UART_RB_SIZE);
RingBuffer_Init(&txring, txbuff, 1, UART_RB_SIZE);

Chip_UART_IntEnable(LPC_USART, (UART_IER_RBRINT | UART_IER_RLSINT));

NVIC_SetPriority(UART0_IRQn, 1);
NVIC_EnableIRQ(UART0_IRQn);


while (1)
{
Chip_UART_ReadRB(LPC_USART, &rxring, &key, 32)

if(key[0] == 'R' && key[1] == 'I' && key[2] == 'N' && key[3] == 'G')
{
Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
}

if(key[0] == '1' && key[1] == '2' && key[2] == '3' && key[3] == '4' && key[4] == '5' && key[5] == '6' && key[6] == '7' && key[7] == '8')
{
Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
}


NVIC_DisableIRQ(UART0_IRQn);
Chip_UART_DeInit(LPC_USART);

return 1;
}

johnnyyy ::

Oj,
napaka je v klicanju funkcije Chip_UART_ReadRB:
Prototip funkcije:
int Chip_UART_ReadRB (LPC_USART_T *pUART, RINGBUFF_T *pRB, void *data, int bytes)


Ti imaš pointer na pointer
uint8_t key[64];
Chip_UART_ReadRB(LPC_USART, &rxring, &key, 32)


uporabi key namesto &key.

Kako se ti to prevede ne vem, ker pri isti funkciji nimaš podpičja na koncu.

JanezovJanez ::

Ups, to sm se zatipkal pri pisanjeu v forum.....
To mi deluje...
Ampak podalševanje iz 8 številk na 9 številk.... To mi ni jasno :)

Randomness ::

@johnnyyy: key in &key sicer res nista istega tipa, vendar imata isto vrednost ((void*)key == (void*)&key == (void*)&key[0]), zato stvar deluje v obeh primerih.

Za začetek poskusi takole:

while (1) {
    int bytes = Chip_UART_ReadRB(LPC_USART, &rxring, key, sizeof(key));
    if (bytes == 4 && strncmp(key, "RING", 4) == 0)
        Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
    else if (bytes == 9 && strncmp(key, "123456789", 9) == 0)
        Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
}

Zgodovina sprememb…

JanezovJanez ::

while (1) {
int bytes = Chip_UART_ReadRB(LPC_USART, &rxring, key, sizeof(key));
if (bytes == 4 && strncmp(key, "RING", 4) == 0)
Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
else if (bytes == 9 && strncmp(key, "123456789", 9) == 0) NE DELUJE
Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
}

_____________________________________________________________________________

while (1) {
int bytes = Chip_UART_ReadRB(LPC_USART, &rxring, key, sizeof(key));
if (bytes == 4 && strncmp(key, "RING", 4) == 0)
Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
else if (bytes == 8 && strncmp(key, "12345678", 8) == 0)
Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
}

Zgornja ki ima 9 številk ne deluje....

Spremenim na spodnjo s parametri 8 in 8številk... Ta pa dela.... Ampak šezmer mi ni jasno kako da 9 cifer ne potegne????

Zgodovina sprememb…

JanezovJanez ::

A mi memset pride kj v postev tukaj????

Poanta programa je sledeča... Če kaj pomaga razlaga....
Pokličete telefon.... Ta da vn informacijo RING večkrat zaporedoma dokler zvoni....
Nazaj mu pošljemo AT command AT^SCNI in dobimo daljši ''string'' dolžine cca45 znakov v katerem se nahaja številka klicaletja....
Če v IF stavek dam eno od ševilk
IF(123456789) bi se izvedla operacija da kratko sklenem 2 pina, to pa v praksi pomeni da se odprejo garažna vrata :)

Slisi se simpl, ampak mi dela kar preglavice :)

Tu pa nastane ta težava, ker mi sprejme le 8 številk, namesto da bi zagrabil 9 stevilk... Želja je po polni 9 mestni številki... sem že dobil predloge naj se osredotočim na zadnjih 6 ampak bi rad razvozljal razlog ZAKAJ 8 JA 9 NE :)

Zgodovina sprememb…

Randomness ::

Težko je karkoli reči na pamet, razhroščevanje na daljavo je vedno problematično ;-) Prav tako nimam konkretnih izkušenj s uC-jem, ki ga uporabljaš. Če bi ugibal, bi rekel, da se zgodi to, da zaradi kakršnegakoli razloga že ne prebereš celotne 9-mestne številke naenkrat, ampak se ti razdeli na dva ali več delov. Ta "problem" je sicer nekaj povsem običajnega in se ga je potrebno vedno zavedati, a za začetnika ni povsem enostavno (robustno) rešljiv.

Poskusi tole in povej, če pomaga:

while (1) {
    int bytes = Chip_UART_ReadRB(LPC_USART, &rxring, key, sizeof(key));
    if (bytes == 4 && strncmp(key, "RING", 4) == 0)
        Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
    else if (bytes == 8 && strncmp(key, "12345678", 8) == 0) {
        while (Chip_UART_ReadRB(LPC_USART, &rxring, key, 1) != 1) ;
        if (key[0] == '9')
            Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
    }
}

JanezovJanez ::

Ne funkciaonira..... Se ''RING'' ne deluje....

Bi morda znal napisati tole?

Dobis RING
Posljes AT^SCNI
Dobis scn:1 Scn:2 Sccn 090558866 Scn:3 Sc:4
Preveris med stevilkami ki jih imas vpisane:
123456789
456123789
456789123
789123456
789456123
090558866
Ce se katera ujema kratkosklenes 2 pina :)

Randomness ::

Kaj pomeni "Dobis scn:1 Scn:2 Sccn 090558866 Scn:3 Sc:4"?

Poskusi tole:

static const char* telefonske[] = {
    "123456789",
    "456123789",
    "456789123",
    "789123456",
    "789456123",
    "090558866",
};

static void ReadBytes(LPC_USART_T *pUART, RINGBUFF_T *pRB, uint8_t *data, int bytes)
{
    while (bytes > 0) {
        int n = Chip_UART_ReadRB(pUART, pRB, data, bytes);
        bytes -= n;
        data += n;
    }
}

static int FindTelNumber(uint8_t* key)
{
    for (size_t i = 0; i < sizeof(telefonske)/sizeof(*telefonske); i++) {
           if (strncmp(telefonske[i], key, 9) == 0)
               return 1;
    }
    
    return 0;
}

int main(void)
{
    while (1) {
        ReadBytes(LPC_USART, &rxring, key, 4);
        if (strncmp(key, "RING", 4) == 0) {
            Chip_UART_SendRB(LPC_USART, &txring, inst1, sizeof(inst1) - 1);
        else {
            ReadBytes(LPC_USART, &rxring, key + 4, 5);
            if (FindTelNumber(key)) {
                   Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
            }
        }
    }
    
    return 0;
}

JanezovJanez ::

Ko das komando AT^SCNI (to je ukaz preveri številko)
Ti telefon Siemens M35 preko Tx in Rx pošle informacijo neki scn:1 scn:2 lalalalalalalala.... Uglavnem dolga informacija ki ima tudi 9mestno št klicatelja, poleg celotne šare zravn :)

Sem napisal programček takole:
Upam da je prav.... Compaila in naloži....
RING vrne AT^SCNI
Ko pa mu vtipkam naprej 123456789... Ne vrne ničesar...
Niti če večkrat ponovim RING, ne vrne veckrat AT^SCNI




Program:
____________________________________________________________________

#include "chip.h"
#include "board.h"
#include "string.h"

STATIC RINGBUFF_T txring, rxring;

#define UART_RB_SIZE 64

static uint8_t rxbuff[UART_RB_SIZE], txbuff[UART_RB_SIZE];

static const char* telefonske[] =
{
"123456789",
"456123789",
"456789123",
"789123456",
"789456123",
"090558866",
};

const char inst1[] = "HELLO";
const char inst2[] = "AT^SCNI";
const char inst3[] = "OPEN_DOOR";

void UART_IRQHandler(void)
{
Chip_UART_IRQRBHandler(LPC_USART, &rxring, &txring);
}

static void ReadBytes(LPC_USART_T *pUART, RINGBUFF_T *pRB, uint8_t *data, int bytes)
{
while (bytes > 0)
{
int n = Chip_UART_ReadRB(pUART, pRB, data, bytes);
bytes -= n;
data += n;
}
}

static int FindTelNumber(uint8_t* key)
{
for (size_t i = 0; i < sizeof(telefonske)/sizeof(*telefonske); i++)
{
if (strncmp(telefonske[i], key, 9) == 0)
return 1;
}

return 0;
}



int main(void)
{


Board_Init();
Board_UART_Init();

Chip_UART_Init(LPC_USART);
Chip_UART_SetBaud(LPC_USART, 115200);
Chip_UART_ConfigData(LPC_USART, (UART_LCR_WLEN8 | UART_LCR_SBS_1BIT));
Chip_UART_SetupFIFOS(LPC_USART, (UART_FCR_FIFO_EN | UART_FCR_TRG_LEV2));
Chip_UART_TXEnable(LPC_USART);

RingBuffer_Init(&rxring, rxbuff, 1, UART_RB_SIZE);
RingBuffer_Init(&txring, txbuff, 1, UART_RB_SIZE);

Chip_UART_IntEnable(LPC_USART, (UART_IER_RBRINT | UART_IER_RLSINT));

NVIC_SetPriority(UART0_IRQn, 1);
NVIC_EnableIRQ(UART0_IRQn);

Chip_UART_SendBlocking(LPC_USART, inst1, sizeof(inst1) - 1);

uint8_t key[32];


while (1)
{
ReadBytes(LPC_USART, &rxring, key, 4);

if (strncmp(key, "RING", 4) == 0)
{
Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2) - 1);
}

else
{
ReadBytes(LPC_USART, &rxring, key + 4, 5);
}

if (FindTelNumber(key))
{
Chip_UART_SendRB(LPC_USART, &txring, inst3, sizeof(inst3) - 1);
}
}
return 0;
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] - Atmel AVR

Oddelek: Programiranje
71401 (427) blay44
»

Preverjanje dogajanja na Bluetooth oddajniku

Oddelek: Elektrotehnika in elektronika
121495 (1211) Parkelj
»

Siemens m35 - rs232 - AT commands

Oddelek: Mobilne tehnologije
232934 (2120) JanezovJanez
»

C in funkcije ter #define

Oddelek: Programiranje
463756 (2117) misek
»

problemi z zvocno v linuxu

Oddelek: Operacijski sistemi
81451 (1394) BigWhale

Več podobnih tem