You are here

Kommunikáció UART PIC18F67J50IPT-vel_[MEGOLDVA]

9 posts / 0 new
Last post
Lengyel József
Lengyel József picture

Sziasztok !

Van egy PIC18F67J50 mikrokontroller és az lenne a feladata ,hogy egy transzparens WiFi-ről UART-on keresztül fogadna például 11 karaktert egy mobil telefonszámot lényegében.
Amit használok fejlesztő rendszert az MikroC Pro for PIC.
A fejlesztő rendszerben van egy függvény UART1 _Read_Text(telszam ,"OK",11); de nem műkődik.A  baud rata 9600bps, 8bit,no parity ,1stop bit. A függvény argumentumai : telszam a tömb ,amiben tárolnám a telefonszámot.  Az OK egy határoló delimiter eddig olvassa az UART1_Read_Text(a bajt folyamot, 11 pedig ,hogy 11 karaktert kell olvasni). Megszakítással meg lehet ezt oldani ,a kérdés ,hogyan? Hogyan tudok olvasni több bájtot UARTON keresztül? A program C nyelveben íródott A Proteus-al szimuláltam küldtem "06204001234OK" bájt sorozatot és nem működik.

Előre is köszönöm a segítséget mindenkinek !

Üdv : Lengyel József.

MEGOLDÁS:

A UART_Read_Text(pointer tömb, delimiter ,karakterek szama); függvényben a karakterek számát ' ' SPACE karaktert "írtam be." A lényege ,hogy a MIkroC pro for PIC-ben az UART_Read_Text(pointer tomb ,delimiter ,' ' ); esetemben ilyen alakú :

char *szerviz[16];

void main()

       UART1_Init(9600);
  do{
        if(UART1_Data_ready() == 1)
        {
          UART1_Read_Text(szerviz ,"OK" , '  ' );// Az OK delimiterig olvas karaktereket a soros portról. Ez működik így most. 
          UART1_Write(0x0A);
          UART1_Write(0x0D);
          UART1_Write_Text(szerviz);
          UART1_Write(0x0A);
          UART1_Write(0x0D);
        } 

       }while(1);

}

Mindenkinek köszönöm a segítséget ! :) Üdv : József Lengyel

Comments
ty
ty picture

Hello!
Ezt bontsad részfeladatokra, mert túl sok benne az ismeretlen.
Első lépésként ismerd meg az UART és az UART rutinok működését.
Ha elakadsz, akkor ennek kapcsán tegyél fel kérdést.
Ha ezzel megvagy, utána jöhet a többi.
Üdv

0

Lengyel József
Lengyel József picture

Szia !

Csatolok engedelmeddel egy részletet a MikroC pro for PIC helpből .

void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts); ami érdekes ,hogy a karakterek száma előtt ott van a char  változó tipus (?) hogy lehet char ?
 

Reads characters received via UART until the delimiter sequence is detected. The read sequence is stored in the parameter output; delimiter sequence is stored in the parameter delimiter.

This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits (if the delimiter is not found).

Parameters :

  • Output: received text
  • Delimiter: sequence of characters that identifies the end of a received string
  • Attempts: defines number of received characters in which Delimiter sequence is expected. If Attempts is set to 255, this routine will continuously try to detect the Delimiter sequence. 

És egy minta forráskód 4800 bps :

UART1_Init(4800);
// initialize UART1 module Delay_ms(100);
while (1) {
if (UART1_Data_Ready() == 1)
{ // if data is received UART1_Read_Text(output, "OK", 10); // reads text until 'OK' is found
UART1_Write_Text(output); // sends back text }
}

A lényeg ,hogy nem működik . A PIC konfigkja jó mert azt próbáltam karakter kiíratását soros monitorra az működik.

Üdv : József Lengyel

0

Jaca
Jaca picture
*****

Szia József!

Assembler rutint be tudsz szúrni? 

Üdv: Jácint

0

Lengyel József
Lengyel József picture

Szia Jaca !
Igen tudok beszúrni assembly blokkot. Arra jutottam idáig ,hogy a tömb amiben menti a telefonszámot pointer tömb  char *szerviz[16]; .Így kellet megadnom a tömb típusát. Most működik a dolog. Amit még csináltam ,az hogy ahogy korábban írtam a függvény prototipusában a karakterek száma char típusú (?) nem tudom miért ez a típusa a krakterek számának ,(?) de  azt úgy csináltam meg ,hogy '  ' SPACE karaktert adtam meg neki. És ami érdekes ,hogy most úgy működik ,ahogy kell.

Üdv : Józsi 

0

kovacsna
kovacsna picture
*

Szia!

A tömb az mindig származtatott típus, nem alap adatípus. Ergo pointer mutat az első elemére.

Kicsit szemléletesebben:

Az, hogy a karakterek száma char típusként van átadva, az attól függ, hogy mi van a hívott függvényen belül. Nézd meg.

Üdv,

KN

0

Lengyel József
Lengyel József picture

Szia !
Köszönöm szépen a tömbös magyarázatot.Szemléletes ,nagyon jó. köszönöm !

Az UART_Read_Text (pointer tömb , delimiter , karakterek szama)
gyári függvény belsejét ,tartalmát meg fogom nézni ,hogy a karakterek száma miért char típusú ?
 Az ember azt gondolná ,hogy ez unsigned short típusú kellene ,hogy legyen például,... , de nem. Megnézem ,hogy miért van ez így .

Még egyszer nagyon szépen köszönöm !

Üdv : József Lengyel

0

Oszi11
Oszi11 picture

Sziasztok!

karakterek száma miért char típusú ?

Ez a C azon tulajdonsága miatt van, hogy az adattípusok mérete mindig igazodik az adott hardverhez, így pl.: a short a mikroc-ben 8bit de a pc-n már 16 bit, A char pedig mindig minden rendszeren 8bit, így ha 8 bites számra van szüksége egy c programozó a char-t választja. A másik dolog hogy short int típust szinte soha nem választ az ember mert az int csak 3 betű és lustaság félegészség smiley

Üdv,
    Oszi

0

Lengyel József
Lengyel József picture

Szia ,Osz11 !
Köszönöm szépen a magyarázatot ! :) Arra emlékeztem ,hogy az int tipus az implementáció függő de ez a char magyarázat ez nagyon jó amit megosztottál.Megint tanultam valamit.

Üdv : József Lengyel

0

Sponsored links