无法使用 socat 写入打开 QSerialPort
Can not write to open QSerialPort using socat
我有一个 Class Serial
,我可以在其中通过成员函数 Serial::openPort()
和 private 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;
}
我打开一个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);
所以我想要的是我可以通过打开端口 pts/3
将 data
发送到 pts/2
Serial
[=52] QSerialPort
=]. b 是 true
所以 QSerialPort
能够打开端口。但是当我想发送 data
时,我得到以下信息:
QIODevice::write (QSerialPort): device not open
我认为这个问题一定与使用错误的socat有关,因为我们已经用RSR232电缆和另一台计算机测试了代码。
感谢您的帮助。
编辑:
在 code_fodder 的第一个(否)回答之后,我按照他告诉我的去做,并在我的 initTestCase()
:
中添加了一个 for 循环
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");
return 是真的?
就像我刚才说的,它一定与socat有关...
不一定是答案
但是需要这个space来添加一个例子。
您是否尝试过使用 Qt 函数来确定哪些端口可用?这是我用来查找USB串行端口的函数示例(循环使用c++11,如果需要可以转换为back)...
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 工具也许...
问题是 class Serial 中的一个函数 filterPorts()
关闭了打开的端口并在测试中被调用 class
我有一个 Class Serial
,我可以在其中通过成员函数 Serial::openPort()
和 private 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;
}
我打开一个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);
所以我想要的是我可以通过打开端口 pts/3
将 data
发送到 pts/2
Serial
[=52] QSerialPort
=]. b 是 true
所以 QSerialPort
能够打开端口。但是当我想发送 data
时,我得到以下信息:
QIODevice::write (QSerialPort): device not open
我认为这个问题一定与使用错误的socat有关,因为我们已经用RSR232电缆和另一台计算机测试了代码。
感谢您的帮助。
编辑:
在 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");
return 是真的?
就像我刚才说的,它一定与socat有关...
不一定是答案
但是需要这个space来添加一个例子。
您是否尝试过使用 Qt 函数来确定哪些端口可用?这是我用来查找USB串行端口的函数示例(循环使用c++11,如果需要可以转换为back)...
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 工具也许...
问题是 class Serial 中的一个函数 filterPorts()
关闭了打开的端口并在测试中被调用 class