Subversion Repositories Projects

Rev

Rev 178 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*      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[6] = {'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:
        if( (comNumber>0) && (comNumber<10) ) {

                comPort[3] = 48 + comNumber;    //COMx (x is ASCII coded)
                comPort[4] = 0;                                 //add string Terminator 'NUL'
                comPort[5] = 0;
                printf("-->using %s\n", comPort);
        }

        else {
                if(comNumber>=10 && comNumber<=99) {

                comPort[3] = 48 + (comNumber/10);
                comPort[4] = 48 + (comNumber%10);
                comPort[5] = 0;
                printf("-->using %s\n", comPort);
                }

                else {
                printf("COM Port must be between 1 and 99\n");
                return EXIT_FAILURE;
                }
        }

        //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);
}