blob: 6e82e9580c7b884d7a73f6d408b1f6fa45d6363b [file] [log] [blame]
// UART wrapper implementation for the Win32 platform
// make a new version of this file for different systems, e.g. Linux
#include <windows.h>
#include "scalar_types.h" // (U)INT8/16/32
#include "Uart.h"
// COMx for windows, returns NULL on error
tUartHandle UartOpen(char* szPortName)
{
HANDLE serial_handle;
DCB dcb;
COMMTIMEOUTS cto = { 0, 0, 0, 0, 0 };
memset(&dcb,0,sizeof(dcb));
/* -------------------------------------------------------------------- */
// set DCB to configure the serial port
dcb.DCBlength = sizeof(dcb);
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fDtrControl = DTR_CONTROL_ENABLE; // enable for power
dcb.fDsrSensitivity = 0;
dcb.fRtsControl = RTS_CONTROL_ENABLE; // enable for power
dcb.fOutX = 0;
dcb.fInX = 0;
/* ----------------- misc parameters ----- */
dcb.fErrorChar = 0;
dcb.fBinary = 1;
dcb.fNull = 0;
dcb.fAbortOnError = 0;
dcb.wReserved = 0;
dcb.XonLim = 2;
dcb.XoffLim = 4;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x19;
dcb.EvtChar = 0;
/* ----------------- defaults ----- */
dcb.BaudRate = 4800;
dcb.Parity = NOPARITY;
dcb.fParity = 0;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
/* -------------------------------------------------------------------- */
// opening serial port
serial_handle = CreateFile(szPortName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
if (serial_handle == INVALID_HANDLE_VALUE)
{
//printf("Cannot open port \n");
return NULL;
}
SetCommMask(serial_handle, 0);
SetCommTimeouts(serial_handle, &cto);
if(!SetCommState(serial_handle, &dcb))
{
//printf("Error setting up COM params\n");
CloseHandle(serial_handle);
return NULL;
}
return serial_handle;
}
// returns true on success, false on error
bool UartConfig(tUartHandle handle, long lBaudRate, tParity nParity, tStopBits nStopBits, int nByteSize)
{
DCB dcb;
if (!GetCommState (handle, &dcb))
{
return false;
}
dcb.BaudRate = lBaudRate;
dcb.Parity = nParity;
dcb.StopBits = nStopBits;
dcb.ByteSize = nByteSize;
if(!SetCommState(handle, &dcb))
{
//DWORD dwErr = GetLastError();
//printf("Error %d setting up COM params for baudrate byte\n", dwErr);
return false;
}
return true;
}
// returns how much data was actually transmitted
long UartWrite(tUartHandle handle, unsigned char* pData, long lSize)
{
BOOL success;
DWORD result_nbr;
success = WriteFile(handle, pData, lSize, &result_nbr, NULL);
if(!success)
{
return 0;
}
return result_nbr;
}
// returns how much data was actually received
long UartRead(tUartHandle handle, unsigned char* pBuffer, long lSize)
{
BOOL success;
DWORD read_nbr;
success = ReadFile(handle, pBuffer, lSize, &read_nbr, NULL);
if(!success)
{
return 0;
}
return read_nbr;
}
void UartClose(tUartHandle handle)
{
if (handle != NULL)
{
CloseHandle(handle);
}
return;
}