[PC til UC] Wave fil gennem RS-232

T

theone_in_themoon

Guest
Hej Alle ...

Ive set en handsom nej.stillinger om seriel kommunikation via RS-232 port ....Men mit problem er en smule mærkeligt.

Im benytter en simpel kode til at læse en fil tegn for tegn og transmitt det seriel.Wat jeg ville gerne gøre rent faktisk er at sende en WAV fil serie til en Micro controller, som gemmer det i en CF-kort.

I øjeblikket im teste den for at sende filen korrekt.Men selv når jeg slutte sig sammen i traans og modtage af Serial Port (COM1) programmet hænger op efter afsendelse ca.250 byte.

Ive forsøgt at sende en tekstfil, og at der sendes correcly ....men når du sender en WAV-fil ....programmet bare bliver hængende efter 251 bytes.

Ive spilles med en masse ...og ive bemærket, at hvis vi sætter en forsinkelse efter bioscom sende karakter kommandolinje ......så er der en ændring i nogen.af byets hvorefter det sætter sig fast.Men Max er det gået til, er 340 byte ca.

Her er koden:
Code:/ *

DETTE ER EN PROGRAME vil læse en FILE BYTE BY BYTE og sende den til

Seriel port.Det er imidlertid også får den samme CHAR tilbage og skriver det til en

Angivne placering.*** IT venter ikke på tilsendte CHAR ...
At blive modtaget* /# 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];lang ctr_r = 0;

lang filstørrelse = 0;int håndtere = 0;

int status = 0;unsigned char ch_rx = 0;

unsigned char ch_tx = 0;bioscom (0, SETTINGS, COM1);domstol <<"\ n \ nEnter filstien for Læs:";

får (path_r);domstol <<"\ n \ nEnter filstien for Skriv:";

får (path_w);håndtag = åben (path_r, O_RDONLY);

filstørrelse = filelength (håndtag);

close (håndtag);

domstol <<"File Size:" <<filstørrelsen <<endl;file_r = fopen (path_r, "rb"); / / "rb" til "read only i BINARYif (! file_r)

(

perror ("Læs FILE ERROR");

getch ();

exit (0);

)file_w = fopen (path_w "wb" );//" wb "for skrives kun i BINARYif (! file_w)

(

perror ("Skriv fil fejl");

getch ();

exit (0);

)/ / Loop indtil slutningen af filen for læse

while (ctr_r <filstørrelsen)

(

ch_tx = fgetc (file_r);

bioscom (1, ch_tx, COM1);

domstol <<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);

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

/ / Vent = 0;

/ / Getch ();

)ctr_r ;

)fclose (file_r);

fclose (file_w);domstol <<"\ n \ n \ WAV fil er oprettet!" <<endl;

getch ();

) / / Slut af de væsentligste

 
Jeg tror det skyldes seriel port buffer over køre.indstille baudhastighed til en lavere værdi derefter prøve igen.

mike

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

 
PLEASE IKKE CROSSPOST!Jeg fjernet din anden post og flyttede denne ene til det sted, hvor den burde være.

Og en bemærkning / spørgsmål:
Er du programmering for DOS?
Når du programmering for vinduer, du skal håndtere den serielle port på en anden måde (som en fil).Må ikke direkte HW IO i vinduer, medmindre du skriver enhedsdrivere og vide, hvad du laver!

Mere information kan findes her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp

Nogle ting du kan prøve:
Prøv at læse wav-fil og se om det bliver læst helt (uden at sende noget over den serielle port).Når det ikke er der er noget galt med rutiner, der læser din fil.
Prøv at sende alle Binary karakterer over UART og se, om de er modtaget bøde.
Code:for (int i = 0; i <256; i )

SendByte ((unsigned tegn), i); / / Med SendByte indpakningen rutine til at sende en byte

 
Im ked abt på tværs post, men ingen på svarede det til mig her, så jeg tænkte bedre at skrive det der.Men im stadig ked af: $

Nu til problemet .....godt ....som jeg gjorde nævne det tidligere ...syg fortælle u at im skrive denne programe at interface PC med en UC.Den UC med modtage en fil byte af byte og skrive det til en Compact Flash kort.Dens fungerer fint excpet at dette programe stucks i nogle af filerne.Det bliver holdt efter forskellige no.af byte til forskellige filer.For nogle filer den kører helt: S

Og ja ...det bliver stukket, selv når im blot at læse en skriftligt inden for en PC uden seriel transmission.Ive forsøgt at se på Character sendt i den sidste, før det bliver stukket ....men forskellig i forskellige filer.Hvilket betyder, at det ikke abt karakter.

For så vidt angår buffer størrelse er bekymret ....hvis dette var tilfældet ....så er det shud ALTID går i stå efter samme no.af byte ...hvilket ikke er tilfældet.: S

Im hjælpeløs lige nu ...overhøjde tænke på noget mere ...

Please Help

Tak en meget

 
Jeg tror du programmeringen for DOS
Jeg har ikke header du bruger så jeg kan ikke kompilere din fil.

Jeg kompileret en fil, der læses's og skriver en komplet fil (faktisk er det bare kopiere

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

)
Jeg har markeret det sted, hvor du skal prøve at tilføje koden for UART

Jeg fjernede alle funktioner som jeg ikke kender, og kun brugt standard bibliotek funktioner.

Jeg håber dette hjælper.
Men lad være at gøre seriel kommunikation med bios opkald, når du er programmering til Windows!

Code:# 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 filstien for Læs:" <<std:: endl;

får (path_r);

file_r = fopen (path_r, "rb"); / / "rb" til "read only i BINARY

if (! file_r)

(

std:: Cerr <<"Kunne ikke åbne Læs File!"
<<Std:: endl;

tilbagevenden -1;

)std:: cout <<"\ nEnter filstien for Skriv:" <<std:: endl;

får (path_w);

file_w = fopen (path_w "wb" );//" wb "for skrives kun i BINARY

if (! file_w)

(

std:: Cerr <<"Kunne ikke åbne Skriv File!"
<<Std:: endl;

fclose (file_r);

tilbagevenden -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 over UART

/ / Modtag fra UART

/ /!
ADVARSEL modtager kan blokere!

/ / Det betyder, at den løbende venter, indtil en byte er modtaget!/ / 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 fil er oprettet!" <<std:: endl;

return 0;

)

 
Nå ...min Turbo C gør ikke kompilere denne kode: S

Kunne u foreslå wat at gøre??

 
Sandsynligvis Turbo C har sin egen syntaks særlige

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />(Jeg tror det ikke i løbet af de navnerum (std:: cout ...))Jeg foreslår, at du kopiere hele filen uden at bruge den serielle port.
(Fjerne alle bioscom opkald)
måske kan du prøve at fjerne filstørrelsen ting og gå gennem hele filen på denne måde:
Code:while (! feof (file_r))

(

ch_tx = fgetc (file_r);

...

 
Tak Antharax ...........Ive allerede klikket for 3 point for u.
Men jeg har brug for en lil mere hjælp.Og jeg tror u kan hjælpe mig ...

Ive kommer at vide, at TC kan ikke støtte en højere transmissionshastighed end 9600.Men jeg har brug for at kommunikere højere end det.Enhver lavere end 10.000 vil gøre.

Nu jeg ønsker at programmere i Visual C eller Visual Basic ...et program, der gør det samme.dvs læser filen char af fjeldørred og sender det via den serielle port.

ELLER

Hvis det gør ikke gøre hverken så syg nødt til at ty til Parallel port.

Kan du "oversætte" den kode, jeg klistret til Visual C ???

Ill være virkelig taknemmelig ...
Tak en meget igen

 
Her er en visuel C eksempel
Det er ikke den bedste løsning (flertrådede men det omfatter ikke korrekte tråd kommunikation)
Det er også forbruger alle tilgængelige CPU-kraft!
Jeg havde ikke tid til at skrive mere, men det bør gøre hvad du vil (testet det hurtigt med en anden PC, er data læses fra filen og sende over UART
de data, der modtages fra UART er skrevet i den anden fil)

Du kan studere det og tilpasse det som du ønsker.

Men måske bør du læse en bog om vinduer programmering
(Ting interessant at lære:
- Mutexes: HANDLE myMutex = CreateMutex (NULL, FALSE, NULL);
WaitForSingleObject (myMutex, uendelige);
ReleaseMutex (myMutex);
- Arrangementer: HANDLE myEvent = CreateEvent (NULL, FALSE, FALSE, NULL); / / AUTO Reset
SetEvent (myEvent);
WaitForSingleObject (myEvent, uendelige);
)Kilden til UART anvendes kode:
http://www.tetraedre.com/advanced/serial2.php
Beklager, men du skal login for at se denne tilslutningskrav

 

Welcome to EDABoard.com

Sponsor

Back
Top