Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 177 → Rev 178

/MoteCtrl/Sources/pc_serial_port.c
0,0 → 1,132
/* This file is part of MoteCtrl
http://www.mikrokopter.de/ucwiki/en/MoteCtrl
*/
 
//Include header files, which provide resources, pc_serial_port.c needs:
#include <windows.h> //Windows API, to interface with the serial port
#include <stdio.h> //Standard I/O (printf for instance)
 
#include "pc_serial_port.h"
 
 
/*
Compiler & Linker Porperties:
Set "Character Set"-CompilerFlag to "Not Set" or "Multi Byte Character Set" to
avoid Errors about Windows API functions that can handle Unicode paramters.
In Visual Studio: Properties of Project -> Configuration Properties -> General
*/
 
 
HANDLE hCom; //Handle, which contains inf about the opened Device File
//(the opened COM-Port, returned by CreateFile function)
 
//Initialize & Configure COMx-Port
//return value: EXIT_FAILURE=1, EXIT_SUCCESS=0 (stdlib macros)
int init_com_port(int comNumber) {
DCB dcb; //Device Control Block, contains Configuration for COM-Port
char comPort[5] = {'C','O','M'}; //Number and String Terminator to be added
int fSuccess; //Stores inf about file-actions (action succeeded or failed)
COMMTIMEOUTS timeouts; //Struct, which stores inf about the timeout
//behaviour of the COM-Port
 
//Get the Com-Port Number:
comPort[3] = 48 + comNumber; //COMx (x is ASCII coded)
comPort[4] = 0; //add string Terminator 'NUL'
 
//Create Device File, initialize serial Port:
hCom = CreateFile( comPort, //open COMx Device (pointer to comPort-String)
GENERIC_READ | GENERIC_WRITE, //write/read permisions
0, // must be opened with exclusive-access
NULL, // default security
OPEN_EXISTING, // must use OPEN_EXISTING
0, // no overlapping
NULL // hTemplate must be NULL for comm devices
);
 
//Check, if CreateFile succeeded:
if (hCom == INVALID_HANDLE_VALUE) {
printf ("***ERR: CreateFile failed with error %d.\n", GetLastError());
return EXIT_FAILURE;
}
 
//Get the currently active Device Control Block (DCB) for the COMx:
SecureZeroMemory(&dcb, sizeof(DCB)); //initialize entire dcb-struct with zeros
dcb.DCBlength = sizeof(DCB);
fSuccess = GetCommState(hCom, &dcb); //write the current configuration to
//our dcb-struct
 
//GetCommState returns 0, if error occured while getting the DCB
if (!fSuccess) {
printf ("***ERR: GetCommState failed with error %d.\n", GetLastError());
return EXIT_FAILURE;
}
 
/*Change the values of the obtained dcb-struct to match the config of the
*Mikrokopter. Currently the FlightControl communicates at:
*57600 Baud (bps), 8 Data bits, no parity bit, 1 stop bit */
 
dcb.BaudRate = CBR_57600; // Set Baudrate
dcb.ByteSize = 8; // data size, transmit and receive
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit
//Send reconfigured dcb back to COMx Device-File:
fSuccess = SetCommState(hCom, &dcb);
//SetCommState returns a 0, if error occured while setting the DCB for COMx
if (!fSuccess) {
printf ("***ERR: SetCommState failed with error %d.\n", GetLastError());
return EXIT_FAILURE;
}
 
//Configure the Read-Timeout behaviour of the initialized COMx-Port:
 
/* The following Read-Timeout config determines the behaviour of the
ReadFile cmd (applied to the initialized COMx-Port):
If a Byte is in the Hardware UART-Buffer of the initialized COM-Port and
the ReadFile function is called, this byte is read. If theres no byte in
the UART-InputBuffer and the ReadFile function is called, the ReadFile
function will return *immediatly* (BytesRead parameter is zero then).
*/
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
//Send the Timeout-Config to the COM-Port:
fSuccess = SetCommTimeouts (hCom, &timeouts);
//Check, if setting the timeout-settings was successfull:
if(!fSuccess) {
printf("***ERR: SetCommTimeouts failed with error %d.\n", GetLastError());
return EXIT_FAILURE;
}
 
 
//Initialization & Configuration of COMx done!
return EXIT_SUCCESS;
}
 
 
//Function which reads 1 Byte of the Rx-Buffer of the initialized COM-Port:
//Return value: Number of the bytes read (should be 0 or 1)
int getCharFromCom (char* inputBuffer) {
 
int numOfBytesRead;
ReadFile (hCom, inputBuffer, 1, &numOfBytesRead, NULL);
//read char is stored in the passed char-buffer
 
return numOfBytesRead;
}
 
 
//Function which writes [length] Byte to the Tx-Buffer of the initialized COM-Port:
//Returns something>0 if write failed, 0 if successfull
int sendStringToCom (char* toSend, int length) {
int numOfBytesWritten;
 
//write char to which the passed char-pointer points to
return WriteFile (hCom, toSend, length, &numOfBytesWritten, NULL);
}