• 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?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

bertilCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.