Forum » Programiranje » [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;
}
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:
Ti imaš pointer na pointer
uporabi key namesto &key.
Kako se ti to prevede ne vem, ker pri isti funkciji nimaš podpičja na koncu.
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 :)
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:
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…
- spremenilo: Randomness ()
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????
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…
- spremenil: JanezovJanez ()
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 :)
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…
- spremenil: JanezovJanez ()
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:
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 :)
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:
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;
}
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C] - Atmel AVROddelek: Programiranje | 1510 (536) | blay44 |
» | Preverjanje dogajanja na Bluetooth oddajnikuOddelek: Elektrotehnika in elektronika | 1733 (1449) | Parkelj |
» | Siemens m35 - rs232 - AT commandsOddelek: Mobilne tehnologije | 3167 (2353) | JanezovJanez |
» | C in funkcije ter #defineOddelek: Programiranje | 3964 (2325) | misek |
» | problemi z zvocno v linuxuOddelek: Operacijski sistemi | 1560 (1503) | BigWhale |