From cc1e5e927c1506cda6a0bc95de287827d1ebcda5 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Mon, 1 Apr 2019 15:15:46 +0200 Subject: [PATCH] bereite vereinigung vor --- drv/b15f.cpp | 20 +++++++-------- drv/b15f.o | Bin 27648 -> 27648 bytes drv/usart.cpp | 66 +++++++++++++++++++++++--------------------------- drv/usart.h | 7 +++--- drv/usart.o | Bin 30696 -> 29968 bytes main | Bin 61888 -> 61888 bytes 6 files changed, 44 insertions(+), 49 deletions(-) diff --git a/drv/b15f.cpp b/drv/b15f.cpp index 37ac3e6..f53d066 100644 --- a/drv/b15f.cpp +++ b/drv/b15f.cpp @@ -83,13 +83,13 @@ void B15F::reconnect() void B15F::discard(void) { - usart.clearOutputBuffer(); + usart.flushOutputBuffer(); for(uint8_t i = 0; i < 8; i++) { usart.writeByte(RQ_DISC); // sende discard Befehl (verwerfe input) delay_ms((16000 / BAUDRATE) + 1); // warte mindestens eine Millisekunde, gegebenenfalls mehr } - usart.clearInputBuffer(); + usart.flushInputBuffer(); } bool B15F::testConnection() @@ -147,7 +147,7 @@ std::vector B15F::getBoardInfo(void) bool B15F::digitalWrite0(uint8_t port) { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_BA0); usart.writeByte(port); @@ -157,7 +157,7 @@ bool B15F::digitalWrite0(uint8_t port) bool B15F::digitalWrite1(uint8_t port) { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_BA1); usart.writeByte(port); @@ -167,21 +167,21 @@ bool B15F::digitalWrite1(uint8_t port) uint8_t B15F::digitalRead0() { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_BE0); return usart.readByte(); } uint8_t B15F::digitalRead1() { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_BE1); return usart.readByte(); } bool B15F::analogWrite0(uint16_t value) { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_AA0); usart.writeInt(value); @@ -191,7 +191,7 @@ bool B15F::analogWrite0(uint16_t value) bool B15F::analogWrite1(uint16_t value) { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_AA1); usart.writeInt(value); @@ -201,7 +201,7 @@ bool B15F::analogWrite1(uint16_t value) uint16_t B15F::analogRead(uint8_t channel) { - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_ADC); usart.writeByte(channel); return usart.readInt(); @@ -212,7 +212,7 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset buffer_a += offset_a; buffer_b += offset_b; - usart.clearInputBuffer(); + usart.flushInputBuffer(); usart.writeByte(RQ_ADC_DAC_STROKE); usart.writeByte(channel_a); usart.writeByte(channel_b); diff --git a/drv/b15f.o b/drv/b15f.o index 7554439160cc22c4fd5b0496972bd0b962cf8b8c..0bd67ccf55b16a5bea1db8436d61cdc44067f8a5 100644 GIT binary patch delta 227 zcmZp;!PszvaYF_ZtA8`5NOb0gUQ$V zbQlvRv+yfRD0p--A9v;eo9WEM^&%8%=45+*aZMa1^adLsnb~=NU&7{k{!41CX*s3E Q8I!}z3?Qt{-Dahx042v$2><{9 delta 227 zcmZp;!PszvaYF_ZtAs~)xxnUJrny`oX0gCzeqMVBYjZHK8Ka+oNAnvFk52aw$K8K0 z0KqZ$KU^=~eft03qqo|?qt_H9_TnCh-+BK9h~v=>5)XFp=sfCSdA)=cCI~d>u)^f) zd^(H)lUewcB?LS=nU6bjfV3QQ=HYq~3N>@GJ-@gn4ikEV6_CvAyuUACb3OkhHP+;u S)Wo96VP*yp*5+=rQd0n;>QTc0 diff --git a/drv/usart.cpp b/drv/usart.cpp index 70e738e..b120c68 100644 --- a/drv/usart.cpp +++ b/drv/usart.cpp @@ -24,8 +24,8 @@ void USART::openDevice(std::string device) if(code) throw USARTException("Fehler beim Setzen der Geräteparameter"); - clearOutputBuffer(); - clearInputBuffer(); + flushOutputBuffer(); + flushInputBuffer(); } void USART::closeDevice() @@ -35,14 +35,14 @@ void USART::closeDevice() throw USARTException("Fehler beim Schließen des Gerätes"); } -void USART::clearInputBuffer() +void USART::flushInputBuffer() { int code = tcflush(file_desc, TCIFLUSH); if(code) throw USARTException("Fehler beim Leeren des Eingangspuffers"); } -void USART::clearOutputBuffer() +void USART::flushOutputBuffer() { int code = tcflush(file_desc, TCOFLUSH); if(code) @@ -112,31 +112,17 @@ int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) { - buffer += offset; uint8_t crc; uint8_t aw; - uint16_t us_per_bit = (1000000 / baudrate) * 16; - uint8_t block_end = BLOCK_END; + const uint16_t us_per_bit = (1000000 / baudrate) * 16; + const uint16_t n_total = len + 3; do - { - crc = 0; - - // send block length - int n_sent = write_timeout(&len, 0, 1, us_per_bit); - if(n_sent != 1) - throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); - - // send block - n_sent = write_timeout(buffer, 0, len, us_per_bit * len); - if(n_sent != len) - throw std::runtime_error("fatal (send #2): " + std::to_string(n_sent)); - + { // calc crc + crc = 0; for(uint8_t i = 0; i < len; i++) - { - usleep(us_per_bit); - + { crc ^= buffer[i]; for (uint8_t k = 0; k < 8; k++) { @@ -145,22 +131,30 @@ void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) crc >>= 1; } } + + // construct block + block_buffer[0] = len; + std::memcpy(&block_buffer[1], buffer + offset, len); + block_buffer[len + 1] = crc; + block_buffer[len + 2] = BLOCK_END; - n_sent = write_timeout(&crc, 0, 1, us_per_bit); - if(n_sent != 1) + // send block + int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total); + if(n_sent != n_total) throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); - usleep(us_per_bit); - - n_sent = write_timeout(&block_end, 0, 1, us_per_bit); - if(n_sent != 1) - throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); - usleep(us_per_bit); + flushOutputBuffer(); + usleep(1000); + + // check response int n_read = read_timeout(&aw, 0, 1, us_per_bit); - if(n_read < 0) + for(uint8_t i = 0; i < 10 && n_read != 1; i++) { - std::cout << "WARNING: read error, retry..." << std::endl; - n_read = read_timeout(&aw, 0, 1, us_per_bit); + flushOutputBuffer(); + flushInputBuffer(); + std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl; + usleep(1000000); + n_read = read_timeout(&aw, 0, 1, us_per_bit * 2); } if(n_read == 0) @@ -178,11 +172,11 @@ void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) else if(n_read != 1) throw std::runtime_error("fatal: " + std::to_string(n_read)); - clearInputBuffer(); + flushInputBuffer(); } while(aw != 0xFF); - std::cout << "OK" << std::endl; + //std::cout << "OK" << std::endl; } uint8_t USART::readByte(void) diff --git a/drv/usart.h b/drv/usart.h index 36a0c33..006ffef 100644 --- a/drv/usart.h +++ b/drv/usart.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -36,13 +37,13 @@ public: * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gelesen wurden * \throws USARTException */ - void clearInputBuffer(void); + void flushInputBuffer(void); /** * Verwirft Daten, die bereits im Puffer liegen, aber noch nicht gesendet wurden * \throws USARTException */ - void clearOutputBuffer(void); + void flushOutputBuffer(void); /*************************************************/ @@ -126,7 +127,7 @@ private: uint32_t baudrate = 9600; int TEST = 0; uint8_t timeout = 10; // in Dezisekunden - uint8_t buffer[MAX_BLOCK_SIZE + 3]; + uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; }; diff --git a/drv/usart.o b/drv/usart.o index 58b46cd09bf86da9ca04dd939eced03bd8dc44c6..1bc72dfc2554d7f560d7878a84c354469e48f305 100644 GIT binary patch delta 8404 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 Htr+pYIZ#4E delta 9084 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 PJf-ENi;6DXsMh=s?A~G1 delta 13958 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