我正在为项目使用串行设备,而我正在尝试完成PC端,正在侦听串行设备发送的命令,解释查询,根据查询运行一些代码,以及传输支持结果。
说实话,我尝试使用PHP作为监听器,它很有效,不幸的是,使脚本充当接收器所需的无限循环将CPU加载到25%。所以这不是最好的选择。
我现在正在使用cygwin,我想使用linux native命令创建一个bash脚本。
我可以使用以下方式接收数据:
cat /dev/ttyS2
并发送回复:
echo "command to send" > /dev/ttyS2
我的问题是,如何使自动侦听器能够接收和发送数据?我遇到的主要问题实际上是如何在收到信息后停止 cat / dev / ttyS2 命令,将其放入变量中,然后我可以将其与开关或一系列if进行比较否则阻止。然后发回一个响应并重新开始循环?
由于
答案 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);
}