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 7554439..0bd67cc 100644 Binary files a/drv/b15f.o and b/drv/b15f.o differ 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 58b46cd..1bc72df 100644 Binary files a/drv/usart.o and b/drv/usart.o differ diff --git a/main b/main index bb787b8..cbb09ce 100755 Binary files a/main and b/main differ