Читайте от ttyUSB0 в собственной теме

У меня проблемы с чтением данных из ttyUSB0 с использованием C ++. У меня есть собственный поток чтения данных в режиме блокировки от ttyUSB0. Когда я читаю только отдельные символы, данные поступают в фиксированных блоках (не очень хороший бот). Это может быть некоторый внутренний буфер от микросхемы FTDI на моем конвертере USB в UART. Но если попытаться прочитать больше одного символа, я получу только ноль блоков. Нет ошибок в командах чтения или инициализации. У кого-нибудь есть идеи, как решить эту проблему.

Отправить: dfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfsfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf

Получать:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Вот мой код

void BoardCommunicator::execute()
{
connection.openCon();
uint8_t buffer[16] = {0};
while(true)
{
//  unsigned char b = connection.readByte();
if(connection.readBlock(buffer,16) == 0)
std::cout << "EOF" << std::endl;
else
for(uint32_t i = 0; i < 16; i++)
std::cout << (int)buffer[i] << " ";
std::cout << std::endl;
}
}

void SerialConnection::openCon()  throw (SerialPortOpenException&)
{
conHandler = open(udevFileName , O_RDWR | O_NOCTTY);// | O_NDELAY | O_NONBLOCK);
if (conHandler < 0)
throw SerialPortOpenException("Can not open given comport");

cfsetispeed(&port_settings, B2000000);    // set baud rates
port_settings.c_cflag = B2000000 | CS8 | CREAD | CLOCAL;
port_settings.c_iflag = IGNPAR;
port_settings.c_oflag = 0;
port_settings.c_lflag = 0;
if(tcsetattr(conHandler, TCSANOW, &port_settings) < 0)
throw SerialPortOpenException("Was not able to aply settings to serail link.");// apply the settings to the port
}
//Does not work at all. Receives only zeros! Why?
int SerialConnection::readBlock(uint8_t* buffer, uint32_t size)
{
if(buffer == NULL)
throw IllegalArgumentException("Can not read a block to null buffer");

for(uint32_t index = 0; index < size; index++)
buffer[index] = 0;
int result;
do{
result = read(conHandler, &buffer, size);
} while (errno == EINTR );
if(result < 0)
throw ReadBlockException("Can not read from serial link.");
return result;
}
//Works only in blocking mode and data arrives in fixed sized blocks
uint8_t SerialConnection::readByte() const throw (ReadByteException&)
{
int result = 0;
uint8_t data = 0;
do //Check if read waked up by any signal
{
result = read(conHandler, &data, 1);
} while (errno == EINTR || errno == 11);
std::cout << errno <<std::endl;
if(result < 0)
throw ReadByteException("Can not read from serial link.");
return data;
}

Было бы неплохо, если бы кто-то уже имел опыт работы с этим материалом.
Спасибо

1

Решение

У вас есть две ошибки.

Во-первых, этот код:

    result = read(conHandler, &buffer, size);

Вы читаете в место, где адрес буфера хранится, а не сам буфер.

Во-вторых, вы бросаете результаты read прочь, так что вы не представляете, сколько байтов вы прочитали. Если код предназначен для чтения именно так size байты, вам нужно сделать что-то вроде этого:

    int total_read = 0;
do
{
result = read(conHandle, buffer + total_read, size - total_read);
if (result <= 0) return result;
total_read += result;
}
while (total_read < result);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]