Не могу написать, чтобы открыть QSerialPort с помощью socat

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

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

Я открываю виртуальный порт через сокат:

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 учебный класс. б true так QSerialPort смог открыть порт. Но когда я хочу отправить data Я получаю следующую информацию:

QIODevice::write (QSerialPort): device not open

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

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

РЕДАКТИРОВАТЬ:
После первого (нет) -ответа от code_fodder я сделал то, что он мне сказал, и добавил цикл for 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"); вернуть истину?

Как я только что сказал, должно быть что-то связанное с сокатом …

0

Решение

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

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

Вы пытались использовать функции 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, может быть … ,

1

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

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

0

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