From: David Allsopp Newsgroups: comp.os.msdos.djgpp Subject: Comms on COM1 Date: Thu, 18 Feb 1999 16:13:58 +0000 Organization: Tranquillity Software Ltd. Message-ID: NNTP-Posting-Host: tqbase.demon.co.uk X-NNTP-Posting-Host: tqbase.demon.co.uk:193.237.23.6 X-Trace: news.demon.co.uk 919354774 nnrp-04:12499 NO-IDENT tqbase.demon.co.uk:193.237.23.6 X-Complaints-To: abuse AT demon DOT net MIME-Version: 1.0 X-Newsreader: Turnpike (32) Version 4.01 Lines: 172 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I have a comms problem, if anyone is able to help... The program attached below is meant to open COM1, send a wakeup character to a weighbridge, read the weighbridge's response, and write it out to a file. The file name is passed as an argument, and the file is created if necessary. If there is any second argument, a log file is also created. There is a timeout after 5 seconds. The script is compiled with "gcc -o wbridge -Wall -s wbridge.c" If COM1 is attached to a laptop running a terminal emulator, you can see the character come out, and (subject to the timeout) successfully type stuff back to the program. This does, however, require that the RTS/CTS pins (7 and 8) are jumpered together. However, when the weighbridge is attached, it only gives back a response one time in three or four; the rest of the time the program times out. When it occurs, the response is immediate and of the correct format So... Is there anything wrong with the program? I admit it isn't the prettiest thing in the world, but KISS... Should the COM1 port settings in NT setup be made to specify anything in particular? We are currently using the default port settings. Should we force a particular flow-control strategy? The possible settings are "none", "xon/xoff" and "hardware". Do we need to force COM1 to use IRQ14? This is the IRQ mentioned in the documentation for "bios.h". Er, that's it... Thanks in advance for any help. ========================== PROGRAM FOLLOWS ========================== #include #include #include #include #include #include #include #define COM1 0 #define COM2 1 #define COM3 2 #define COM4 3 #define INIT_COMMAND 0 // initialize com port (DATA is the settings) #define WRITE_COMMAND 1 // write byte to port #define READ_COMMAND 2 // read byte from port (DATA is ignored) #define STAT_COMMAND 3 // get port status #define BIT15 16384 #define CR '\015' #define LF '\012' // GLOBAL DECLARATIONS: so that they can be used inside the signal handler FILE * LogHandle = NULL; struct time TimeNow; struct date DateNow; char LogMessage[100]; void WriteLog(char * message) { if (LogHandle != NULL) { fprintf(LogHandle, message); } } void OnSignal() { gettime(&TimeNow); sprintf(LogMessage, "Run timed out at %d:%02d.%02d\n", TimeNow.ti_hour, TimeNow.ti_min, TimeNow.ti_sec ); WriteLog(LogMessage); exit(1); } int main(int argc, char * argv[]) { // DECLARATIONS FILE * OutputFile; int PortStatus; char PortData [50]; int i; // ARGUMENT CHECKING AND INITIALISATIONS if (argc == 1) { fprintf(stderr, "%s: no filename specified!\n", argv[0]); return 2; } if ((OutputFile = fopen(argv[1], "w")) == NULL) { fprintf(stderr, "%s: cannot open file %s\n", argv[0], argv[1]); return 3; } if (argc > 2) { char LogFileName[200]; strcat(strcpy(LogFileName, argv[1]), ".LOG"); if ((LogHandle = fopen(LogFileName,"w")) == NULL) fprintf(stderr, "%s: warning: cannot open log file %s\n", argv[0], argv[1] ); } getdate(&DateNow); gettime(&TimeNow); mprintf(LogMessage, "Run started at %d:%02d.%02d on %02d/%02d/%d\n", TimeNow.ti_hour, TimeNow.ti_min, TimeNow.ti_sec, DateNow.da_day, DateNow.da_mon, DateNow.da_year ); WriteLog(LogMessage); // INITIALISE PORT PortStatus = bioscom(INIT_COMMAND, 0xe3, COM1); sprintf(LogMessage, "Port initialised: return value %#0x\n",PortStatus); WriteLog(LogMessage); // WRITE ENQUIRY BYTE TO PORT PortStatus = bioscom(WRITE_COMMAND, 0x05, COM1); sprintf(LogMessage,"Port byte written: return value %#0x\n",PortStatus); WriteLog(LogMessage); // SET UP ALARM CALL: hard-wired 5 seconds signal(SIGALRM, &OnSignal); alarm(5); // READ FROM PORT i = 0; while (i < 49) { int DataRead = bioscom(READ_COMMAND, 0, COM1); if (DataRead & BIT15) { // bit 15: error continue; // ignore error and busy loop } else if (DataRead & 0xff) { PortData[i++] = (char)(DataRead & 0xff); sprintf(LogMessage,"\tVALID READ %c\n",PortData[(i-1)]); WriteLog(LogMessage); if (PortData[i-2] == CR && PortData[i-1] == LF) { WriteLog("\tCR/LF detected: stop\n"); break; } } else { WriteLog("\tNULL BYTE\n"); } } PortData[i++] = (char)0; // ensure null-terminated // WRITE STRING OUT TO SPECIFIED FILE fputs(PortData, OutputFile); fflush(OutputFile); fsync(fileno(OutputFile)); // FINISH gettime(&TimeNow); sprintf(LogMessage, "Run ended at %d:%02d.%02d\n", TimeNow.ti_hour, TimeNow.ti_min, TimeNow.ti_sec ); WriteLog(LogMessage); return 0; } -- David Allsopp Houston, this is Tranquillity Base. Remove SPAM to email me The Eagle has landed.