|
|
/*
|
|
|
* uart.cpp
|
|
|
*
|
|
|
* Created on: Oct 16, 2014
|
|
|
* Author: Alan Aguilar Sologuren
|
|
|
*/
|
|
|
|
|
|
#include "uart.h"
|
|
|
|
|
|
namespace rbp {
|
|
|
|
|
|
#include <stdio.h>
|
|
|
#include <unistd.h>
|
|
|
#include <fcntl.h>
|
|
|
#include <termios.h>
|
|
|
|
|
|
/*!
|
|
|
*
|
|
|
*/
|
|
|
uart::uart(uint32_t baudrate,int buffsz){
|
|
|
fs=-1;
|
|
|
buffsize = buffsz;
|
|
|
rx_buffer = nullptr;
|
|
|
tx_buffer = nullptr;
|
|
|
if(!setup(baudrate)){
|
|
|
delete this; //TODO log
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
*
|
|
|
*/
|
|
|
uart::~uart() {
|
|
|
if(fs!=-1){
|
|
|
close(fs);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
*
|
|
|
*/
|
|
|
bool uart::setup(uint32_t baudrate){
|
|
|
fs = -1;
|
|
|
//Open in non blocking read/write mode
|
|
|
fs = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);
|
|
|
if (fs == -1)
|
|
|
{
|
|
|
printf("Error - Unable to open UART. Ensure it is not in use by another application\n");// TODO cambiar al sistema de log
|
|
|
return false;
|
|
|
}
|
|
|
struct termios options;
|
|
|
tcgetattr(fs, &options);
|
|
|
options.c_cflag = baudrate | CS8 | CLOCAL | CREAD;
|
|
|
options.c_iflag = IGNPAR;
|
|
|
options.c_oflag = 0;
|
|
|
options.c_lflag = 0;
|
|
|
tcflush(fs, TCIFLUSH);
|
|
|
tcsetattr(fs, TCSANOW, &options);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
*
|
|
|
*/
|
|
|
ssize_t uart::receive(uint8_t* rx_buff){
|
|
|
ssize_t cnt=0;
|
|
|
if (fs != -1)
|
|
|
{
|
|
|
rx_buffer = new uint8_t[256];
|
|
|
cnt = read(fs, (void*)rx_buffer, 255);
|
|
|
if (cnt < 0)
|
|
|
{
|
|
|
//An error occured (will occur if there are no bytes)
|
|
|
//TODO cambiar a sistema de log
|
|
|
}
|
|
|
else if (cnt == 0)
|
|
|
{
|
|
|
//No data waiting
|
|
|
//TODO cambiar a sistema de log
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
rx_buffer[cnt] = '\0';
|
|
|
rx_buff = rx_buffer;
|
|
|
}
|
|
|
}
|
|
|
return cnt;
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
*
|
|
|
*/
|
|
|
ssize_t uart::transmit(uint8_t* tx_buff, size_t nbytes){
|
|
|
ssize_t cnt=0;
|
|
|
if (fs != -1)
|
|
|
{
|
|
|
tx_buffer = tx_buff;
|
|
|
cnt = write(fs, (void*)tx_buffer, nbytes); //Filestream, bytes to write, number of bytes to write
|
|
|
if (cnt < 0)
|
|
|
{
|
|
|
printf("UART TX error\n");//TODO cambiar a sistema de log
|
|
|
}
|
|
|
}
|
|
|
return cnt;
|
|
|
}
|
|
|
|
|
|
} /* namespace rbp */
|
|
|
|