From 93f22136c773468f78dc7132d5ca6033c648a4ba Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Tue, 26 Mar 2019 13:28:29 +0100 Subject: [PATCH] =?UTF-8?q?Verbindung=20zuverl=C3=A4ssiger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drv/b15f.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++---- drv/b15f.h | 25 +++++++++------ drv/b15f.o | Bin 13096 -> 17576 bytes main | Bin 20368 -> 20128 bytes 4 files changed, 98 insertions(+), 15 deletions(-) diff --git a/drv/b15f.cpp b/drv/b15f.cpp index a6ace00..fc4ef28 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -8,24 +8,52 @@ B15F::B15F() void B15F::init(void) { + + std::cout << PRE << "Stelle Verbindung mit Adapter her... "; int code = system(std::string("stty 38400 -F " + SERIAL_DEVICE).c_str()); if(code) { throw DriverException("Konnte serielle Verbindung nicht initialisieren. Ist der Adapter angeschlossen?"); } - usart.open(SERIAL_DEVICE.c_str()); + usart = open(SERIAL_DEVICE.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + struct termios options; + tcgetattr(usart, &options); + options.c_cflag = baudrate | CS8 | CLOCAL | CREAD; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + options.c_cc[VTIME]=30; + tcsetattr(usart, TCSANOW, &options); + tcflush(usart, TCIFLUSH); - if(!testConnection()) + std::cout << "OK" << std::endl; + + + // Verbindungstest muss dreimal erfolgreich sein + std::cout << PRE << "Teste Verbindung... "; + for(uint8_t i = 0; i < 3; i++) { - throw DriverException("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); + if(!testConnection()) + { + throw DriverException("Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?"); + } } + std::cout << "OK" << std::endl; + + writeByte(0xFF); + writeByte(0x01); + writeByte(0x02); + std::cout << readByte() << std::endl; + std::cout << readByte() << std::endl; } bool B15F::testConnection(void) { + // erzeuge zufälliges Byte srand (time(NULL)); uint8_t dummy = rand() % 256; + writeByte(0); // echo / dummy command for testing writeByte(dummy); @@ -37,17 +65,65 @@ bool B15F::testConnection(void) void B15F::writeByte(uint8_t b) { - usart.put(b); + if(write(usart, &b, 1) != 1) + throw DriverException("Fehler beim Senden."); +} + +void B15F::writeInt(uint16_t v) +{ + // static_cast(static_cast(&x)); + writeByte((v >> 8) & 0xFF); + writeByte((v >> 0) & 0xFF); +} + +void B15F::writeLong(uint32_t v) +{ + writeByte((v >> 24) & 0xFF); + writeByte((v >> 16) & 0xFF); + writeByte((v >> 8) & 0xFF); + writeByte((v >> 0) & 0xFF); } uint8_t B15F::readByte() { char b; - while(1) + auto start = std::chrono::steady_clock::now(); + auto end = start; + uint16_t elapsed = 0; + while(elapsed < timeout) { - if (usart.get(b)) + int n = read(usart, &b, 1); + if (n > 0) return static_cast(b); + /*else if(n < -1) + { + std::string msg = "Fehler bei der seriellen Verbindung. (Code: "; + msg += std::to_string(n); + msg += ")"; + throw DriverException(msg); + }*/ + + end = std::chrono::steady_clock::now(); + elapsed = std::chrono::duration_cast(end - start).count(); } + + if(elapsed >= timeout) + throw DriverException("Verbindung unterbrochen. (timeout)"); +} + +uint16_t B15F::readInt() +{ + return readByte() << 8 | readByte(); +} + +uint32_t B15F::readLong() +{ + return readByte() << 24 | readByte() << 16 | readByte() << 8 | readByte(); +} + +void B15F::sleep(uint16_t ms) +{ + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); } B15F& B15F::getInstance(void) diff --git a/drv/b15f.h b/drv/b15f.h index bd50299..2294934 100644 --- a/drv/b15f.h +++ b/drv/b15f.h @@ -6,17 +6,14 @@ #include #include #include +#include #include -/*#include -#include -#include #include -#include */ - +#include +#include #include "driverexception.h" - class B15F { private: @@ -24,17 +21,27 @@ private: public: void init(void); bool testConnection(void); - void writeByte(uint8_t); - uint8_t readByte(void); + + inline void writeByte(uint8_t); + inline void writeInt(uint16_t); + inline void writeLong(uint32_t); + inline uint8_t readByte(void); + inline uint16_t readInt(void); + inline uint32_t readLong(void); + + void sleep(uint16_t); static B15F& getInstance(void); private: - std::fstream usart; + int usart = -1; + uint32_t baudrate = 38400; + uint16_t timeout = 1000; static B15F* instance; // CONSTANTS + const std::string PRE = "[B15F] "; const std::string SERIAL_DEVICE = "/dev/ttyUSB0"; constexpr static uint8_t MSG_OK = 0xFF; constexpr static uint8_t MSG_FAIL = 0xFE; diff --git a/drv/b15f.o b/drv/b15f.o index b886f7c70c229a0605ee9b613c1439c9d5d1fffa..54c9087ccfd7ed3d2ba1e836d646371bba4a95ee 100644 GIT binary patch literal 17576 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 diff --git a/main b/main index e128c81e1bab68060c737aff2445a404cad507ef..02f913e5415c2e272d4f7acc6bf3ee939bd4d5f4 100755 GIT binary patch literal 20128 zcmcg!4SZD9mB0BIh1$iC#kfMs7s{fBadEWqLMPEaDeiW zt;#1k3##ylq^HOrgo=!Eh4W+{vYC`d}O6q?`E z+bP~Nm$T#OP7`L5%6xx^d}QZ`4PGI*MwI8|mr>ytNo6}M=!&*2u3XU7KEEp(>)kSc zOZDRUiz|J}xNjk^H|ZzYhSh6%Nu)-&f~QXhPZ*_t{+2JU|N83qr4QF!96q+_zTaN_ ziDx#G>;nABc4N$scrnKSv&8nMnP={pQcLlC;d20|_6^+)A-0|&+86&+5!KO1HQunf7zj4 zw>!u`dP?z^8@}dH?yC-ZjyvF04)(n2 zpuZc27+*hy{rUVx^H4r}mO9`xTji_oFJRAX z=4K=3LjVD0^U#P$DVxC*zruMh?BD_OV^VJqUvv@8iHn)0ZS0Q6w4@$N=$gi~#@1C@ zdn6Ir7)|PtMC+>Bu6Qic8fxo`m}&V_u3p`uS4ZPXtu2&{R5r$VS*aN^?^m&Ds6MLJrYBDRHve@ZtrR)(xQ_Ny)zNttaU|V8}&{tl1Ri8 z%_~tH$_Z(quC91Eq(`*KmT;s;kH%v>TVS!K#glp>66%K1WF(ehsiisAe=Qr5jtdR=-x?vRG?g*|JFM;@T=BvG%UNSpl-blZ(T!J{Di3UAZu@ z5X}&3-wKb!!`Cm0#W!c_+702>#uj~vwHnBMG52O55Ljqhi7G{78}pgc5~2!SoQR;Z znfsgqa7wQntNU&6EH*Dd76eFPhppgBW5J@8pQ+KCK_ZN@Ke zE^drz+7fA6S9~MYz zs-vqn*@^mNd~FPewImI%0MpjSHb-Oa+L}nRw>v_KVRPIi6QNi;i-ltGWLG58!}KVU z(f9RG_{z{W0Nwd>Xemp5tw-y)xtu}LkoWx~W&h?$N46$@I3 z)pjBO=K?YzgBAgs$V$MU!6xxsE;gB`79y{UuhFL#-wnu_3|V!1EWguLxeB zcNdoYh3sMQ6y$zF?gK{7GVuzrZ;*J8*kAc`@LdA0&cTO-9yJH=6nt|Ie*Ap1+;us) zQf}fKa_~_h-;;y;#Xh7&Jl~}Kl9%O^&(FmlwGo9aLJ#3$OUCh$1q!FMSDDCT=FiI( z`~nL;YQZnG;D!YkTQi<|+=9=y$e*&{J`3&@^&&fkYj~=Bp3`>FZ;}6&PvIQdPI+Y5 zZNbg{Zl>(D;ON$wFl@m^*WqbDvEZ4lC{ji&xOJcRvIUoILyAT%I0i^27#4g|24(EH z1;+r$gi{uLN(Mzl_>=rF)q>V#x6%)q;y5$MI$h{&A@Ube#n+v)~&n_}Lb`(}K^i;5`<6rUl<(!R5OU zO764Z=UC)#x8SrEmtn|)D-s0VVZmov@Ld*swgvx|1s78WPu*?7=UC+TT5vIy@YG=o zUSW~{i3Oi$!PWk^O4I>Y)j0}Nw-4)uV0!?ABc6t4dN=34Pdp9D^e)anOgs(6^bqGCAfAR`x{vc; zCZ2{tx`*?35l=%gy@B&zAfAR`x|#EzBc6s{x`y*N5>G=e?dN=gcp7SHh4X(;JPon5 zm-B7JyNPF>i+`q3h|?ye~x(S z+UXI_KTSM!>GUw?_YqHBIlY_n-zT0P1?gR!e;9nn5O^M_9~xJ|{c7rv;XyZ22dj3% z+v?!5=OMU{8s0bw!vG8eFkXR@z%cKu)IS05g9Er4YJYWL*$og=2hY5bld7FO^*~8_ zA(V6sLH<4|Pwfx+pecX3DSwlcFXZxpw;NN>U#F&CSNnf+yt%b$&~*fTLmix&PwSADGp*D5>*l35(bKW*y|MmN+ z7FizopC`e=s^>t~s`EZTe)XvjiqzC`^(o^rwcw!o{0Dj&6y7QnP9cR(`udjL2Qygj z0=0kH0%U+n*fRyyz8aj-jY=9Ss&LRnZYv;j`pB?%_CqD=L*nbx9gr}2buU$z-NV?v z73�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 WTq#TMobu%#t~Vvl$;ptzvi||gi*Q>2 literal 20368 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 VE@QO!RxbZND@}>BY#D5<@_%3ulJfun