Linux串口监听器和解释器?

时间:2012-10-20 17:00:50

标签: linux bash serial-port cygwin

我正在为项目使用串行设备,而我正在尝试完成PC端,正在侦听串行设备发送的命令,解释查询,根据查询运行一些代码,以及传输支持结果。

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

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

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

cat /dev/ttyS2

并发送回复:

echo "command to send" > /dev/ttyS2

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

由于

4 个答案:

答案 0 :(得分:10)

这不是你想要的吗?

while read -r line < /dev/ttyS2; do
  # $line is the line read, do something with it
  echo $result > /dev/ttyS2
done

答案 1 :(得分:1)

要保持与系统无关,请使用跨平台编程语言:如Python,使用跨平台的串行库,如:pySerial,并在脚本中进行处理。我使用过pySerial,我可以运行脚本跨平台,源代码几乎没有变化。通过使用BASH,你会限制自己一点点。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

我建议在Qt 5.1.1中使用C / C ++,它非常简单,如果你熟悉这个框架,它将是一块蛋糕! Here您可以找到更多信息和here更多有用的示例,试一试, 它真的很痛苦!你也可以在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);
}