string fogadas->kuldes soros porton

 ( Proci85 | 2008. április 26., szombat - 22:44 )

Sziasztok!

Egy atmel atmega 88-as mikrovezérlőre kellene olyan programot irnom ami soros porton kap egy 10 számból álló stringet, majd visszaküldi. Ha már jól visszaküldené, tovább léphetnék oda hogy összevessem egy mintával.

http://pastebin.com/df729b5a

A c kód legalján van a küldő és fogado (rec) függvény. A küldő függvény remekül működik ha paraméterként egy stringet kap. Ennek mintájára próbáltam a fogadót is összehozni ami elvileg jó lenne, de 10db "D"-re ezt kapom vissza: "dddddŮ4 ".
Mi lehet a gond?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ora jel problema is lehet.

WARNING!!
localis, nem static valtozo cimevel tersz vissza (str2)

szerk megoldasok:
1, malloc()-al foglalasz char *str2 szamara 10 byteot, es felszabaditod miutan kiolvastad free() (lassu)
2, static char str2[10]; et hasznalsz, ilyenkor nem lesz reentrant a fuggveny , vagyis hivasi lancban egyszer szerepelhet csak
3, globalis valtozokent deklaralod, 2. hatranyai mellett, meg a globalis nevteret is szennyezi, de igy vissza sem kell terni vele (ezt javasolom most)

Szerintem is első körben globális változóként kéne használni az str2-ot.

4.
a fogado fuggveny parameterul kap egy cimet ahova fogadhat, es egy mertet, hogy (maximum) hany byteot.

A soros port milyen boud rate-el megy?
A mikrovezérlő honnan kapja az órajelet (belső oszcillátor vagy külső)?

Main fölé átraktam a char str[10]-et, fogadóból kivettem a returnnel együtt, igy a hiba megszünt, köszönöm.
A krix-krax sajnos továbbra is megmaradt, igaz más.
Próbáltam a 2 függvényt egymásba ágyazni: send_string(rec_string());
Igy minden 10. karakterre 2 F-et kapok, egyik alsó, másik felsőindexben van 1 karakter helyen a 2.
Csak valami pointer dolog lehet gondolom. A küldő jól megy ha mezei szöveget kap paraméterben...de most hogy nézem ez sem megy. Akkor volt ilyen mikor linux alatt gtktermben a kőldő függvényben használt i változót véletlenül a mainben is használtam intként, akkor pontozott. Win alatt suliban észrevettem, mainből kivéve jól irta ki. Most ismét linux alól vagyok, int nincs, mégis pontoz. gtktermmel lenne vmi? a BL (bootloader) és OK (kesz a feltoltes) szoveget rendesen kiirja amit a vzerlotol kap.

Belso orajelet hasznalunk, ami azt hiszem 8MHz és 9600 baud a kapcsolat sebessége.
9600 bit/s
1 stop bit
nincs paritás bit
átvitelvezérlés - nincs
adatbit - 8
GTKterm alsó sorában ez van:/dev/ttyUSB0: 9600,8,N,1, tehát ez a része szerintem jó, beállitások közt is lecsekkoltam. Esetlek az usb-soros átalakitóra tudok még gondolni. Winen közvetlen soros kábellel volt a kapcsolat. Hát igen, rossz igy debugolni, hogy számtalan dolog nem ugyanaz, mint a suliban:)

"fogadóból kivettem a returnnel együtt,"
"egymásba ágyazni: send_string(rec_string());"

return nelkul igy nem kene hasznalni.

Már nem emlékszem pontosan, hogy milyen órajelről használtam én az uC-t (4 vagy 8 MHz) belső oszcillátorral, de nálam a 9600 már nem ment helyesen, inkább 4800-at vagy 2400 bit/s-ot használtam. Belső oszcillátor elég pontatlan tud lenni, és emiatt nagyobb sebességen meghülyülhet a soros kommunikáció. Esetleg probáld meg alacsonyabb sebességen is, hogy van e hiba.

belső oszcillátor? Netán Kandós vagy? :)

yes:) 3-os csak ez az elsős tárgyam még visszamaradt:)

hehe akkor tudom ki vagy Proci :)
Viszont sajna nem tudok segíteni a problémádban

illetve mégis esetleg. Regelve van itt a hup-on az egyik tanárunk is, ha gondolod szólok neki és szívesen segít.

Esetleg tudnám javasolni, hogy az adatbájtok átvitele után egy 11-ik checksum bájtot is vigyél át, aminek a milyenségéből a fogadó fél tud következtetni, hogy helyes volt-e az adatátvitel. Ha nem, megismételhetné az adatátvitelre vonatkozó igényét.

Egyébként nekem is az a gyanúm, hogy vagy adatátviteli sebesség probléma, vagy esetleg valami hardveres gond is lehet. Gondolok itt pl. arra, hogy az adatátviteli kábel árnyékolása nem tökéletes, és zavaró jeleket szedhet össze a jel.

Köszönöm az értékes hozzászólásokat! A minap bent windows alatt próbálgattam és működik!:)
http://pastebin.com/m575dd313
char str2[10]; a main fölé került. Return str2-t akkor benne hagytam.

mainben:
unsigned char *kod;
kod=rec_string();
egyezik1=strcmp(kod, "xxxxxxxxxx");
és itt az egyezik1 erteke helyesen 0 lesz egyezeskor.

Köszönöm mindenkinek a segitségét ezügyben!
Más felöl viszont gtkterm alól még mindig a hülyeséget löki. pontoz+beirt számokat küldi vissza (vissza kell küldenie de zárójelben 1x, ez meg 1.5-2x küldi). Ha a kapcs sebessége eltér 9600 baudtól, a kommunikációt jelző bit bebillen (villog 1 led) de karaktert nem kap/küld.

szerk.: suliban direkt a saját usb-soros átalakitómmal, kábeleimmel próbáltam. Gond nélkül vitte.

En megprobalnam nativ soros kabellel inkabb, ez a USB-soros nem hangzik nagyon jol. Ha nagyon szorit a hurok, parezerert lehet kapni soros portos kartyat (pci), de ugy tudom 1 darab meg akad a mai gepeken.