tacoBell said:
Yeah..I checked the site but I need c code to set up the serial port.
I tried another open source code, but this time I have linking error with
bios.h.
Forget the BIOS, it's ancient history.
Depending on what you need to do, you may not need a library. Under 32 bit
Windows serial ports are treated using the "everything is a handle" approach
just as anything else. The quick HACK below opens up COM3: on this machine
where I have a modem, sends the Hayes command "identify" and displays the
response. It does the send and receieve asynchronously (loosely at the same
time) but includes NOTHING resembling sensible error checking.
I am writing a program in C and I have to set baud rate 2400,
transmit bits 8, parity none, stop bits 1 or 2.
Pay particular attention to the members of the DCB structure passed to
SetCommState() below. You'll need to set
BaudRate
Parirty
fParity
StopBits
My hack does the expedient thing of accepting whatever was there. That won't
work in your case.
You'll need to set the timeout parameters appropriately as well.
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
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;
}