gpt4 book ai didi

c++ - 如何将数据发送到QT中打开的tty0tty空调制解调器仿真器端口

转载 作者:行者123 更新时间:2023-11-28 00:03:46 24 4
gpt4 key购买 nike

我已经通过QSerialPort打开了到使用tty0tty nullmodem仿真器创建的仿真串行端口的工作连接,并且可以向其中写入数据:

QSerialPort serial_stream;
...
serial_stream.setPortName(QString("/dev/tnt0"));
bool loc = serial_stream.open(serial_stream.ReadWrite)
...
serial_stream.write(buf);


我打开一个终端并通过“ screen”连接到已连接的(在本例中为tnt1)tnt端口(例如tnt0 <-> tnt1已连接):

screen /dev/tnt1


当我执行程序时,在屏幕上会得到预期的输入(此处为“ buf”)。但是如何将数据发送回Qt中打开的端口,以便可以执行以下操作来读取数据:

int size = serial_stream.bytesAvailable();
QByteArray data = serial_stream.read(size);


我已经尝试通过“睡眠”来停止程序...:

#include <unistd.h>
...
usleep(15*1000000);


...并像这样发送数据:

echo “TEXT“ > /dev/tnt1


但这行不通。我很高兴您的帮助!

最佳答案

使用QSerialPort使用tty0tty - null modem emulator (v1.2)发送/读取数据

 1.建立tty0tty-connections:

有两种方式可以建立tty0tty连接(在两个虚拟端口之间)。两种方式都可能需要kernel header files。对于2.,绝对有必要,否则error while make是不可避免的。

(1.)简短的方法:


下载并解压缩tty0tty(标题中的第一个链接)。
打开一个终端,然后cd[Path to tty0tty-folder]/tty0tty/pts
执行sudo ./tty0tty


然后应该显示两个连接的pseudo terminal slaves


  (/dev/pts/X) <=> (/dev/pts/Y),带有X,Y变量。


(2.)更长的途径(但或多或少是永久的):


遵循此Installation guide


跨靴的持久性可能无法正常工作,因此在重新启动后有必要重复安装指南的以下部分:


加载模块


sudo depmod
sudo modprobe tty0tty

为新的串行端口(native terminal devices)授予适当的权限


sudo chmod 666 /dev/tnt*



执行ls /dev/tnt*后,将显示端口列表:


  /dev/tnt0 ... /dev/tnt7


 2.测试tty0tty-connection是否有效(可选):

可以使用cat测试连接:


打开一个终端[1],然后显示一个伪/本机终端设备的输出:


(1。)cat /dev/pts/X或(2。)cat /dev/tnt0

打开另一个终端[2]并写入此伪/本机终端设备:


(1。)echo "message" > /dev/pts/Y或(2。)echo "hello" > /dev/tnt1



输出应显示在端子[1]中:


  message


附加信息:要停止猫按:Ctrl + Z

 3.在Qt项目中使用QSerialPort打开终端设备作为端口:


将串行端口引用添加到[projectname].pro文件中的Qt-specific configuration options


  QT += serialport


附加信息:允许将所有引用放在一行中:


  即QT+= core gui serialport ...

在所需的[name].h文件中添加所需的header file


  #include <QtSerialPort/QSerialPort>

添加两个QSerialPort对象,通过void QSerialPort::setPortName(const QString &name)设置终端设备的路径,并以所需的权限(bool QSerialPort::open(OpenMode mode)ReadOnlyWriteOnly)通过ReadWrite打开端口。例:

    std::string tty0ttyPort1 = "/dev/tnt0";// or = "/dev/pts/X
std::string tty0ttyPort2 = "/dev/tnt1";// or = "/dev/pts/Y
QSerialPort qport1;
QSerialPort qport2;
qport1.setPortName(QString(tty0ttyPort1.c_str()));
bool isOpen1 = qport1.open(qport1.ReadWrite);//Read and Write permission
std::cout << "isOpen1: " << isOpen1 << std::endl;
qport2.setPortName(QString(tty0ttyPort2.c_str()));
bool isOpen2 = qport2.open(qport2.ReadWrite);
std::cout << "isOpen2: " << isOpen2 << std::endl;



isOpen1isOpen2应该为 true


   isOpen1: 1
     isOpen2: 1


附加信息1:也许需要以超级用户权限执行编译后的代码:


编译代码。
打开一个终端,然后 cd[Path to compiled project folder]/[projectname]
执行 sudo [executable_file]或以超级用户 su (inadvisable)身份运行


附加信息2:如果出现以下警告...:


   QSocketNotifier: Can only be used with threads started with QThread


...没有Qt事件循环应始终在 main()函数中:

int main(int argc, char *argv[]){
QCoreApplication a(argc, argv);
//My Testcode (Showed above in section 3.3)
return a.exec();
}


 4.使用打开的QSerialPorts:

(1.)无信号:

使用 qint64 QIODevice::write(const char * data)从一个QSerialPort写入另一个。使用 qint64 QIODevice::read(char * data, qint64 maxSize)QByteArray QIODevice::readAll()读取发送的数据。在这里重要的是要知道在通过 bool QIODevice::waitForReadyRead(int msecs)发送数据之后必须使用 QIODevice::write(),否则将无法使用。我建议也使用 bool QIODevice::waitForBytesWritten(int msecs)。例:

    const char* sendMessage = "myMessage";
std::cout << "sendMessage: " << sendMessage << std::endl;
qport1.write(sendMessage);
qport1.waitForBytesWritten(2000);
qport2.waitForReadyRead(2000);//required
const char* readMessage = qport2.readAll().data();
std::cout << "readMessage: " << readMessage << std::endl;


应该给出输出:


   readMessage: myMessage


如果希望读取定义的字节数,请使用 QIODevice::read()

    const char* readMessage = qport2.read(5);
std::cout << "readMessage: " << readMessage << std::endl;


应该给出输出:


   readMessage: myMess


附加信息:要检查有多少字节可读取,请使用 qint64 QIODevice::bytesAvailable() const。例:

std::cout << qport2.bytesAvailable() << std::endl;


(2.)有信号:

在类的构造函数中,可以使用 private slotreadyRead()连接到 QObject::connect()信号:

Classname::Classname(){
...
QObject::connect(&qport1, SIGNAL(readyRead()), this, SLOT(myPrivateSlotFunction()));
//with "qport1" as sender and "this" as receiver
}

...

Classname::myPrivateSlotFunction(){
...
const char* readMessage = qport1.readAll().data();
...
}

关于c++ - 如何将数据发送到QT中打开的tty0tty空调制解调器仿真器端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com