Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

USART - atmega porovnání textového řetězce
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: st květen 08 2024, 18:18    Předmět: USART - atmega porovnání textového řetězce Citovat

Zdravím už několik dní řeším proč tenhle konkrétní příklad nefunguje. Pokud pošlu zprávu “on” měla by svítit ledka. Když to zadám do přerušení, tak to funguje, ale v hlavním programu nic pokud to nějak nezaobalím.
kód:
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h> 
#include <avr/interrupt.h>
#include <string.h>

#define UART_BAUD_RATE  9600
#define UART_BAUD_REGISTERS  (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1)

volatile char prijaty_znak=0;
char zprava[16];
 
ISR(USART_RX_vect)
{

static int i=0;
prijaty_znak = UDR;
 
 
 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 {
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
  zprava[i]='\0';
  i=0;
 }
}

int main(void){
   
   
   UBRRL = UART_BAUD_REGISTERS;;
   UCSRB = (1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(1<<UCSZ0) |(1<<UCSZ1);
   UCSRB |= (1 << RXCIE);
   
   DDRA =0xff;
   sei();
   
while(1){   
   
if(strcmp(zprava,"on")==0){PORTA |= (1<<PORTA0);}


 }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3412

PříspěvekZaslal: st květen 08 2024, 18:32    Předmět: Citovat

Co toto ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 191
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: st květen 08 2024, 19:30    Předmět: Citovat

Nearduinista napsal(a):
Zdravím už několik dní řeším proč tenhle konkrétní příklad nefunguje. Pokud pošlu zprávu “on” měla by svítit ledka. Když to zadám do přerušení, tak to funguje, ale v hlavním programu nic pokud to nějak nezaobalím.
kód:
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h> 
#include <avr/interrupt.h>
#include <string.h>

#define UART_BAUD_RATE  9600
#define UART_BAUD_REGISTERS  (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1)

volatile char prijaty_znak=0;
char zprava[16];
 
ISR(USART_RX_vect)
{

static int i=0;
prijaty_znak = UDR;
 
 
 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 {
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
  zprava[i]='\0';
  i=0;
 }
}

int main(void){
   
   
   UBRRL = UART_BAUD_REGISTERS;;
   UCSRB = (1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(1<<UCSZ0) |(1<<UCSZ1);
   UCSRB |= (1 << RXCIE);
   
   DDRA =0xff;
   sei();
   
while(1){   
   
if(strcmp(zprava,"on")==0){PORTA |= (1<<PORTA0);}


 }
}


Aký reťazec posielaš ak taký "on\r\n" pripadne "on\n\r" tak ? ten poslední znak ty prepíše 'o' na '\0'. skús poslať len "on\r" pripadne "on\n"

Ak posielaš len "on" tak tam chyba ukončovači znak "\0" pre funkciu strcmp()

a dávaj pozor niektoré terminály ty môžu znaky "\r\n" vkladať automaticky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
samec



Založen: Dec 19, 2017
Příspěvky: 4657

PříspěvekZaslal: st květen 08 2024, 19:50    Předmět: Citovat

char zprava[16]; musí byť volatile Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: st květen 08 2024, 19:58    Předmět: Citovat

samec napsal(a):
char zprava[16]; musí byť volatile Wink


Pokud použiji příkaz na porovnávání řetězců strcmp, tak když nechám volatile, překladač dá varování: passing argument 1 of ‘strncmp’ discards qualifiers from pointer target type. A nefunguje to stejně
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: st květen 08 2024, 20:16    Předmět: Citovat

Dumitru napsal(a):
Nearduinista napsal(a):
Zdravím už několik dní řeším proč tenhle konkrétní příklad nefunguje. Pokud pošlu zprávu “on” měla by svítit ledka. Když to zadám do přerušení, tak to funguje, ale v hlavním programu nic pokud to nějak nezaobalím.
kód:
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h> 
#include <avr/interrupt.h>
#include <string.h>

#define UART_BAUD_RATE  9600
#define UART_BAUD_REGISTERS  (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1)

volatile char prijaty_znak=0;
char zprava[16];
 
ISR(USART_RX_vect)
{

static int i=0;
prijaty_znak = UDR;
 
 
 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 {
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
  zprava[i]='\0';
  i=0;
 }
}

int main(void){
   
   
   UBRRL = UART_BAUD_REGISTERS;;
   UCSRB = (1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(1<<UCSZ0) |(1<<UCSZ1);
   UCSRB |= (1 << RXCIE);
   
   DDRA =0xff;
   sei();
   
while(1){   
   
if(strcmp(zprava,"on")==0){PORTA |= (1<<PORTA0);}


 }
}


Aký reťazec posielaš ak taký "on\r\n" pripadne "on\n\r" tak ? ten poslední znak ty prepíše 'o' na '\0'. skús poslať len "on\r" pripadne "on\n"

Ak posielaš len "on" tak tam chyba ukončovači znak "\0" pre funkciu strcmp()

a dávaj pozor niektoré terminály ty môžu znaky "\r\n" vkladať automaticky


Například takhle už to funguje v pohodě ale proč? Tady defakto jen počkám až se zpráva nahraje celá . A potom vyhodnotím řetězec zda je stejný nebo není. To mě vrtá už několik dnů hlavou.
kód:

#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h> 
#include <avr/interrupt.h>
#include <string.h>
 
#define UART_BAUD_RATE  9600
#define UART_BAUD_REGISTERS  (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1)

volatile char prijaty_znak=0;
volatile int  prijato=0;
char zprava[16];


ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 { 
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
   zprava[i]='\0';
   prijato=1;
    i=0;
 }
}

int main(void)
{
    UBRRL = UART_BAUD_REGISTERS;
    UCSRB = (1<<RXEN)|(1<<TXEN);
    UCSRC = (1<<URSEL)|(1<<UCSZ0) |(1<<UCSZ1);     
    UCSRB |= (1 << RXCIE);    
 
    DDRD=0b00000010;
    DDRA =0xff;

   
    sei();
      
   while(1)
 {
    if(prijato==1)
   {
   if(strcmp(zprava,"on")==0)
            {
             PORTA |=(1<<PORTA1);         
         }
      prijato=0;
   }      
       
 }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4657

PříspěvekZaslal: st květen 08 2024, 20:25    Předmět: Citovat

Ach jaj, strcmp. Používaš čarovné funkcie, tak máš čarovné výsledky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 191
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: st květen 08 2024, 20:36    Předmět: Citovat

neviem koľko trvá kym sa funkcia strcmp vykoná ale v prvom prípade ju voláš dookola v maine a ako už som písal ak pošleš „on\r\n“ tak sa do bufra uloží zaprava[0] = „o“ a zaprava[1] = „n“ potom „\r“ zaprava[2] = „\0“ vynuluje i=0 a „\n“ do zprava[i=0] kde je uložene „o“ prepíše na „\0“ a ak strcmp tráva dlhšie ako prijatie jedného znaku tak potom to nesedí v druhom prípade spustíš strcmp len raz pravé vtedy keď sprava je korektná.

Naposledy upravil Dumitru dne st květen 08 2024, 20:40, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 34882
Bydliště: Bratislava

PříspěvekZaslal: st květen 08 2024, 20:37    Předmět: Citovat

V skompilovanom kod mozno ani ziadny strcmp nebude, pretoze kompilator usudi, ze dana podmienka sa nemoze nikdy splnit a pri optimalizacii ho odstrani.

kód:
$ cat test.c
#include <stdio.h>
#include <string.h>

char zprava[16];
int main() {
    while (1) {
        if (strcmp(zprava,"on") == 0)
            printf("AAAAAA\n");
    }
}
$ cc test.c -o test
$ strings test | grep strcmp
strcmp
strcmp@GLIBC_2.0
$ cc test.c -O2 -o test
$ strings test | grep strcmp
$
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: st květen 08 2024, 20:58    Předmět: Citovat

Dumitru napsal(a):
neviem koľko trvá kym sa funkcia strcmp vykoná ale v prvom prípade ju voláš dookola v maine a ako už som písal ak pošleš „on\r\n“ tak sa do bufra uloží zaprava[0] = „o“ a zaprava[1] = „n“ potom „\r“ zaprava[2] = „\0“ vynuluje i=0 a „\n“ do zprava[i=0] kde je uložene „o“ prepíše na „\0“ a ak strcmp tráva dlhšie ako prijatie jedného znaku tak potom to nesedí v druhom prípade spustíš strcmp len raz pravé vtedy keď sprava je korektná.


Tož mě to taky napadlo, tak jsem se to pro zkoušku jal vyřešit takhle. A furt to nejede hm...



kód:
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 { 
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
  if(i>0)
  {
   zprava[i]='\0';   
  }
    i=0;
 }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 191
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: st květen 08 2024, 21:24    Předmět: Citovat

Nearduinista napsal(a):
Dumitru napsal(a):
neviem koľko trvá kym sa funkcia strcmp vykoná ale v prvom prípade ju voláš dookola v maine a ako už som písal ak pošleš „on\r\n“ tak sa do bufra uloží zaprava[0] = „o“ a zaprava[1] = „n“ potom „\r“ zaprava[2] = „\0“ vynuluje i=0 a „\n“ do zprava[i=0] kde je uložene „o“ prepíše na „\0“ a ak strcmp tráva dlhšie ako prijatie jedného znaku tak potom to nesedí v druhom prípade spustíš strcmp len raz pravé vtedy keď sprava je korektná.


Tož mě to taky napadlo, tak jsem se to pro zkoušku jal vyřešit takhle. A furt to nejede hm...



kód:
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 { 
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
  if(i>0)
  {
   zprava[i]='\0';   
  }
    i=0;
 }
}


a sisi isty ze tam chodia znaky \r a \n inak sa ty tam nikdy nedostane \0


skus takto

kód:

volatile char zprava[16];
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 { 
  zprava[i]=prijaty_znak;
  i++;
 zprava[i] = '\0';
 }
 else
 {
  if(i>0)
  {
   zprava[i]='\0';   
  }
    i=0;
 }
}


a v maine

kód:


if (strcmp((char *)zprava,(char *)"on\0") == 0)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: st květen 08 2024, 21:37    Předmět: Citovat

Jistý už si nejsem ničím, každopádně pokračování zase zítra po práci už mám z toho bolehlav.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4657

PříspěvekZaslal: st květen 08 2024, 22:40    Předmět: Citovat

tak nič
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mhepp



Založen: Aug 16, 2017
Příspěvky: 119

PříspěvekZaslal: čt květen 09 2024, 12:02    Předmět: Citovat

A není problém v té proměnné i?

kód:

...
volatile char zprava[16];
ISR(USART_RX_vect)
{
static int i=0;
...
}


Při každém volání ISR dojde k inicializaci proměnné i na 0, takže to vlastně neukládá nic... Z i bych udělal globální proměnnou:


kód:

...
volatile int prijato=0;
volatile char zprava[16];
volatile int i=0;

ISR(USART_RX_vect)
{
  prijaty_znak = UDR;

  //chybi osetreni delky vstupu - if (i>14) {...}

  if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
  {
    zprava[i]=prijaty_znak;
    i++;
    zprava[i]=0;
  } else {
    i=0;
    prijato=1;
 }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 191
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: čt květen 09 2024, 12:42    Předmět: Citovat

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.29 sekund