我正在为一个项目使用一个串行设备,而我试图完成PC端的工作是监听串行设备发送的命令,解释查询,根据查询运行一些代码,并将结果传回。
说实话,我尝试了使用PHP作为监听器,它的工作原理,不幸的是,使脚本作为一个接收器所需的无限循环,将CPU加载到25%。 所以这不是最好的select。
我现在正在使用cygwin,我想用linux本地命令创build一个bash脚本。
我可以使用以下方式接收数据:
cat /dev/ttyS2
并发送回应:
echo "command to send" > /dev/ttyS2
我的问题是,我如何使自动侦听器能够接收和发送数据? 我的主要问题是,一旦接收到信息,我怎样才能停止cat / dev / ttyS2命令,把它放到一个variables中,然后我可以与一个开关比较,或者一系列的if和else块。 之后再发回一个响应并重新开始循环?
谢谢
这不是你在找什么?
while read -r line < /dev/ttyS2; do # $line is the line read, do something with it echo $result > /dev/ttyS2 done
如果你使用正确的工具,当你的设备没有任何输出的时候,你的CPU使用率可能恰好为0。
要做到这一点,你应该使用一些更高级的语言(Perl,Python,C / C ++会做,而不是bash),并使用您的串行设备的文件句柄之上的选择循环。 这是Perl http://perldoc.perl.org/IO/Select.html的一个例子,但只要支持select()系统调用,您可以使用任何其他语言。
要保持相当系统的独立性,请使用跨平台编程语言:像Python一样,使用跨平台的串行库,如: pySerial ,并在脚本中进行处理。 我已经使用pySerial,我可以在源代码中几乎不做任何更改的情况下运行脚本跨平台。 通过使用BASH,你可以限制自己的一小部分。
我建议使用C / C ++与Qt 5.1.1,这很容易,如果你熟悉框架,它将是一块蛋糕! 在这里你可以找到更多的信息,并在这里更有帮助的例子,试试看,这真的很痛苦! 你也可以在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); }