• C

Serial Communications

I am having a bit of trouble using serial communications with C.  I am using a Dell XM590 90Mhz with NT4 server and VC++ compiler.  Although I am using the C++ compiler,  I am writing in generic C and not using any MFC (that I'm aware of).  I am trying to communicate with an RS232 compliant device (not a modem) on COM2.  The puropse of this device is to simply sit and wait until it gets a radio signal from another source, then pass information to the computer based on that radio signal.  I have verified that the device is working properly by hooking it to another computer and a generic testing program specifically made for this device.

I started out by opening the device with the CreateFile function.  I then checked the status of the device by sending a command by ReadFile and WriteFile.  So far, everything is working fine.  The problem occurs while trying to wait for the radio signal.  I set the comm mask to EV_RXCHAR, then use the WaitCommEvent function to wait for a character to arrive indicating that the radio signal has activated the device.  This is failing miserably.  Even though the comm mask is set, the WaitCommFunction fires on every comm event, seemingly even nonexistent ones.  The code for this function looks something like this:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char ReadFileData;
    BOOL quit = FALSE;
    OVERLAPPED ov;
    HANDLE h = CreateFile(paramaters);  /* opens the comm port.
    WriteFileEx(paramaters); /*sets the device in command mode.
    ReadFileEx(paramaters); /*reads the response verifying command mode
    WriteFileEx(paramaters);  /*set the device to data mode
    ReadFileEx(paramaters); /*get the data mode response and clear the input buffer.
    SetCommMask(h, EV_RXCHAR); /*set the comm mask to wait for an incoming character.
    while(!quit)
    {
        WaitCommEvent(parameters);
        ReadFileEx(parameters);  
        If(ReadFileBuffer == 0x0A) /*The code for incoming communication
        {
            ReadFileEx(parameters); /*Read the rest of the buffer and parse the data
        }
    }
    return 0;
}


I know this is rather vauge as source code goes, but I don't have the original code with me, and hopefully this gievs an idea of what I am trying to accomplish.
LVL 5
dirtdartAsked:
Who is Participating?
 
bertilConnect With a Mentor Commented:
Hi there.
I have used the serial comm stuff in NT4 and they run nice
on W95 too,The functions you need is standard Win32 API
so don't worry about MFC.I don't use the SetCommMask to
generate Events I poll it instead,if you need the Event style
use the polling method and put it in a separate thread and
have it to send normal messages to the main thread.
I open the port with CreateFile like you do be aware that you
must use OPEN_EXISTING when openning Com ports.
Then you need to setup a DCB with the correct baudrate
DSR flow and other things, feed that DCB to SetCommState.
To transmit use WriteFile and optionally FlushFileBuffers to
make sure that all chars are sent before you continue in your
program.Reading is a bit more tricky, to see if there are anything
in the buffer crate a COMSTAT and feed that to ClearCommError
then check if cbInQue in COMSTAT is greather than 0, if so
do a ReadFile and use the cbInQue as param 3  the param
that holds the count of chars you want to read.Thats it.

--Bertil

0
 
dirtdartAuthor Commented:
Thanks for the info.  This should make things run much smoother.  However, One other minor issue comes to mind. Is there any good way to make a timer in C?  I wouldn't want to constantly be polling the comm port to the expense of everything else on the machine.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.