Seriel kommunikation (Com porten)

Tags:    c++

Hej folkens

Jeg er i gang med at lave et program i C der kan overføre en fil fra en pc til en anden via
seriel porten(COM1), men jeg er kommet i problemer da min kode kun kan sende en tekst streng
rigtig en gang og det er hvis strengen ikke er for lang. Næste gang den serder strengen er der fejl i den.
Ind til dette problem er løst bruger jeg kun en pc så jeg bruger et RS-232 Loopback stik
(kan findes her: http://www.sealevel.com/knowledgebase/loopbacks.asp). Hvordan løser jeg det problem?

PS: programmet skal kunne køre i DOS.



#include <stdio.h>
#include <bios.h>
#include <dos.h>

#define COM1 0 //select com1(0x3f8)port
#define DATA_READY 0x100
#define ARRAY_SIZE 25
#define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00)
//baud 1200, 7 data bits, no parity, 1 stop bit

void init_seriel_comm();

void init_seriel_comm() {
bioscom(_COM_INIT, SETTINGS, COM1); //init. port
}

int main() {
int status, out, count_in, count, i;
int send=1;
char msg[] = "HenrikLundorffThorsgaard!";
char msg_in[ARRAY_SIZE];

clrscr();
for(i=0; i < ARRAY_SIZE; i++) msg_in=0;

init_seriel_comm();

printf("Send strengen: '");

for(i=0; i < ARRAY_SIZE; i++) printf("%c", msg);

printf("'\\n\\n");

while(1) {
status = bioscom(_COM_STATUS, 9, COM1);

if(status & DATA_READY) {
if((out = bioscom(_COM_RECEIVE, 0, COM1) & 0x7F) != 0) msg_in[count_in++]=out;

if(out == '!') {
for(i=0; i < strlen(msg); i++) printf("%c", msg_in);
printf("\\n");
for(i=0; i < ARRAY_SIZE; i++) msg_in=0;
count_in=0;
send=1;
}
}

if(send) {
for(i=0; i < strlen(msg); i++) bioscom(_COM_SEND, msg, COM1);
send=0;
}

if(kbhit()) break;
}
getch();
return 0;
}




3 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato

Jeg tror at et af problemerne er at du sender alle karakterene på én gang, jeg tror at du skal vente med at sende den næste til den første er blevet sendt.

Et par tips til udvikleren:

Den kan ikke lide at man skriver et 'i' i en firkantet parantes.
Hvis man har noget kode kan man skrive det inden for '[ pre ]' og '[ / pre ]' uden ' og mellemrum, så kommer det til at se sådan ud:

Fold kodeboks ind/udKode 


[Redigeret d. 05/10-04 20:15:50 af Bertel Brander]



Ja det er nok rigtig nok at man skal sende et tegn eller kun nogle stykker af gangen og så vente med at sende mere ind til man får svaret at de er modtaget, men hvordan laver man så det? mig og en kammerat har bikset med det i noget tid, så vi kunne godt tænke os lidt hjælp til at løse den her opgave :)


===============================
-- www.RadixCreation.com
-- www.DVDimmeren.dk
===============================



Så vidt jeg kan se på denne side:

http://ttt.upv.es/~jaherllo/libc_65.html

skal i læse status og checke et af de øverste bits, enten "transmit holding register empty" eller "transmit shift register empty".
Det ene bit bliver vist sat når den begynder at sende en karakter, det andet når den er sendt.



t