2016-03-06 6 views
0

У меня есть класс Serial, в котором я могу открыть порт с помощью функции члена Serial::openPort() с частным QSerialPort serial_stream:Невозможно записать, чтобы открыть QSerialPort с помощью Сокат

bool Serial::openPort(std::string port) 
{ 
    std::string realPort = "/dev/" + port; 
    if(isOpen()) { 
     return true; 
    } 
    serial_stream.setPortName(QString(realPort.c_str())); 
    bool loc = serial_stream.open(serial_stream.ReadWrite); 
    serial_stream.setFlowControl(serial_stream.HardwareControl); 
    serial_stream.setStopBits(serial_stream.OneStop); 
    serial_stream.setParity(serial_stream.NoParity); 
    serial_stream.setDataBits(serial_stream.Data8); 
    serial_stream.setBaudRate(defaultBaud); 
    open = loc; 
    return loc; 
} 

и метод отправки:

bool Serial::send(unsigned char data[]) 
{ 
    if(!isOpen()) { 
     return false; 
    } 
    int size = BUFFER_SIZE; 
    char loc[size]; 
    for(int p = 0; p<size; p++) { 
     loc[p] = data[p]; 
    } 
    int check = serial_stream.write(loc, size); 
    if(check != size) { 
     return false; 
    } 
    return true; 
} 

я открыть virtual port via socat:

Terminal 1: socat -d -d pty,raw,echo=0 pty,raw,echo=0 
Terminal 2: cat < /dev/pts/2 

Тогда в качестве тестовой функции я делаю следующее:

bool b = Serial::instance().openPort("pts/3"); 
cout << b << endl;//-> "true" 
unsigned char data[8] = {'a','b','c','d','e','f','g','h'}; 
bool sent = Serial::instance().send(data); 

Так что я хотел, чтобы я мог отправить data в pts/2 через открыть порт pts/3 с QSerialPort в Serial классе. b - true, поэтому QSerialPort смог открыть порт. Но когда я хочу отправить data я получаю следующую информацию:

QIODevice::write (QSerialPort): device not open 

Я думаю, этот вопрос должен иметь что-то сделать с помощью SOCAT неправильно, потому что мы Allready протестировали код с RSR232-кабелем и другим компьютером.

Будем благодарны за помощь.

EDIT: После первой (нет) -ответ от code_fodder я сделал то, что он сказал мне, чтобы сделать и добавил цикл в моей initTestCase():

void tst_serial::initTestCase() { 
    cout << "Testfälle gestartet" << endl; 
    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); 
    cout << "for: " << ports.count() << endl;//-> for: 0 
    for (int n=0; n > ports.count(); n++) 
    { 
     cout << ports[n].portName().toStdString() << ports[n].description().toStdString() << endl; 
    } 
} 

Как я заметил, количество доступных портов 0 (ожидайте, что это не правильный способ сделать это). Но почему Serial::instance().openPort("pts/3"); верно?

Как я только что сказал, он должен иметь что-то TODO с SOCAT ...

ответ

0

Проблема была функция filterPorts() в классе Serial, который закрыл открытый порт и был вызван в тестовом классе

1

не обязательно ответа

Но нужно это пространство, чтобы добавить пример.

Вы пытались использовать функции Qt, чтобы определить, какие порты доступны? Вот пример функции, которую я использую, чтобы найти USB последовательные порты (цикл использует C++ 11 можно преобразовать обратно, если вам нужно) ...

QList<QString> QSerialComs::getUsbSerialPortsList() 
{ 
    QList<QString> usbSerialPorts; 
    for (auto serialPortInfo: QSerialPortInfo::availablePorts()) 
    { 
     qDebug() << "Port" << serialPortInfo.portName() 
       << "Desc: " << serialPortInfo.description() 
       << endl; 

     if (serialPortInfo.description().contains("USB")) 
     { 
      usbSerialPorts.append(serialPortInfo.portName()); 
     } 
    } 

    return usbSerialPorts; 
} 

Важной частью здесь, чтобы распечатать все имена портов и описания, чтобы вы могли видеть, какие порты доступны для вас ... Я нахожу это полезным при настройке серийных компьютеров, вы можете использовать его, чтобы подтвердить свой инструмент socat, возможно ...

+0

Я добавил его в вопрос, спасибо ... – goulashsoup

 Смежные вопросы

  • Нет связанных вопросов^_^