X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f From: "Robbo" Newsgroups: comp.os.msdos.djgpp Subject: Re: RS232 transmission sometimes fail on AM2 Date: Thu, 19 Jul 2007 14:30:54 +0200 Organization: tp.internet - http://www.tpi.pl/ Lines: 140 Message-ID: References: NNTP-Posting-Host: doo217.neoplus.adsl.tpnet.pl X-Trace: atlantis.news.tpi.pl 1184848311 1992 83.24.122.217 (19 Jul 2007 12:31:51 GMT) X-Complaints-To: usenet AT tpi DOT pl NNTP-Posting-Date: Thu, 19 Jul 2007 12:31:51 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-Antivirus: avast! (VPS 000757-4, 2007-07-18), Outbound message X-Antivirus-Status: Clean To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com > > I use Free DOS. > > I have no idea about anything specific to any sort of DOS. However, serial > communication in DOS apps *running under Windows* is known to be unreliable. > Because of that many years ago I had to change the protocol to account for > lost or corrupt data packets. First of all, thank you all for answers. I don't use any dos box under Windows. I use pure DOS (but it is Free DOS, not MS DOS). > > One more thing: I installed special 2xRS232+1xLPT > > expansion card in the PC and connected the electronic > > device with RS232 to it. I found that problems with > > loosing sent commands are more frequently than > > when I connected RS232 cable directly to a main board. > > Btw, do you use BIOS to do the serial I/O or something else? The reason for > the question is that BIOS serial I/O is rather limited and might even be > buggy and I don't remember any decent terminal application using it. At the > same time, if it's all your code, not the BIOS'es, there might be some bug > just as well. I don't use BIOS's serial procedures. I write and read directly to/from ports. Below, there are my serial procedures. I'll be glade if you could find a bit of time to review them and check they are correct. Thanks in advance. I don't use interrupts. I use presented functions to send and receive short (2 characters long, sometimes 7 characters long) commands with '\0' at the end of each. enum { RECVBUF_MAX = 32, /* max. size of receiving buffer */ RECVBUF_USER_MAX = RECVBUF_MAX + 2, }; unsigned int COM = 0x3f8; /* COM do interfejsu */ unsigned long uartSpeed = 57600; /* szybkosc transmisji */ /* initUART: initialization */ void initUART(unsigned int com) { outportb(com + 1, 0); /* interrupts off */ outportb(com + 3, 0x80 | inportb(com + 3)); /* UART programming mode */ outportb(com, (115200 / uartSpeed) & 0xff); /* 57600 bps */ outportb(com + 1, (115200 / uartSpeed) >> 8); outportb(com + 3, 0x03); /* 8-bit, no parity */ outportb(com + 3, 0x7f & inportb(com + 3)); outportb(com + 2, 0xc7 | inportb(com + 2)); /* enable FIFO FCR */ outportb(com + 4, 0x0); } char recvBuf[RECVBUF_USER_MAX] = "\0"; char *recvBufPtr = recvBuf; /* recvTxt: check if there is data in receiving buffer and if so, copy them to "s" */ int recvTxt(char *s) { int p; unsigned char c; char tt[32]; /* receiving data which eventually was sent to us */ while ((inportb(COM + 5)) & 0x01) { c = inportb(COM); if (recvBufPtr - recvBuf < RECVBUF_MAX) *recvBufPtr++ = c; } /* if buffer is empty, return 0 */ if ((recvBufPtr == recvBuf) || (*(recvBufPtr - 1) != '\0')) return 0; strncpy(s, recvBuf, p = (recvBufPtr - recvBuf)); s[p] = '\0'; if (debug == 1) { char t[128]; sprintf(t, "recv.: \"%s\"", s); newState(t); } recvBufPtr = recvBuf; return p; } /* sendTxt: sends text via UART */ void sendTxt(const char *s) { char flagTrans = 0; if (debug == 1) { char t[128]; sprintf(t, "sent: \"%s\"", s); newState(t); } delay(50); /* waiting for completion of sending previously sent chain of characters */ while (!(inportb(COM + 5) & 0x20)) ; if ((s == NULL) || (s[0] == '\0')) return; /* sending */ while (flagTrans == 0) { if (*s == '\0') flagTrans = 1; /* waiting for completion of sending of previous character */ while (!(inportb(COM + 5) & 0x20)) ; outportb(COM, (unsigned char)*s++); } }