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

时间:2016-04-30 22:24:35

标签: c++ qt serial-port virtual tty

我已经通过QSerialPort与tty0tty nullmodem模拟器创建的模拟串行端口打开了工作连接,我可以像这样写入数据:

screen /dev/tnt1

我打开一个终端并通过"屏幕"

连接到连接的(在本例中为tnt1)tnt-port(例如tnt0< - > tnt1已连接)
int size = serial_stream.bytesAvailable();
QByteArray data = serial_stream.read(size);

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

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

我已经尝试用&#34; sleep&#34; ...:

来停止程序
echo “TEXT“ > /dev/tnt1

...并将数据发送到它:

{{1}}

但它不起作用。我很高兴你的帮助!

1 个答案:

答案 0 :(得分:3)

使用QSerialPort

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

1.构建 tty0tty -connections:

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

(1。)简短的方法:

  1. 下载并摘录 tty0tty (标题中的第一个链接)。
  2. 打开终端,cd[Path to tty0tty-folder]/tty0tty/pts
  3. 执行sudo ./tty0tty
  4. 然后应显示两个连接的pseudo terminal slaves

      带有X,Y变量的

    (/dev/pts/X) <=> (/dev/pts/Y)

    (2。)更长的路(但或多或少永久):

    1. 关注此Installation guide
    2. 也许持久穿越靴子不起作用,所以有必要在重启后重复安装指南的以下部分:

      1. 加载模块
        • sudo depmod
        • sudo modprobe tty0tty
      2. 为新的串口提供适当的权限(native terminal devices
        • sudo chmod 666 /dev/tnt*
      3. 执行ls /dev/tnt*后,将显示一个端口列表:

          

        /dev/tnt0 ... /dev/tnt7

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

        可以使用cat测试连接:

        1. 打开终端[1]并显示一个伪/本机终端设备的输出

          • (1。)cat /dev/pts/X或(2。)cat /dev/tnt0
        2. 打开另一个终端[2]并写入此伪/本机终端设备

          • (1。)echo "message" > /dev/pts/Y或(2。)echo "hello" > /dev/tnt1
        3. 输出应显示在端子[1]中:

            

          message

          其他信息:要停止 cat ,请按: Ctrl + Z

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

          1. serialport - 参考添加到[projectname].pro文件中的Qt-specific configuration options

              

            QT += serialport

            其他信息:允许将所有引用放在一行中:

              

            即。 QT+= core gui serialport ...

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

              

            #include <QtSerialPort/QSerialPort>

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

                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;
            
          4. isOpen1isOpen2应为true

              

            isOpen1: 1
                isOpen2: 1

            其他信息1 :可能需要以超级用户权限执行已编译的代码:

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

              其他信息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.使用打开的 QSerialPort

              (1。)没有信号:

              使用qint64 QIODevice::write(const char * data)从一个 QSerialPort 写入另一个 QSerialPort 。使用qint64 QIODevice::read(char * data, qint64 maxSize)QByteArray QIODevice::readAll()阅读已发送的数据。这里重要的是要知道在通过QIODevice::write()发送数据后必须使用bool QIODevice::waitForReadyRead(int msecs),否则它将无效。我还建议使用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();
                  ...
              }