Qt5版本的QSerialPort串口操作

本文介绍了一种串口通信的优化方法,通过将串口操作置于单一线程中,并使用QMutex锁确保数据的安全访问。文章详细展示了如何通过循环读取直至接收到完整的数据包并进行异或校验来确保数据的完整性。

对于一个串口的操作(比如设置电视屏的声音,亮度,关开等)最好不要放到多个线程里去操作,应该放到一个子线程里,我用时是写了类,把类再moveToThread放到一个QThread里

class SetScreenSerialport : public QObject
//class SetScreenBrightnessSerialport : public QThread
{
    Q_OBJECT
public:
    explicit SetScreenSerialport(LCDDispatch*lcd = NULL,QObject *parent = 0);
    ~SetScreenSerialport();
    QSerialPort *serialport;

,使用串口时就加上QMutex锁住,用完关掉串口再解锁,且最好不要用readyRead信号,而是直接waitForReadyRead,再readAll,使用完解锁。如果用信号 ,有时没有信号触发,就

不能解锁了。

串口接收返回数据老是不完整,只能收到8个字节,使用以下方法解决:

    if(serialport->write(data) == data.count()) //向串口写数据,等响应
    {       
        serialport->waitForBytesWritten(500);//串口写入数据了,才会返回或者超时返回
        QThread::msleep(100); //再等一会
        if(serialport->waitForReadyRead()) //有数据了再读
        {
            readAllData(tmpBuf);

-----------------------------------------------------------------

void SetScreenSerialport::readAllData(QByteArray &data)
{

    //反复读数据,读到通过校验为止
    do
    {
        QByteArray t = serialport->readAll();
        if(!t.isEmpty())
        {
            data = data.append(t);
            QByteArray tmp = data.left(data.count() -1);
            char lastByte = data.at(data.count() -1);
            if(lastByte == getOneXor(tmp) && data.size() >= 6)//声音设置返回6最短
            {
                return;
            }
        }
        QThread::msleep(500);
    }
    while(1);
}

----------------------

char getOneXor(QByteArray buf)//异或校验
{
    char tmp = buf[0];
    for(int i = 0; i < buf.count(); i++)
    {
        tmp = tmp ^ buf[i+1];
    }
    return tmp;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值