高速串口的数据接收(二)

    前面解析和优化了串口接收相关的代码,现在我们巩固一下,假设外部设备一直发送数据,频率为50Hz,每帧数据包含帧头“0x55 0xAA 0x55 0xAA”,数据,和校验。波特率是921600bps,要求数据接收不丢帧,且实时输出每帧数据。

1、数据接收与解析:创建一个单独的线程或者使用Qt的事件循环机制处理串口接收到的数据。在数据接收的回调函数中,解析每一帧数据,确保处理速度足够快以便实时处理数据。
2、实时输出每 帧数据:当解析到完整的一帧数据时,发送信号通知主线程或者相应的界面组件进行处理和显示,可以使用Qt的信号与槽机制来实现这一点。
3、多线程处理:由于数据接收和解析需要与界面交互,可以考虑使用多线程来避免阻塞界面。将串口通信和数据处理放在一个独立的线程中进行,使用信号与槽来与界面进行通信。
4、异常处理:考虑到串口通信可能出现异常(如通信中断、数据错误等),需要添加适当的异常处理机制,以确保系统的稳定性和可靠性。
下面是一个基本的示例:

#include <QCoreApplication>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
class SerialPortReader : public QObject
{
    Q_OBJECT
public:
    SerialPortReader(QSertialPort  *serialPort,QObject *parent = nullptr)
            :QObject(parent),m_serialPort(serialPort)
    {
        connect(m_serialPort,&QSerialPort::readyRead,this,&SerialPortReader::handleReadyRead);
    }
signals:
    void frameReceived(const QByteArray &frame);
private slots:
    void handleReadyRead()
    {
        m_buffer.append(m_serialPort->readAll());
        while(m_buffer.size()>=FRAME_SIZE)
        {
            int headerIndex = m_buffer.indexof(HEADER);
            if(headerIndex != -1)
            {
                    QByteArray frame = m_buffer.mid(headerIndex,FRAME_SIZE);
                    emit frameReceived(frame);
            }else
            {
                    m_buffer.clear();
            }
        }
    }
private:
    QSerialPort *m_serialPort;
    QByteArray m_buffer;
    static const int FRAME_SIZE = 10;
    static const QByteArray HEADER;
}
const QByteArray SerialPortReader::HEADER = QByteArray::fromHex("55AA55AA");
int main(int argc,char *argv[])
{
    QCoreApplication a (argc,argv);
    QSerialPort serialPort;
    serialPort.setPortName("COM1");
    serialPort.setBaudRate(QSerialPort::Baud921600);
    serialPort.setDataBits(QSerialPort::Data8);
    serialPort.setParity(QSerialPort::NoParity);
    serialPort.setStopBits(QSerialPort::OneStop);
    serialPort.setFlowControl(QSerialPort::NoFlowControl);

    if(!serialPort.open(QIODevice::ReadOnly))
    {
        qDebug()<<"Falied to open serial port :"<<serialPort.errorString();
        return -1;
    }
    SerialPortReader serialPortReader(&serialPort);
    QObject::connect(&serialPortReader,&SerialPortReader::frameReceived,[](const QByteArray &frame )
    {
        qDebug()<<"Received frame:"<<frame.toHex();
    }
    );
    return a.exec();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中,实现高速接收串口数据可以通过以下步骤进行: 1. 配置串口参数:使用`QSerialPort`类来打开串口并设置相关参数,如波特率、数据位、校验位等。可以使用`setBaudRate()`、`setDataBits()`、`setParity()`等函数进行设置。 ```cpp QSerialPort serialPort; serialPort.setPortName("COM1"); serialPort.setBaudRate(QSerialPort::Baud115200); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); ``` 2. 打开串口并连接信号:使用`open()`函数打开串口,并连接相关信号,如`readyRead()`信号用于接收数据。 ```cpp if (serialPort.open(QIODevice::ReadWrite)) { connect(&serialPort, &QSerialPort::readyRead, this, &MyClass::handleReadyRead); } ``` 3. 接收数据:在`handleReadyRead()`函数中读取接收到的数据。可以使用`readAll()`函数读取所有可用的数据,或者使用`read()`函数指定要读取的字节数。 ```cpp void MyClass::handleReadyRead() { QByteArray data = serialPort.readAll(); // 处理接收到的数据 } ``` 需要注意的是,在高速接收数据时,可能会出现缓冲区溢出的情况。为了避免丢失数据,建议使用循环读取数据,直到缓冲区中没有可用数据。 4. 关闭串口:在不需要接收数据的时候,使用`close()`函数关闭串口。 ```cpp serialPort.close(); ``` 上述代码只是一个简单的示例,你可以根据自己的需求进行修改和扩展。同时,Qt还提供了其他一些功能,如发送数据、错误处理等,可以根据需要进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值