2016-03-06 118 views
0

我有一個類Serial中,我可以通過成員函數Serial::openPort()打開一個端口與私人QSerialPort serial_stream無法寫入使用打開QSerialPort socat

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

所以,我想的是,我可以通過開放與QSerialPortSerial類發送datapts/2端口pts/3。 b是true因此QSerialPort能夠打開該端口。但是,當我想送data我得到以下信息:

QIODevice::write (QSerialPort): device not open 

我認爲這個問題必須是與使用socat錯誤的,因爲我們媒體鏈接與RSR232電纜和另一臺計算機測試的代碼。

會感謝你的幫助。

編輯: 後從code_fodder第一(無)-answer我做了什麼,他告訴我這樣做,在我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");返回true?

就像我剛纔說的,它必須有一些待辦事項與socat ...

回答

0

的問題是一個功能filterPorts()類中的串行其關閉打開的端口,被稱爲在識別TestClass

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