Pobieranie danych z urządzenia i błąd segmentacji pamięci

0

Witam,
Piszę aplikację na linuxie w qt 5.11 do komunikacji z urządzeniem w c++. Napisałem już bibliotekę do obsługi urządzenia.
Do transferu danych używam cyusb_control_transfer();
Na początku przetestowałem program w wersji konsolowej i wszystko działa jak należy, dopiero przy implementacji funkcji do okna QT pojawiają się problemy.
Okno graficzne stworzyłem w kreatorze ui.
W oknie jest graphicsView i jeden button. Dodałem do niego taką funkcję:

void window::on_ButtonStart_clicked()
{
    drawDataOnScreen();
}

Draw data function:

void window::drawDataOnScreen()
{
    m_chart = new QChart;
    m_chart->setMinimumSize(721, 301);
    m_chart->setMaximumSize(721, 301);
    m_chart->legend()->hide();

    QLineSeries *series = new QLineSeries;

    cyusb_handle *h;
    h = cyusb_gethandle(0);
    globalResetAllDeviceRegister(h);
    switchONDevice(h);

    unsigned short len = packetLengthRegister(h);
    unsigned int *source = sourceFromPacket(h, len);

    for(int i=0; i<1; i++)
    {
        series->append(0.001*i, source[i+54]);
    }

    delete[] source;

    switchOFFDevice(h);
    globalResetAllDeviceRegister(h);
    closeDevices();

    m_chart->addSeries(series);
    m_chart->createDefaultAxes();
    m_chart->setAcceptHoverEvents(true);

    scene->addItem(m_chart);
}

Kiedy debuguję program dostaję taki błąd:

Signal from system: SIGSEGV
Meaning of signal: Segmentation fault

I mój program zatrzymuje się w pierwszym napotkanym transferze danych.

unsigned char *databuff = new unsigned char[2];

if(cyusb_control_transfer(h, 0x02, 0x04, 0, 0, databuff, 0, TIME_OUT)) //dokładnie tutaj, rejestry są dobrze, a nie muszę nic przesyłać bo jest to reset urządzenia 
        return 1;

Nie wiem co jest nie tak skoro wszystko działało w wersji konsolowej. Nie mam już pomysłów na sprawdzenie co może być nie tak.

0

Może ta funkcja spodziewa się bufora zaalokowanego za pomocą malloc?

0

Ale w konsoli mam tak samo i nie wyrzuca błędu, nie używam mallcoka.

0

A co z parametrem h, widzę, że jest to wskaźnik: cyusb_handle *h - z nim nie ma problemu?
Jesteś w stanie sprawdzić jakie są wartości parametrów w chwili wywołania?

0

No właśnie nie.
Nie wiem co się stało, ale z 5 razy dokładnie zdebugowałem program, ustawiłem więcej pułapek i nagle zaczęło działać, a nic w kodzie nie zmieniłem.

0

Przy każdym kliknięciu w button musisz na nowo tworzyć QChart, QLineSeries?
No i ta pętla taka trochę mało przydatna

for(int i=0; i<1; i++)
    {
        series->append(0.001*i, source[i+54]);
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1