Mike said:
Sorry, don't know if this is the correct
board for my question.
Technically, the topic of this group is the C++ programming language as
implemented by Visual Studio. Practically, we get lots of questions on how
to use the language to do things.
I'm a novice so I guess I have a valid excuse.
Unlike the USENET groups we don't sacrifice our trespassers. If I knew
of a more appropriate group I'd direct you.
My question : I'm using Visual C++ and I need
to collect data from a serial port. Specifically, I
have a piece of equipment that outputs ASCII data
to my computer through the serial port. Is there
some way I can call the serial port from within Vis
C++ and then save the data?
Yes, of course. Windows' mantra is "everything is a handle". So you open up
a COMM port and get a handle. Armed with a handle you call ReadFile() and
WriteFile() almost as though you were reading from a file. I say, "almost"
because COMM ports have some properties that files do not. For example, you
need to set parity bit attribute as well as a reasonable timeout policy.
What follows is a little HACK, completley devoid of anything resembling
correct error handling which opens up a port on which this box has a modem
(COM3), sends a Hayes command (ATI1 = identify) and receives the modem
response through the port.
I suggest you consult the MSDN for the names of functions which are
unfamiliar to you. It should get you started.
Regards,
Will
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char szBuffer[80];
DCB dcb = {0};
DWORD dwRead, dwWritten;
HANDLE hComm;
OVERLAPPED ovlr = {0}, ovlw = {0};
COMMTIMEOUTS cto;
// Create events for overlapped operation
ovlr.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
ovlw.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
// Open the port
hComm = CreateFile("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
// Get the state of the device and modify it
dcb.DCBlength = sizeof(dcb);
GetCommState(hComm, &dcb);
dcb.BaudRate = CBR_9600;
SetCommState(hComm, &dcb);
// Set the timeout parameters nonsensically
cto.ReadIntervalTimeout = 1000;
cto.ReadTotalTimeoutConstant = 1000;
cto.ReadTotalTimeoutMultiplier = 1000;
cto.WriteTotalTimeoutConstant = 1000;
cto.WriteTotalTimeoutMultiplier = 1000;
SetCommTimeouts(hComm, &cto);
// Send a command and receieve a response. Note that
// we post the receive in advance of sending the
// command in order not to miss anything
printf("\r\nSending: ATI1\r\n");
ReadFile (hComm, szBuffer, sizeof(szBuffer), &dwRead, &ovlr);
WriteFile(hComm, "ATI1\r", strlen("ATI1\r"), &dwWritten, &ovlw);
// Wait for the receive to complete and display the response
if ( GetOverlappedResult(hComm, &ovlr, &dwRead, TRUE) )
{
szBuffer[dwRead] = 0;
printf("Received: %s\r\n", szBuffer);
}
// Close the device
CloseHandle(hComm);
return 0;
}