C och olika dataformat?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

C och olika dataformat?

Inlägg av jack »

Eller nåt sånt.. Jag försöker allafall skicka lite data via en MAX203:a och en PIC18F452:a till COM-porten på datorn. Hårdvaran fungerar och jag kan skicka enstaka bokstäver eller "hex-koder". Jag använder kompilatorn MikroC. Problemet är att jag är kass på C och inte riktigt förstår hur jag kan skicka textsträngar eller vanliga integers. Finns det något enkelt sätt?

Detta fungerar tex:

Kod: Markera allt

void main() {

Usart_Init(2400);

do {

USART_Write('J');
USART_Write(0x31);
   
} while(1);

}
Tacksam för svar.

//jack
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Strängar i C är arrays av bytes, med en nolla sist.

Kan skickas såhär:

Kod: Markera allt

void USART_Write_str(char *str)
{
   while(*str) USART_Write(*(str++));
}

void main(void)
{
   USART_Write_str("Hello World");
}
Integers och annat får du också skicka en byte åt gången, på en PIC tror jag en integer är 2 byte stor (oftast är det annars 4 byte).

Kräver kanske lite casting och annat som ser väldigt krångligt ut om man inte kan C :)

Kod: Markera allt


void USART_Write_anything(char *data, int n)
{
   while(n--) USART_Write(*(data++));
}

void main(void)
{
   int i = 42;

   USART_Write_anything((char*)&i,sizeof(i));
}

Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

cyr skrev: ...som ser väldigt krångligt ut om man inte kan C :)
Got that right! :)

Men tack för ditt utförliga svar. Ska kolla och se om jag lyckas.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Testade nu. String-funktionen fungerade alldeles utmärkt! Tack. Dock får jag bara ASCII-motsvarigheten när jag använder den andra för att skicka integers.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Ah, när du säger "skicka integer" så ville du ha ut text "12345" typ eller?

Det finns troligen redan färdiga funktioner för att skriva ut tal i olika format till din kompilator. Någon variant av printf eller liknande...
Senast redigerad av cyr 24 oktober 2005, 21:37:09, redigerad totalt 1 gång.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

cyr skrev:...ha ut text "12345" typ eller?
Exakt. Verkar inte finnas några färdiga funktioner vad jag kan se...

Var tog Sodjans inlägg vägen?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

I GCC hittar man i specifikationerna:

Kod: Markera allt

Non-standard(i.e. non-ISO C)functions.
(...)
 char*itoa(int __val, char*__s, int __radix)
(...)
Funktionen "itoa" gör alltså om integers till strängar. Finns motsvarigheter för char, long, etc.

Det borde finnas motsvarande i ditt bibliotek.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Var tog Sodjans inlägg vägen?

Ähum, det plockades bort eftersom han upptäckte att det sannolikt var felaktigt p.g.a ett missförstånd från densamme... :-)
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

$tiff skrev: Det borde finnas motsvarande i ditt bibliotek.
Mycket riktigt. Nämligen följande: void IntToStr(int number, char *output);

Tack alla för mycket bra svar.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

En till C-fråga: Hur kan jag "assigna" olika pinnar i en array? Så att tex PORTB.1 = kalle[1] och PORTB.2 = kalle[2].
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Den är en aning knepigare då du därmed måste instruera compilern om att just den byte (som man utgår ifrån) ligger på ett visst ställe i minnet.

Själva uppdelningen borde fungera såhär:
unsigned char Bits[8] : 1;
men jag vet inte om compilern tillåter det.

Sen förstår jag inte fördelen vid det, det går att göra mycket enklare och snabbare att komma åt de enstaka pinnar på en port.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Förklara gärna vad du tänkt göra istället (med arrayen t.ex.), så får du säkert en massa kreativa förslag.

Mvh
speakman
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Det jag vill göra är att loopa igenom PORTB.0-3 och PORTB.4-6 för att scanna av en vanlig 4x3-keypad. Tänkte mig nåt med en for-sats osv osv..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det skulle vara svårt för kompilatorn att fixa (och ineffektivt) eftersom pin-numret (0-7) är hårdkodat i själva maskin instruktionen. Kompilatorn skulle alltså behöva generera "rak" kod med en liten kodsnutt för varje pinne.
D.v.s att loop-variablen i FOR loopen inte kan användas som "index" till ett kommando som läser porten (i alla fall inte utan att kompilatorn skapar en massa kod) Enklast är nog att läsa PORTx till en variabel och sedan "do what you have to do" med variablen istället.

Scanning av en keypad kan ju även skrivas som en liten inline-asm snutt för att få full kontroll (och fart) på det. Kanske inte lika stor fördel i C som i t.ex Basic, men ändå...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Kanske inte lika stor fördel i C som i t.ex Basic, men ändå... - Nä såna enkla saker brukar optimeras ganska bra i C, om man själv optimerar C-koden vill säga. ;)
En enkel rutin för att utföra det hela skulle kunna vara:

Kod: Markera allt

unsigned char x,y;

for(y = 0; y < 3; y++) {
   PORTB = 1 << (y + 4);

   for(x = 0; x < 4; x++) {
      if(PORTB & (1 << x)) {
         /* Knapp (x,y) är nedtryckt */
      }
   }
}
Förmodligen måste TRIS sättas osv, men jag är för dålig på PIC för å veta exakt, så det måste du ordna själv.
Skriv svar