Fórumok
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.
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ások
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.