1

C++ を使用して ttyUSB0 からデータを読み取る際に問題があります。ttyUSB0 からブロッキング モードでデータを読み取る独自のスレッドがあります。単一の文字のみを読み取ると、データは固定ブロックで到着します(ナイスボットではありません)。これは、USB から UART へのコンバーターの FTDI チップからの内部バッファーである可能性があります。しかし、複数の文字を読み取ろうとすると、ブロックが 0 個しか表示されません。read または init コマンドにエラーはありません。この問題を解決する方法を知っている人はいますか。

送信: dfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfsfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf

受け取る:

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;
}

誰かがこのようなことをすでに経験しているといいでしょう。ありがとう

4

1 に答える 1

1

2 つのバグがあります。

まず、このコード:

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

バッファ自体ではなく、バッファのアドレスが格納されている場所に読み込みます。

第 2 に、away の結果を破棄する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);
于 2012-12-10T13:39:47.450 に答える