block senden stabil

This commit is contained in:
Tristan Krause 2019-04-01 08:36:45 +02:00
parent 6dd836c729
commit 8dcd24adbd
7 changed files with 73 additions and 22 deletions

View file

@ -8,7 +8,7 @@ COMPILER_PATH = g++
OUTPUT = main
CFLAGS = -std=c++14 -O3
CFLAGS = -std=c++14 -O3 -Wall -Wextra
LDFLAGS =
OBJECTS = main.o drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o

View file

@ -27,6 +27,13 @@ void B15F::init()
std::cout << "OK" << std::endl;
// Temporärer Test
uint8_t block[] = {0, 1, 2, 3};
while(1)
usart.writeBlock(&block[0], 0, sizeof(block));
throw std::runtime_error("SCHLUSS");
std::cout << PRE << "Teste Verbindung... " << std::flush;
uint8_t tries = 3;

Binary file not shown.

View file

@ -53,7 +53,14 @@ void USART::writeByte(uint8_t b)
{
int sent = write(file_desc, &b, 1);
if(sent != 1)
throw USARTException("Fehler beim Senden: writeByte()");
{
std::cout << "WARNUNG: Fehler beim Senden (" << sent << "): writeByte(), wiederhole..." << std::endl;
usleep(100000);
sent = write(file_desc, &b, 1);
if(sent != 1)
throw USARTException("Fehler beim Senden: writeByte()");
}
}
void USART::writeInt(uint16_t d)
@ -66,33 +73,69 @@ void USART::writeInt(uint16_t d)
void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len)
{
buffer += offset;
uint8_t crc = 0;
uint8_t crc;
uint8_t aw;
writeByte(len);
while(len--)
do
{
writeByte(*buffer);
crc = 0;
writeByte(len);
crc ^= *buffer;
for (uint8_t i = 0; i < 8; i++)
for(uint8_t i = 0; i < len; i++)
{
if (crc & 1)
crc ^= CRC7_POLY;
crc >>= 1;
writeByte(buffer[i]);
usleep((1000000 / baudrate) * 16);
crc ^= buffer[i];
for (uint8_t k = 0; k < 8; k++)
{
if (crc & 1)
crc ^= CRC7_POLY;
crc >>= 1;
}
}
writeByte(crc);
usleep((1000000 / baudrate) * 16);
writeByte(0x80); // Stoppzeichen für Block
usleep((1000000 / baudrate) * 16);
int code = read(file_desc, &aw, 1);
if(code < 0)
{
std::cout << "WARNING: read error, retry..." << std::endl;
usleep(100000);
code = read(file_desc, &aw, 1);
}
buffer++;
}
if(code == 0)
{
std::cout << "timeout info" << std::endl;
for(uint8_t i = 0; i < MAX_BLOCK_SIZE; i++)
{
std::cout << "i: " << (int) i << std::endl;
sleep(1);
writeByte(0x80); // Stoppzeichen für Block
code = read(file_desc, &aw, 1);
if(code == 1)
{
std::cout << "YO HO" << std::endl;
std::cout << "aw: " << (int) aw << std::endl;
i = 0xFF;
}
}
}
else if(code != 1)
throw std::runtime_error("fatal: " + std::to_string(code));
writeByte(crc);
writeByte(0x80); // Stoppzeichen für Block
uint8_t aw = readByte();
if(aw != 0xFF)
{
std::cout << "Ende Gelände" << std::endl;
clearInputBuffer();
}
while(aw != 0xFF);
std::cout << "OK" << std::endl;
}
uint8_t USART::readByte(void)

View file

@ -122,7 +122,8 @@ private:
int TEST = 0;
uint8_t timeout = 10; // in Dezisekunden
constexpr static uint8_t CRC7_POLY = 0x91;
constexpr static uint8_t CRC7_POLY = 0x91;
constexpr static uint8_t MAX_BLOCK_SIZE = 16;
};

Binary file not shown.

BIN
main

Binary file not shown.