I work on a lot of different Windows CE projects. Some of them have a display, while others do not. Sometimes I just have a board laying on my desk with power and a debug serial connection. So I thought it would be handy to have a simple little app that I could use for testing my drivers.
Given my constraints, the debug port would be useful for presenting the user interface. Sure I could use a serial driver for this, but would mean using two serial ports, which I don't always have available. Of course I needed to get input from the debug serial port.
I cannot tell a lie here, my first pass was simple, not to mention bad style. I simply set a pointer to the input FIFO and read bytes if they were available. Sure it worked, but it wasn't very portable was it? This solution would fail if I moved to a different processor (the CPUs that I use have UARTS built in). It also would fail with Windows CE 6.0.
Well I did some digging and found that Microsoft does support reading from the serial port. Makes sense, the OEMs have to support it by implementing OEMReadDebugByte(). So I did some searching and found a couple of functions using OEMReadDebugByte() in the private code.
The function that I could use in my app is InputDebugCharW(). It isn't documented, but it is just a wrapper for OEMReadDebugByte() which is documented. The documentation is simple, InputDebugCharW() returns an int which is the byte read, OEM_DEBUG_READ_NODATA if no bytes available, or OEM_DEBUG_COM_ERROR if an error is returned. Looking at code I noticed that OEM_DEBUG_COM_ERROR could indicate that the function isn't implemented but I am going to ignore that case becuase I make sure that it is implemented.
InputDebugCharW() would be documented like this, if it was documented:
This function retrieves a byte from the debug monitor port.
int OEMReadDebugByte (void);
Parameters
None.
Return Values
Returns the data byte if available, OEM_DEBUG_COM_ERROR if an error is
detected, or OEM_DEBUG_READ_NODATA if no data is available at the port.
Requirements
OS Versions: Windows CE 2.12 and later.
Header: pkfuncs.h.
Link Library: Coredll.lib.
So I am off and running. I need a function to wrap InputDebugCharW() and handle the possible return values. In my case, I just want to wait until a character shows up. Errors will be ignored.
Here is what I came up with:
int GetInput(void)
{
int c;
do{
Sleep( 100 ); // Don't hammer the CPU
c = InputDebugCharW();
}while( c == OEM_DEBUG_READ_NODATA );
return c;
}
By trial and error, I discovered that I also needed a way to clear out the input FIFO in the UART. To do that I have a function that is the opposite of GetInput():
int ClearInput()
{
int c;
do{
Sleep( 10 );
c = InputDebugCharW();
}while( c != OEM_DEBUG_READ_NODATA );
return c;
}
Now I can read from the debug serial port as well as write to it. I didn't mention it, but I use RETAILMSG to write to the port.
In the next few days I will put these functions together to create a simple little menu system to create a user interface.
Copyright © 2008 – Bruce Eitman
All Rights Reserved