[PC uC] Wave súboru cez RS-232

T

theone_in_themoon

Guest
Hello Everybody ...

Ive videl docela Handsome Zb.pracovných miest o sériovej komunikácie cez port RS-232 ....Ale môj problém je trochu divné.

Im pomocou jednoduchého kódu prečítať súboru znak po znaku a transmitt je sériovo.Wat chcem urobiť, je v skutočnosti poslať súbor WAV sériovo na správcu, Micro, ktorá ukladá sa do CF karty.

V súčasnej dobe im testing ju poslať súbor správne.Ale aj keď aj spojiť traans a prijímať zo Serial Port (COM1) program zavesia až po odoslaní cca.250 bytov.

Ive tried odosielanie textových súborov a ktorý je odoslaný correcly ....ale pri posielanie súborov WAV ....program iba nalepia po 251 bytov.

Ive hral s veľa ...a ive si všimol, že keď dáme odkladu po tom, čo bioscom poslať znak príkazového riadku ......potom dôjde k zmene v ne.z byets po ktorom uviazne to.Ale Max je preč, je cca 340 bytov.

Tu je kód:
Kód:/ *

TOTO JE PROGRAM NA ČÍTAJTE FILE BY BYTE BYTE a pošle ju

Serial Port.Avšak to tiež dostáva rovnakú CHAR SPÄŤ A ju zapíše

Určenom mieste.*** IT nečaká na CHAR DOSTAL ...
Ktoré majú byť prijaté* /# Include <conio.h>

# Include <iostream.h>

# Include <dos.h>

# Include <process.h>

# Include <stdio.h>

# Include <string.h>

# Include <fcntl.h>

# Include <io.h>

# Include <bios.h>
# Define COM1 0

# Define DATA_READY 0x100

# Define TRUE 1

# Define FALSE 0

# Define Settings (0x80 | 0x03 | 0x00 | 0x00)void main (void)

(

clrscr ();FILE * file_r;FILE * file_w;char path_r [50];

char path_w [50];dlho ctr_r = 0;

dlho filesize = 0;int handle = 0;

int stav = 0;unsigned char ch_rx = 0;

unsigned char ch_tx = 0;bioscom (0, NASTAVENIE, COM1);cout << "\ n \ nEnter cesta k súboru pre čítanie:";

gets (path_r);cout << "\ n \ nEnter cesta k súboru pre zápis:";

gets (path_w);handle = open (path_r, O_RDONLY);

filesize = filelength (handle);

close (handle);

cout << "Veľkosť súboru:" <<filesize <<endl;file_r = fopen (path_r, "rb"); / / "rb" iba pre čítanie v binárnomif (! file_r)

(

perror ( "Read FILE ERROR");

getch ();

exit (0);

)file_w = fopen (path_w, "WB" );//" WB "pre zápis iba v BINARYif (! file_w)

(

perror ( "Write FILE ERROR");

getch ();

exit (0);

)/ / Slučka do konca súboru pre čítanie

while (ctr_r <filesize)

(

ch_tx = fgetc (file_r);

bioscom (1, ch_tx, COM1);

cout <<endl << "Ch_Tx:" <<ch_tx;status = bioscom (3, 0, COM1);

if (status & DATA_READY)

(

ch_rx = bioscom (2, 0, COM1);

fputc (ch_rx, file_w);

cout <<endl << "Ch_Rx:" <<ch_rx << "" <<ctr_r;

/ / Wait = 0;

/ / Getch ();

)ctr_r ;

)fclose (file_r);

fclose (file_w);cout << "\ n \ n \ WAV súbor vytvorený!" <<endl;

getch ();

) / / Koniec hlavných

 
Myslím, že to je spôsobené tým, sériový port cez vyrovnávaciu pamäť behu.nastaviť prenosovú rýchlosť na nižšiu hodnotu a potom skúste to znova.

mike

-----------------------------------------
www.ezpcb.com

 
PLEASE Nechcem CROSSPOST!Odstránil som si iné miesto a presťahoval sa na toto miesto, kde by mala byť.

A ešte jedna poznámka / dotaz:
Ste programov pre DOS?
Keď ste programovania pre Windows, mali by ste zvládnuť sériového portu iným spôsobom (ako súbor).Nerobia priamo HW IO v oknách, ak píšete ovládače a vedieť, čo robíte!

Viac informácií možno nájsť tu:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp

Niektoré veci, ktoré môžete vyskúšať:
Skúste si prečítať wav súboru, a uvidíme, či to číta úplne (bez odoslania niečo cez sériový port).Keď sa to nepodarí, že je niečo v neporiadku s postupmi, ktoré si prečítať súbor.
Skúste zaslanie všetkých binárnych znakov po UART a zistiť, či sú doručené v poriadku.
Kód:for (int i = 0; i <256; i )

SendByte ((unsigned char) i) / / S SendByte obálka rutina pre odoslanie byte

 
Im sorry ABT cez post, ale nie o odpovedal mi to tady tak som si to rozmyslel, aby ste mohli písať, ako to tam dobre.Ale im tichý ľúto: $

A teraz problém .....dobre ....ako i didnt spomenul predtým ...ill povedať, že u im písania tohto Programe prepojenie PC s uC.UC sa dostávajú do súboru byte byte a zapísať ho na Compact Flash kartu.Its working fine excpet, že tento Programe stucks v niektorých súborov.Je uviazne po rôznych Zb.v byte na rôzne súbory.Pre niektoré súbory, ktoré je kompletne: S

A áno ...to uviazne aj keď im just čítanie písomne do PC bez sériového prenosu.Ive tried pohľade na znak poslal v poslednom pred neuvízly ....ale jej rôzne v rôznych súboroch.Čo znamená, že nie je Abt charakter.

Pokiaľ ide o veľkosť vyrovnávacej pamäte sa týka ....v prípade, že bol prípad ....potom shud VŽDY uviaznu po rovnakej Zb.v byte ...čo nie je tento prípad.: S

Im bezmocný práve teraz ...prevýšenie myslieť na niečo viac ...

Please Help

Díky moc

 
Myslím, že ste programov pre DOS
Nemám na hlavičku, ktorú používate, takže i nemôžu zostaviť váš súbor.

I zostaviť súbor, ktorý čítal a píše kompletný súbor (v skutočnosti je to len kópia

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />

)
Som označil miesto, kde by ste sa mali snažiť doplniť kód pre UART

Som odstránil všetky funkcie, já nevím a len štandardné knižnice funkcií.

Dúfam, že to pomôže.
Nechcem ale do sériovej komunikácie s bios hovory, keď ste programovanie pre windows!

Kód:# Include <stdio.h>

# Include <iostream>int main (void)

(

FILE * file_r;

FILE * file_w;char path_r [50];

char path_w [50];unsigned char ch_rx = 0;

unsigned char ch_tx = 0;std:: cout << "\ nEnter cesta k súboru pre čítanie:" <<std:: endl;

gets (path_r);

file_r = fopen (path_r, "rb"); / / "rb" iba pre čítanie v binárnom

if (! file_r)

(

std:: cerro << "Nemožno otvoriť súbor Prečítajte si!"
<<Std:: endl;

return -1;

)std:: cout << "\ nEnter cesta k súboru pre zápis:" <<std:: endl;

gets (path_w);

file_w = fopen (path_w, "WB" );//" WB "pre zápis iba v BINARY

if (! file_w)

(

std:: cerro << "Nemožno otvoriť súbor napíš!"
<<Std:: endl;

fclose (file_r);

return -1;

)std:: cout <<std:: endl;

while (! feof (file_r))

(

ch_tx = fgetc (file_r);

/ / Std:: cout << "Ch_Tx: 0x" <<std:: hex <<(int) ch_tx <<std:: endl;/ / Send cez UART

/ / Príjem z UART

/ /!
UPOZORNENIE príjemcom môže byť blokovanie!

/ / To znamená, že rutinná čaká až bajt sa dostal!/ / Quick patch:

ch_rx = ch_tx;fputc (ch_tx, file_w);

/ / Std:: cout << "Ch_Rx: 0x" <<std:: hex <<(int) ch_rx <<std:: endl;

)fclose (file_r);

fclose (file_w);std:: cout << "WAV súbor vytvorený!" <<std:: endl;

return 0;

)

 
No ...moje Turbo C kompilácie Doesnt tento kód: S

Môže navrhnúť u wat robiť?

 
Pravdepodobne Turbo C má vlastný syntax špecifiká

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />(Myslím, že po neúspechu menných priestorov (std:: cout ...))Navrhujem, aby ste skopírovať celý súbor bez použitia sériového portu.
(odstráňte všetky bioscom hovory)
Možno môžete skúsiť odstrániť filesize vec a prejsť celý súbor nasledovne:
Kód:while (! feof (file_r))

(

ch_tx = fgetc (file_r);

...

 
Thanks Antharax ...........Ive už klikli na 3 body za u.
Avšak i need lil viac pomoci.A myslím, že mi môže pomoct ...

Ive spoznali, že TC prevýšenia podporu vyššie prenosové rýchlosti ako 9600.Ale musím oznámiť vyššia ako to.Každopádne pod 10000 bude robiť.

Teraz chcem programovať vo Visual C alebo Visual Basic ...program, ktorý robí to isté., Tj číta súbor char char tým a pošle ho cez sériový port.

OR

V prípade, že doesnt to buď chorý potom musí uchýliť k paralelný port.

Môžete 'preložiť' kód, ktorý vložili aj pre Visual C ???

Budem veľmi vďačný ...
Díky moc ešte raz

 
Tu je Visual C príklad
Nie je to najlepšie riešenie (multithreading, ale neobsahuje správne komunikácie vlákno)
To tiež spotrebuje všetky dostupné cpu moc!
Nemal som čas napísať viac, ale to by mal robiť čo chcete (testované rýchlo sa druhý PC, čítanie dát zo súboru a poslať cez UART
dáta, ktoré sú od UART je písaná v inom súbore)

Môžete študovať a prispôsobiť ho ako budete chcieť.

Ale možno by ste si mali prečítať knihu o programovaní okná
(Čo zaujímavého dozvedieť:
- Mutexes: HANDLE myMutex = CreateMutex (NULL, FALSE, NULL);
WaitForSingleObject (myMutex, INFINITE);
ReleaseMutex (myMutex);
- Udalosti: HANDLE myEvent = CreateEvent (NULL, FALSE, FALSE, NULL); / / AUTO Reset
SetEvent (myEvent);
WaitForSingleObject (myEvent, INFINITE);
)zdroj pre UART použitý kód:
http://www.tetraedre.com/advanced/serial2.php
Ospravedlňujeme sa, ale musíte prihlásiť do zobrazenie túto prílohu

 

Welcome to EDABoard.com

Sponsor

Back
Top