11

我正在为项目使用串行设备,而我正在尝试完成 PC 端的工作,即侦听串行设备发送的命令,解释查询,根据查询运行一些代码,然后发回结果.

老实说,我尝试使用 PHP 作为侦听器,它可以工作,不幸的是,使脚本充当接收器所需的无限循环将 CPU 加载到 25%。所以这并不是最好的选择。

我现在正在使用 cygwin,我想使用 linux 本机命令创建一个 bash 脚本。

我可以使用以下方法接收数据:

cat /dev/ttyS2

并发送回复:

echo "command to send" > /dev/ttyS2

我的问题是,如何使自动侦听器能够接收和发送数据?我遇到的主要问题实际上是如何在收到信息后停止cat /dev/ttyS2命令,将其放入变量中,然后我可以与开关或一系列 if else then 块进行比较。然后发回响应并重新开始循环?

谢谢

4

4 回答 4

19

这不是你要找的吗?

while read -r line < /dev/ttyS2; do
  # $line is the line read, do something with it
  # which produces $result
  echo $result > /dev/ttyS2
done
于 2012-10-20T21:35:37.627 回答
1

为了保持系统独立,请使用跨平台编程语言:如Python,使用跨平台串行库(如pySerial)并在脚本中进行处理。我使用了 pySerial,我可以跨平台运行脚本,而源代码几乎没有变化。通过使用 BASH,您对自己的限制很小。

于 2012-10-21T05:42:30.933 回答
0

如果您使用正确的工具,当您的设备没有任何输出时,您的 CPU 使用率实际上可能正好为 0。

为此,您应该使用一些更高级的语言(Perl、Python、C/C++ 可以,但不是 bash)并在串行设备的文件句柄上使用选择循环。这是 Perl http://perldoc.perl.org/IO/Select.html的示例,但您可以使用任何其他语言,只要它支持 select() 系统调用。

于 2012-10-21T05:34:48.097 回答
-2

我建议在 Qt 5.1.1 中使用 C/C++,这真的很简单,如果你熟悉这个框架,那将是小菜一碟!!! 在这里你可以找到更多信息和更多有用例子,试一试,真的很轻松!!您也可以在 win 上开发,然后将您的代码移植到 linux...直接前进。

像这样声明一个对象:

QSerialPort mPort; //remember to #include <QtSerialPort/QSerialPort>
//also add QT += serialport to your .pro file

然后添加此代码:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    setupUi(this);


    connect(this->pushButton,SIGNAL(clicked()),this,SLOT(sendData()));

    mPort.setPortName("ttyS0");
    mPort.setBaudRate(QSerialPort::Baud115200);
    mPort.setParity(QSerialPort::EvenParity);

    if(!mPort.open(QSerialPort::ReadWrite))
    {
        this->label->setText(tr("unable to open port, %1").arg(mPort.error()));
    }

    connect(&(this->mPort),SIGNAL(readyRead()),this,SLOT(readData()));
}   

void MainWindow::sendData()
{

    QByteArray data = lineEdit->text().toLatin1();
    if(mPort.isOpen())
    {
        mPort.write(data);
    }
    else
    {
        this->label->setText(tr("port closed %1").arg( mPort.error()));

    }
}


void MainWindow::readData()
{

    QString newData;
    int bread=0;
    while(bread < mPort.bytesAvailable() ){
        newData += mPort.readAll();
        bread++;
    }
  this->textEdit->insertPlainText("\n" + newData);
}
于 2013-08-28T16:22:26.910 回答