From 70e85ab8e9490f6b566fd0f58c9d3ecba2a0dce6 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 29 Mar 2019 11:12:31 +0100 Subject: [PATCH] usart Klasse --- Makefile | 2 +- drv/b15f.cpp | 20 +++++--- drv/b15f.h | 51 +++++++++++++++++---- drv/b15f.o | Bin 76928 -> 46008 bytes drv/driverexception.h | 2 +- drv/timeoutexception.h | 35 ++++++++++++++ drv/usart.cpp | 74 ++++++++++++++++++++++++++++++ drv/usart.h | 102 +++++++++++++++++++++++++++++++++++++++++ drv/usart.o | Bin 0 -> 11208 bytes drv/usartexception.h | 33 +++++++++++++ main | Bin 71568 -> 60672 bytes main.cpp | 34 ++++++++++---- main.o | Bin 16032 -> 14096 bytes 13 files changed, 327 insertions(+), 26 deletions(-) create mode 100644 drv/timeoutexception.h create mode 100644 drv/usart.cpp create mode 100644 drv/usart.h create mode 100644 drv/usart.o create mode 100644 drv/usartexception.h diff --git a/Makefile b/Makefile index a2dd96d..39e260b 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ COMPILER_PATH = g++ OUTPUT = main CFLAGS = -std=c++14 -O3 LDFLAGS = -OBJECTS = main.o drv/b15f.o drv/plottyfile.o drv/dot.o +OBJECTS = main.o drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o COMPILE = $(COMPILER_PATH) $(CFLAGS) diff --git a/drv/b15f.cpp b/drv/b15f.cpp index ebcef9f..c58b4eb 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -31,7 +31,7 @@ void B15F::init() std::cout << "OK" << std::endl; - delay(1); + delay_ms(1); std::cout << PRE << "Teste Verbindung... " << std::flush; uint8_t tries = 3; @@ -65,7 +65,7 @@ void B15F::reconnect() uint8_t tries = RECONNECT_TRIES; while(tries--) { - delay(RECONNECT_TIMEOUT); + delay_ms(RECONNECT_TIMEOUT); discard(); @@ -86,7 +86,7 @@ void B15F::discard(void) for(uint8_t i = 0; i < 8; i++) { writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) - delay((16000 / BAUDRATE) + 1); // warte mindestens eine Millisekunde, gegebenenfalls mehr + delay_ms((16000 / BAUDRATE) + 1); // warte mindestens eine Millisekunde, gegebenenfalls mehr } tcflush(usart, TCIFLUSH); // leere Eingangspuffer } @@ -219,7 +219,9 @@ bool B15F::analogWrite0(uint16_t value) try { writeByte(RQ_AA0); + delay_ms(1); writeInt(value); + delay_ms(1); uint8_t aw = readByte(); return aw == MSG_OK; @@ -253,6 +255,7 @@ uint16_t B15F::analogRead(uint8_t channel) try { writeByte(RQ_ADC); + delay_ms(1); writeByte(channel); return readInt(); } @@ -316,13 +319,13 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset void B15F::writeByte(uint8_t b) -{ +{ if(write(usart, &b, 1) != 1) throw DriverException("Fehler beim Senden. (byte)"); } void B15F::writeInt(uint16_t v) -{ +{ if(write(usart, reinterpret_cast(&v), 2) != 2) throw DriverException("Fehler beim Senden. (int)"); } @@ -434,10 +437,15 @@ bool B15F::readBlock(uint8_t* buffer, uint16_t offset) } } -void B15F::delay(uint16_t ms) +void B15F::delay_ms(uint16_t ms) { std::this_thread::sleep_for(std::chrono::milliseconds(ms)); } + +void B15F::delay_us(uint16_t us) +{ + std::this_thread::sleep_for(std::chrono::microseconds(us)); +} B15F& B15F::getInstance(void) { diff --git a/drv/b15f.h b/drv/b15f.h index c5a8790..4d48b21 100644 --- a/drv/b15f.h +++ b/drv/b15f.h @@ -15,6 +15,7 @@ #include #include #include "driverexception.h" +#include "timeoutexception.h" class B15F { @@ -39,25 +40,55 @@ public: uint16_t analogRead(uint8_t); bool analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); - // Serielle Verbindung - inline void writeByte(uint8_t); - inline void writeInt(uint16_t); - inline uint8_t readByte(void); - inline uint16_t readInt(void); - inline bool readBlock(uint8_t* buffer, uint16_t offset); + /** + * Lässt den Treiber für eine angegebene Zeit pausieren + * \param ms Verzögerung in Millisekunden + */ + void delay_ms(uint16_t ms); + /** + * Lässt den Treiber für eine angegebene Zeit pausieren + * \param us Verzögerung in Microsekunden + */ + void delay_us(uint16_t us); - void delay(uint16_t); - + /** + * Liefert eine Referenz zur aktuellen Treiber-Instanz + * @throws DriverException + */ static B15F& getInstance(void); private: int usart = -1; - uint16_t timeout = 100; // ms + uint16_t timeout = 1000; // ms uint16_t block_timeout = 1; // ms int TEST = 0; static B15F* instance; + + + /*********************************************** + * Grundfunktionen für die serielle Verbindung * + ***********************************************/ + + /** + * Übergibt ein Byte an die USART Schnittstelle + */ + void writeByte(uint8_t); + + /** + * Übergibt ein Integer an die USART Schnittstelle + */ + void writeInt(uint16_t); + + /** + * Übergibt ein Integer an die USART Schnittstelle + * \throws TimeoutException + */ + uint8_t readByte(void); + uint16_t readInt(void); + bool readBlock(uint8_t* buffer, uint16_t offset); + // CONSTANTS const std::string PRE = "[B15F] "; @@ -66,7 +97,7 @@ private: constexpr static uint8_t MSG_FAIL = 0xFE; constexpr static uint16_t RECONNECT_TIMEOUT = 64; // ms constexpr static uint8_t RECONNECT_TRIES = 3; - constexpr static uint32_t BAUDRATE = 38400; + constexpr static uint32_t BAUDRATE = 115200; constexpr static uint8_t CRC7_POLY = 0x91; // REQUESTS diff --git a/drv/b15f.o b/drv/b15f.o index f95b1124bb6f0b983bcf55e01111581c62102a6b..47f3a9cba8df9f3a78f6c763f9af42dfa4a2ef38 100644 GIT binary patch literal 46008 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 E4eZV@H~;_u literal 76928 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 + +// SOURCE: https://stackoverflow.com/a/8152888 + +class TimeoutException: public std::exception +{ +public: + explicit TimeoutException(const char* message, int timeout) : TimeoutException(std::string(message), timeout) + { + } + + explicit TimeoutException(const std::string& message, int timeout) : msg(message), timeout(timeout) + { + if(!msg.length()) + msg = "Timeout reached (" + std::to_string(timeout) + ")"; + } + + virtual ~TimeoutException() throw () + { + } + + virtual const char* what() const throw () + { + return msg.c_str(); + } + +protected: + std::string msg; + int timeout; +}; + +#endif // TIMEOUTEXCEPTION_H diff --git a/drv/usart.cpp b/drv/usart.cpp new file mode 100644 index 0000000..554c598 --- /dev/null +++ b/drv/usart.cpp @@ -0,0 +1,74 @@ +#include "usart.h" + +USART::USART(std::string device) : device(device) +{ +} + +void USART::openDevice() +{ + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + if(file_desc <= 0) + throw USARTException("Fehler beim Öffnen des Gerätes"); + + struct termios options; + int code = tcgetattr(file_desc, &options); + if(code) + throw USARTException("Fehler beim Lesen der Geräteparameter"); + + options.c_cflag = CS8 | CLOCAL | CREAD; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + options.c_cc[VTIME] = timeout; + code = cfsetspeed(&options, baudrate); + if(code) + throw USARTException("Fehler beim Setzen der Baudrate"); + + code = tcsetattr(file_desc, TCSANOW, &options); + if(code) + throw USARTException("Fehler beim Setzen der Geräteparameter"); + + clearOutputBuffer(); + clearInputBuffer(); +} + +void USART::closeDevice() +{ + int code = close(file_desc); + if(code) + throw USARTException("Fehler beim Schließen des Gerätes"); +} + +void USART::clearInputBuffer() +{ + int code = tcflush(file_desc, TCIFLUSH); + if(code) + throw USARTException("Fehler beim Leeren des Eingangspuffers"); +} + +void USART::clearOutputBuffer() +{ + int code = tcflush(file_desc, TCOFLUSH); + if(code) + throw USARTException("Fehler beim Leeren des Ausgangspuffers"); +} + +uint32_t USART::getBaudrate() +{ + return baudrate; +} + +uint8_t USART::getTimeout() +{ + return timeout; +} + +void USART::setBaudrate(uint32_t baudrate) +{ + this->baudrate = baudrate; +} + +void USART::setTimeout(uint8_t timeout) +{ + this->timeout = timeout; +} diff --git a/drv/usart.h b/drv/usart.h new file mode 100644 index 0000000..7d17d20 --- /dev/null +++ b/drv/usart.h @@ -0,0 +1,102 @@ +#ifndef USART_H +#define USART_H + +#include +#include +#include +#include +#include +#include "usartexception.h" + +class USART +{ +public: + USART(std::string device); + + /************************************************* + * Methoden für die Verwaltung der Schnittstelle * + *************************************************/ + + /** + * Öffnet die USART Schnittstelle + * \throws USARTException + */ + void openDevice(void); + + /** + * Schließt die USART Schnittstelle + * \throws USARTException + */ + void closeDevice(void); + + /** + * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden + * \throws USARTException + */ + void clearInputBuffer(void); + + /** + * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden + * \throws USARTException + */ + void clearOutputBuffer(void); + + /*************************************************/ + + + + /************************************* + * Methoden für die Datenübertragung * + *************************************/ + + /** + * Sendet ein Byte über die USART Schnittstelle + * \param b das zu sendende Byte + * \throws USARTException + */ + void writeByte(uint8_t b); + + /*************************************/ + + + + /*************************************** + * Methoden für einstellbare Parameter * + ***************************************/ + + /** + * Liefert die eingestellte Baudrate + * Änderungen werden erst nach einem open() wirksam + */ + uint32_t getBaudrate(void); + + /** + * Liefert den eingestellten Timeout (in Dezisekunden) + * Änderungen werden erst nach einem open() wirksam + */ + uint8_t getTimeout(void); + + /** + * Setzt die Baudrate + * Änderungen werden erst nach einem open() wirksam + */ + void setBaudrate(uint32_t baudrate); + + /** + * Setzt den Timeout (in Dezisekunden) + * Änderungen werden erst nach einem open() wirksam + */ + void setTimeout(uint8_t timeout); + + /***************************************/ + +private: + + std::string device; // Gerätepfad + int file_desc = -1; // Linux Dateideskriptor + uint32_t baudrate = 9600; + uint8_t timeout = 10; // in Dezisekunden +}; + + +#endif // USART_H diff --git a/drv/usart.o b/drv/usart.o new file mode 100644 index 0000000000000000000000000000000000000000..3039e2749303dcf076cc5859c77541dbc71808ec GIT binary patch literal 11208 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 literal 0 HcmV?d00001 diff --git a/drv/usartexception.h b/drv/usartexception.h new file mode 100644 index 0000000..840ce6c --- /dev/null +++ b/drv/usartexception.h @@ -0,0 +1,33 @@ +#ifndef USARTEXCEPTION_H +#define USARTEXCEPTION_H + +#include +#include + +// SOURCE: https://stackoverflow.com/a/8152888 + +class USARTException: public std::exception +{ +public: + explicit USARTException(const char* message) : msg(message) + { + } + + explicit USARTException(const std::string& message) : msg(message) + { + } + + virtual ~USARTException() throw () + { + } + + virtual const char* what() const throw () + { + return msg.c_str(); + } + +protected: + std::string msg; +}; + +#endif // USARTEXCEPTION_H diff --git a/main b/main index c5917ccca06462a154794fbe3efc6e33ae5f9b4a..da5b077944287e744153307d125209d98f62402d 100755 GIT binary patch literal 60672 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 literal 71568 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 i;mx>#*R;0<=R2Iv +#include +#include "drv/usart.h" #include "drv/b15f.h" #include "drv/plottyfile.h" @@ -35,9 +37,9 @@ void kennlinieErsterQuadrant() drv.analogWrite1(u_gs); drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); - drv.delay(10); + drv.delay_ms(10); drv.discard(); - drv.delay(10); + drv.delay_ms(10); for(uint16_t k = 0; k < sample_count+1; k++) { @@ -110,18 +112,34 @@ void beispielFunktionen() { B15F& drv = B15F::getInstance(); - /* + for(uint16_t i = 0; i < 256; i++) { drv.digitalWrite0(i); - drv.delay(50); - }*/ + drv.delay_ms(100); + } + + + + + while(1) + { + for(double d = 0; d < M_PI*2; d += .1) + { + uint16_t v = (sin(d) * 511 + 511); + drv.analogWrite0(v); + } + + } + + + uint16_t schwelle_unten = 1023; for(uint16_t i = 0; i < 1024; i++) { drv.analogWrite0(i); - drv.delay(1); + drv.delay_ms(1); if(drv.digitalRead0() & 0x01) { drv.discard(); @@ -142,7 +160,6 @@ void beispielFunktionen() for(uint16_t i = 1023; i > 0; i--) { drv.analogWrite0(i); - drv.delay(1); if(!(drv.digitalRead0() & 0x01)) { drv.discard(); @@ -165,7 +182,8 @@ void beispielFunktionen() int main() { - beispielFunktionen(); + USART usart("/dev/ttyUSB0"); + usart.openDevice(); diff --git a/main.o b/main.o index d3c8707461ab223ef335d4e5e9fbe4aabd959d1f..551fea66ebaf80c1bcaf47a9accb4654e132b981 100644 GIT binary patch delta 3932 zcmZ`+eQZtb&L1sRQGxxjO)Hc(Qdcz6vZa(wD$}M`)1(bbCMvNpmcTwbm1XRl``#Pp zx$2Q}?!CX?`MUSrdwp~A$n>7+kkZpA{a-eS-UexvRP@q%H76g31#k63-gsYc(;u|d zUwt>pKucdrU(?bHsX1AU-y0C%f*4HPlVnLcaBa7%v`dn9yB03~Y(3IK2Wb%1TlbS=LPYol?Fu66bZ9r=- z6lo7E(^4M{eXD;i!y$d?fe)^k!5S&kb6?IntxZK~x;R7oO$nyFjVl(%H@teB(M;i74-;R5UeEK$2Ob#4{SE)9hGfwEYI^H6wkBA zSNM=_g{V>oJC$tsOY1PNL~r=`@&fsNrF2*?<$XE zr_fBcioQcy2IZ<3ZbS>=w67S>s-5yE+))+z7;Gt0U zxPKNlGQ5TMUl;m>&utF`8Lm$5pxO}FIw z6WCX>cV@9f%gSvX7#v9)-Z45h6RQZ?+|2{SPY)*(BTw!hP7XG955Z#jO4u97E*u-) zBaJ3d?RaYQn!eunH?}^~1m{ZIO7uZfJQ0q+?S+Ljg2U!|yi?3rxbm;ch;oPF%Bkd_SB(wwbXL z7WN9Vd_`s~>{15%nT2f#S$!2_zf*C3=+9s~E$mbVJ8fZSku700pJZ$c+(vc{V^%64dx<@LTn`*$zb<0HUMX8tl#=0*jJ;#%^K_Osa!4s z8oS3?Yt46rvDFZ*wMIM*a;*Y~Y8?=%b;uVWfukSQT6d4M;z9g+xPtNd?wMw6BP=1? zgy!bn`q*IUPUThG?5>1SRS}MwXc$@e; zh><^CJY0qd5UJb|H$IFK5yf^WAD)W@c&>DOSRjXq{Iab{v%% f&j}U#Mc|Cp<(93&F3LQ_W9xE5VSQAI`?2(Y987Lu literal 16032 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 CNi_BV