在树莓派上界面程序使用Qt编写,设备会使用到一个USB-LCD的液晶显示屏,USB-LCD的显示程序使用python编写,因此考虑使用socket进行两个进程间的通讯
QLocalSocket类提供了一个本地socket。
在Windows中,这是一个命名管道;在Unix中,这是一个本地网域socket。
在打开连接之前必须调用setServerName();或者可以使用connectToServer(const QString &name, OpenMode openMode)。
以指定的openMode打开socket,首先进入ConnectingState,如果建立了连接,QLocalSocket进入ConnectedState,并发射connected()信号。
调用此函数后,当发生错误时,socket会发射error()信号。
python端建立服务端时需要指定socket路径,Qt中QLocalSocket初始化时仅指定socket名称,路径固定使用/tmp/,所以python绑定时指定/tmp/路径的socket名称即可。
代码示例如下:
Qt:
lcdmodel::lcdmodel(QObject *parent) : QObject(parent)
{
socket=new QLocalSocket(this);
connect(socket,SIGNAL(readyRead()),this,SLOT(readData()));
connect(socket,SIGNAL(error(QLocalSocket::LocalSocketError)),this,SLOT(displayError(QLocalSocket::LocalSocketError)));
socket->connectToServer("lcdsock");
}
void lcdmodel::readData()
{
}
void lcdmodel::displayError(QLocalSocket::LocalSocketError err)
{
switch (err) {
case QLocalSocket::ServerNotFoundError:
qDebug()<<tr("The host was not found. Please check the host name and port settings.");
break;
case QLocalSocket::ConnectionRefusedError:
qDebug()<<tr("The connection was refused by the peer. Make sure the server is running.");
break;
case QLocalSocket::PeerClosedError:
qDebug()<<tr("The server was closed.");
default:
qDebug()<<tr("The following error occurred: %1.").arg(socket->errorString());
break;
}
}
Python:
from socket import *
import os
from lcd2usb import LCD
lcd=LCD()
lcd.goto(0,0)
lcd.write('>> ')
sock_file='/tmp/lcdsock'
if os.path.exists(sock_file):
os.remove(sock_file)
sockfd=socket(AF_UNIX,SOCK_STREAM)
sockfd.bind(sock_file)
sockfd.listen(3)
while True:
c,addr=sockfd.accept()
while True:
data=c.recv(1024)
if not data:
break
lcd.goto(0,1)
info=data.decode()
print(info)
l=len(info)
print(l)
infolcd=info.rjust(16)
lcd.write(infolcd)
print(infolcd)
c.close()
sockfd.close()
测试效果: