Subversion Repositories FlightCtrl

Rev

Blame | Last modification | View Log | RSS feed

/* First version by Bjoern Biesenbach <bjoern@bjoern-b.de> */
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <stdlib.h>

#include "serial.h"
#include "main.h"

static int fd; // File descriptor for serial port

int open_port(char *port)
{
        int fds; /* File descriptor for the port */
       
        fds = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
        if (fds == -1)
        {
                /*
                * Could not open the port.
                */

                perror("open_port: Unable to open serial port!");
                exit(1);
        }
        else
        fcntl(fds, F_SETFL, 0);
       
        return (fds);
}
void AddCRC(unsigned int wieviele)
{
 unsigned int tmpCRC = 0,i;
 for(i = 0; i < wieviele;i++)
  {
   tmpCRC += TxBuffer[i];
  }
   tmpCRC %= 4096;
   TxBuffer[i++] = '=' + tmpCRC / 64;
   TxBuffer[i++] = '=' + tmpCRC % 64;
   TxBuffer[i++] = '\r';
}



void sende()
{
        unsigned char tmp_tx;
        int i=0;
        while(TxBuffer[i] !='\r' && i<150)
        {
                write(fd,&TxBuffer[i],1);
                i++;
        }
        write(fd,"\r",1);
}

void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *buffer, int len)
{
 unsigned int pt = 0,i;

 TxBuffer[pt++] = '#';           // Startzeichen
 TxBuffer[pt++] = modul+'a';     // Adresse (a=0; b=1,...)
 TxBuffer[pt++] = cmd;           // Commando
 if(len)
 for(i = 0;i < len; i+=3)
 {
    TxBuffer[pt++] = '=' + (buffer[i] >> 2);
    TxBuffer[pt++] = '=' + (((buffer[i] & 0x03) << 4) | ((buffer[i+1] & 0xf0) >> 4));
    TxBuffer[pt++] = '=' + ((unsigned char) ((buffer[i+1] & 0x0f) << 2) | ((buffer[i+2] & 0xc0) >> 6));
    TxBuffer[pt++] = '=' + ((unsigned char) buffer[i+2] & 0x3f);
  }
 AddCRC(pt);
 sende();
}

void initSerial(char *port)
{
        struct termios options;
        fd=open_port(port);
        tcgetattr(fd, &options);
        cfsetispeed(&options, B57600);
        cfsetospeed(&options, B57600);
        options.c_cflag |= (CLOCAL | CREAD);
        tcsetattr(fd, TCSANOW, &options);
        fcntl(fd, F_SETFL, FNDELAY);
}