QT串口读取Serial->readAll()踩过的坑

news2024/9/19 16:02:56

QT串口读取Serial->readAll接收不完全踩过的坑

  • Chapter1 QT串口读取Serial->readAll()踩过的坑
    • 坑一:
    • 坑二
  • Chapter2 [QT串口上位机BUG解决]json解析数据bug以及接收数据问题
    • 问题描述
    • 原因分析:
    • 解决方案:
      • 一、是数据采集端(单片机mcu)来解决
      • 二、上位机进行字符串拼接
  • Chapter3 QT 串口接收数据不完整解决思路
    • 一、问题描述
    • 二、解决思路
    • 三、贴代码思路
    • 四、注意事项
  • Chapter4 QT 中串口接收数据完整解决方案
  • Chapter5 Qt串口接收数据不全
    • 问题描述
    • 处理方法
    • 其他
  • Chapter6 Qt中接收串口数据不完整、分段的解决方法
    • 场景:
    • 解决方法:
    • 改写连接函数:
  • Chapter7 Qt--官方串口库串口数据接收不完整解决方法总结(一)
    • 问题
    • 方法一:确定一个完整的开始标志和结尾标志
    • 方法二:定时接收


Chapter1 QT串口读取Serial->readAll()踩过的坑

原文链接:https://blog.csdn.net/weixin_43491568/article/details/103183541

博主在制作一个QT软件与单片机进行数据传输(16进制的数据,结束标志是\r\n)的时候数据一直拿不完全。经过多日的研究终于成功了。

坑一:

QByteArray data;
data = Serial->readAll();//拿串口中的数据

因为串口设置的是8位数据位,因此拿到的数据是32位,但是博主想要的是“00 10 00 00 00 00 01 00 28 00 0A 01 01 01 01 00 \r\n”。但是QT使用qDebug()拿到是,如图(这样的数据不方便处理):

修改的代码如下:

QByteArray data;
data = Serial->readAll();//拿串口中的数据
temp.append(data);
if(temp.contains('\n'))//只有等到\n的时候才能进入
{
		xxxx//
		temp.clear();
 }

这样处理后拿到的数据是:如图
在这里插入图片描述

坑二

单片机发送数据的时候需要加一个延时函数,不然还是会出现类似坑一的问题。

未完待续

Chapter2 [QT串口上位机BUG解决]json解析数据bug以及接收数据问题

原文链接:https://blog.csdn.net/sinat_58149788/article/details/130455112

问题描述

主要是串口每次只能打印32个字节的数据,如果多了就会把数据放到缓冲区,这导致要二次打印,使json格式不连续,就构不成json格式,如下图。这样就不能解析出json数据了。
在这里插入图片描述

原因分析:

主要原因就是QT上位机数据最对打印32位,这导致json格式不完整,这样就不能解析了。

解决方案:

这里我有两个办法分别是对应的数据采集端(单片机)一次只发送32位数据。第二个是上位机进行字符串拼接

一、是数据采集端(单片机mcu)来解决

我采集电压电流是通过Stm32F103zet6在通过I2C与INA226通信,下面是数据采集端(单片机mcu)程序,这里的解决办法是设置一个标志位,该标志位用取反函数让其有两种状态,0和1.
然后我在用if判断不同状态发送不同的json格式数据,并且保证发送的数据长度必须小于32个8位数据。

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "USART.h"
#include "stdio.h"
#include "Wire.h"
#include "AHT10.h"
#include "SW3526.h"
#include "INA226.h"
//本案例是以一个AHT10温湿度传感器来显示I2C协议!
float Temp;
float Humi;
float ADC_Voltage;
u8 USART_FLAGS;
int main(void){
	USART_Begin(115200);
		//AHT10_Reset();
	//AHT10_Init();
	INA226_Init();
  //SW3526_Init();
	//printf("INA226_ID=0x%x\r\n",INA226_Get_Addr(0xFF)>>8);	

	while(1){
		//AHT10_Read_Data(&Temp,&Humi);
	  
		//SW3526_Init();
		//I2CS_ACK();
		//I2CS_ACK();
		//SW3526_Send_8_Reg(0x3A,0x01);
		//ADC_Voltage=SW3526_Read_8_Reg(0x3B)<<4|SW3526_Read_8_Reg(0x3C);
		//SW3526_Send_8_Reg(0x3A,0x01);
		//ADC_Voltage=SW3526_Read_8_Reg(0x30)*16*10;
		//SW3526_Fast_charge_protocol();
		//SW3526_Buck_ON_OFF(1);
		//SW3526_Fast_charge_protocol();
		//SW3526_Send_8_Reg(0x05,0x00);
		//printf("输出协议=%d\r\n",SW3526_Read_8_Reg(0x06));
		//printf("V=%.2f\r\n",SW3526_Buck_OUTPUT_Voltage()/1000);
		//Delay_ms(500);
		//printf("Temp=%.2f\r\nHumi=%.2f\r\n",Temp,Humi);
		
		USART_FLAGS=~USART_FLAGS;
		if(USART_FLAGS==0){
			printf("{\"current\":%d,\"voltage\":%d}",(int)(INA226_Get_Current_dat()),(int)(INA226_Get_Voltage_dat()));
			Delay_ms(400);
		}else{
			printf("{\"power\":%d}",(int)INA226_Get_Power_dat());
			Delay_ms(10);
		}
	  //printf("Voltage=%.4fV\r\n",INA226_Get_Voltage_dat()/1000);
	  //printf("CURRENT=%.2fmA\r\n",INA226_Get_Current_dat());
		
	 // printf("CURRENT=%.4fW\r\n",INA226_Get_Power_dat());		
	}
}

但是这里会出现一个问题当串口发送另外一个数据时电流,电压会短暂显示0,这里我们可以缩短单片机发送功率的数据延时来减少上位机的电流。电压出现0的问题。或者是修改上位机代码,如图二。
在这里插入图片描述
上位机的写入lcd_Number的数据,因为单片机是分时发送数据,当发送power的数据时,电流、电压的json解析失败,那存放电流,电压的数据肯定为 0
这时我们用一个if判断,当读取的电压、电流 == 0时,就不将值写入到lcd_Number。这样就完美的解决了这个问题
下面是QT串口上位机的串口接收数据代码的修改

QByteArray Widget::DateRead()  //接收数据
{



    QByteArray temp=serialPort->readAll();


    QString str=ui->recelives->toPlainText();
    str=QString::fromLocal8Bit(temp);
    ui->recelives->appendPlainText(str);



    //解析 JSON格式
   // QString json_str="{\"current\":15,\"voltage\":29,\"yan\":29}";
    QString receive =QString::fromLocal8Bit(temp.constData());
    qDebug() << receive ;
    qDebug() << receive.length();
    QJsonDocument doc=QJsonDocument::fromJson(receive.toUtf8());
    QJsonObject obj=doc.object();

    QJsonValue Current =obj.value("current");
    QJsonValue Voltage =obj.value("voltage");

    QString Current_cp;
    Current_cp.sprintf("%d",Current.toInt());
    QString Voltage_cp;
    Voltage_cp.sprintf("%d",Voltage.toInt());
    //qDebug() << Current_cp ;
   // qDebug() << Voltage_cp ;
    //ui->current_dat->display(Current.toInt());
   // ui->voltage_dat->dosplayVoltage.toInt()();
    if(Current.toInt()!=0 && Voltage.toInt()!=0){
    ui->current_dat->display(Current_cp);
    ui->voltage_dat->display(Voltage_cp);
    }
    temp.clear();
    return temp;
}

二、上位机进行字符串拼接

博主水平有限,现在还不好解决

Chapter3 QT 串口接收数据不完整解决思路

原文链接:https://blog.csdn.net/qq_44084616/article/details/131240790

一、问题描述

在串口通信时,会经常遇到,在接收一帧数据时,QSerialPort::readyRead()会触发多次,即接收一包数据需要多次接收才能完整得到数据帧。

二、解决思路

延迟接收: QSerialPort::readyRead()触发时不要立刻去接收数据,而是等待readyRead的最后一次触发时读数据。
如何等待最后一次readyRead: 用一个单触发定时器,readyRead触发时启动定时器,当定时器timeout(),可以认为是最后一次readyRead()。

三、贴代码思路

//!
    m_serial = new QSerialPort;
    connect(m_serial,&QSerialPort::readyRead,this,&MainWindow::slot_serialport_readyRead);

    //! 轮询定时器-周期性发送数据
    pTimerSend = new QTimer(this);
    pTimerSend->setTimerType(Qt::PreciseTimer);
    connect(pTimerSend, &QTimer::timeout, this, &MainWindow::slot_com_timeout_send);
    // pTimerSend->start(200); //串口连接成功后启动,此处仅为体现轮询周期为200ms

    //! 串口模式-数据延迟接收-保证数据完整
    pTimerRecv = new QTimer(this);
    pTimerRecv->setTimerType(Qt::PreciseTimer);
    pTimerRecv->setSingleShot(true); //只触发一次
    connect(pTimerRecv, &QTimer::timeout, this, &MainWindow::slot_serialport_delay_recv_timeout);


//! 串口接收信号
void MainWindow::slot_serialport_readyRead()
{
	//! 定时器重新启动,直到该函数不再触发(超过50ms),定时器触发
    pTimerRecv->start(50);	//4K数据,50ms的延迟接收完全没问题
}

//! 串口延迟接收
void MainWindow::slot_serialport_delay_recv_timeout()
{
    QByteArray Recv = m_serial->readAll();
    //! qDebug()<<"=="<<Recv;
    //! qDebug()<<"###"<<Recv.toHex(' ');
    //! 处理接收的数据
    com_recv_data_process(Recv);
}

四、注意事项

延迟接收时长问题: 延迟时长应小于轮询周期
通信状况复杂不适用:若通信的串口中会打印调试信息或其他信息时,延迟接收可能出现问题,例如:由于串口中有打印的调试信息,readyRead()信号不断发生,导致pTimerRecv不断重启而无法触发延迟接收函数,从而导致收不到或收到远超应收字节数的数据。
五、总结
以上描述方式仅适合干净的通信环境,若想一劳永逸的适配各种环境,这里提供一个思路。如下:开辟一个缓存,实时接收串口数据(仅存),开一个子线程,识别缓存中的数据,去掉无法识别的数据,取出已识别数据。

Chapter4 QT 中串口接收数据完整解决方案

原文链接:https://blog.csdn.net/weixin_45013621/article/details/125939331

串口是在QT中比较常用的一个类,通常也会有这样或者那样的问题,比如说串口的配置问题,我明明在引用了QSerialPort但是为什么不能用呢?等等。

今天要分享的问题就如标题所言,在使用QSerialPort类读取串口消息时,有时候会出现接收不全的现象,针对这个问题进行的解决。

通常情况下大家使用串口接收消息是这样做的

QSerialPort *m_serialport = new QSerialPort();
connect(m_serialport, &QSerialPort::readyRead, this, &BllProjecr::ReadData);
void BllProject::ReadData()
{
    QString str;
    QByteArray buffer = m_serialport->readAll();
    str += buffer; 
    //然后把str拿去解析。
}

串口传输数据有时候会有延迟 。

比如说串口本来该传的数据是“Vete is so Cool\r”,但是呢,由于传输延迟问题可能就是分两次传的该信息 得到的就是“Vete is”和“ so Cool\r”。对于串口回传信息的解析造成一点困扰。

所以呢就要想办法解决这个问题。这里给出的解决方案是利用QTimer定时器来进行读取。

QTimer *m_timer = new QTimer();
QSerialPort *m_serialport =new QSerialPort();
QByteArray m_buffer;
connect(m_serialport ,&QSerialport::readyRead,this&BllProject::bufferData);
connect(m_timer,&QTimer::timeout,this,&BllProject::ReadData);
void BllProject::bufferData()
{
     m_timer->start(50);
     m_buffer.append(m_serialport->readAll());
}
void BllProject::ReadData()
{
    m_timer->stop();
    // 把m_buffer 拿去解析。
    m_buffer.clear();
}

上面这个方法就是针对此问题的改进,给信息来一个50ms的缓冲时间,消除串口数据传输的时间差,这样就可以收到一次下发指令之后串口返回的完整数据了。

Chapter5 Qt串口接收数据不全

原文链接:https://blog.csdn.net/weixin_44965579/article/details/129026072

运行环境
版本:Qt5.14

IDE:QtCreator

问题描述

我使用的是readyRead()信号触发接收函数,使用serial->readAll()进行数据读取。在一台电脑上使用虚拟串口工具生成串口,使用串口助手每10ms发送一个262个字符的数据,不会发生接收数据不全的问题。

接着使用两台电脑,两个串口模块连接进行测试,同样速率和数据,接收到的数据会一段一段的到达。

处理方法

  1. 如果数据有帧头和帧尾,使用全局缓冲区,将接收到的数据放进缓冲区,判断是否满足整包,满足再进行包处理,不满足一直接数据
QByteArray Port_buffer;//需要定义在.h类里作为全局变量,不能放函数里
//下面是.cpp里
QByteArray data = serial->readAll();
Port_buffer.append(data);
if(Port_str.startsWith("FFFAFFFA")&&Port_str.contains("ED\r\n"))//帧头FFFAFFFA,帧尾ED
{
    //缓冲区里数据以FFFAFFFA开头,并且包含一个ED\r\n,表明至少有一个完整包
    index_ED = Port_buffer.indexOf("ED\r\n");//定位到帧尾的位置
    QByteArray pack = Port_buffer.left(index_ED+4);//取一个包的数据
    Port_buffer.remove(0,index_ED+4);
    //去空格、检查数据包
    //数据处理
}else if(!Port_str.startsWith("FFFAFFFA")&&Port_buffer.contains("FFFAFFFA"))
    {
        //不以FFFAFFFA开头,说明数据不完整,如果里面包含数据头,则直接删除到数据头的位置
        Port_buffer.remove(0,Port_buffer.indexOf("FFFAFFFA"));
    }

上面方式存在一个问题:使用虚拟串口本地测,不会发生数据分段接收,每次都是一个完整的数据进来,上面代码每次只允许一次,会发生Port_buffer里一直存数据包,时间长了就蹦了,处理方法:可以把接收改成定时处理。但是虚拟串口也只是理想情况,我的软件肯定是通过串口线连接到另外一台设备,所以这样应该也是可以的
在这里插入图片描述

上图data是从串口中取出的数据,直到存满完整数据才进行数据处理
在这里插入图片描述

上图使用虚拟串口,每次触发readyread都至少有一整个数据包(可能因为界面还在刷新数据等原因导致串口里滞留多个数据包),但是只触发一次读取数据,导致缓冲区里数据处理不完,这里可以用定时处理方式解决。

2.如果没有帧头帧尾,可以判断是否以\r\n结尾,判断是否收到一个完整数据包

if(Port_str.endsWith("\r\n"))//修改成endsWith("\r\n")就可以判断是否结束
{
 
}

其他

考虑过增加串口接收线程,但是代码会很复杂,上图里每2ms就能触发一次读数据,说明绰绰有余。我的界面刷新数据也是每次接收都刷新,还画个曲线图,再加上每10ms发个包,都能接收的过来。

建议:除非需要多个串口同时接数据,需要使用到多线程。如果只有一个串口接数据,就别折腾多线程了。

Chapter6 Qt中接收串口数据不完整、分段的解决方法

原文链接:https://blog.csdn.net/weixin_48424192/article/details/109483013

场景:

最近在串口通信时碰到了一个问题,向485串口发送指定报文,会收到一条关于压力数值的数据。但将其qDebug打印出来却发现数据被分成了两部分依次打印,之后通过验证确定了问题出在readyRead的信号与槽这一部分。

在槽函数的入口处加入 qDebug()<<“-”; 可以发现 “-” 连同分段的数据被打印了两次,也就是说在收到readyRead的信号后,串口的数据被分成两段,各执行了一次readMyCom槽函数。

解决方法:

在网上搜索后,发现有很多解决方法,比如通过数据的帧头帧尾进行判断是否为完整数据帧、通过帧头和数据帧长来判断完整帧、加入定时器将延时读取的数据存入缓冲区然后timeout后再一次性读取数据,这里我主要介绍定时器延时读取的方法。

改写连接函数:

在readyRead信号对应的槽函数中设置定时器,并将读取到的数据储存在缓冲区中,待定时器timeout再一并读取缓冲区中的数据,缺点是如果极高频率的串口通讯可能会有问题。

//改写前的connect
//connect(my_serialport,&QSerialPort::readyRead,this,&MainWindow::readMyCom);

//改写后的connect
connect(my_serialport,&QSerialPort::readyRead,this,[=]()
{
   timer->start(100);//设置100毫秒的延时
   QByteArray buffer.append(my_serialport->readAll());//将读到的数据放入缓冲区
});
connect(timer,&QTimer::timeout,this,&MainWindow::readMyCom);//timeout执行真正的读取操作

void Widget::readMyCom()
{
   time->stop();//关闭定时器
   QByteArray data = buffer;//读取缓冲区数据
   buffer.clear();//清除缓冲区
   ....//数据处理操作
}

Chapter7 Qt–官方串口库串口数据接收不完整解决方法总结(一)

原文链接:https://blog.csdn.net/qq_28877125/article/details/103520013

问题

Qt 官方串口库QSerialPort的 readyRead() 信号,只要有数据就抛出,这就导致一条数据分多次抛出。由于正常的数据没有固定的开头和结尾,这就导致无法获取正常的一组数据。

方法一:确定一个完整的开始标志和结尾标志

解决思路:增加接收延时功能,把多次读取的数据保存到缓冲区,延时结束,一次性读取数据
示例:

QSerialPort *serialPort= new QSerialPort();
connect(serialPort, SIGNAL(readyRead()), this, SLOT(slotReadData()));

void MainWindow::slotReadData()
{
    static QByteArray sumData;
    QByteArray tempData = serial->readAll();

    if(!tempData.isEmpty())
    {
        sumData.append(tempData);
        if(sumData.contains("\n")) // 检测到换行符
        {
            do_DataHandler(sumData); // 数据解析

            sumData.clear();
        }
    }
    tempData.clear();
}

void MainWindow::do_DataHandler(QByteArray BufferData)
{
    /* *
     *
     * 筛选出“{x,yyyyyy}”格式的数据
     *
     * */

    //异常类:无头且变量为空,已丢失头部,数据不可靠,直接返回
    if ((!BufferData.contains("{"))&(PasteData.isNull()))
    {
        return;
    }
    //第一种:有头无尾,先清空原有内容,再附加
    if ((BufferData.contains("{"))&(!BufferData.contains("}")))
    {
        PasteData.clear();
        PasteData.append(BufferData);
    }
    //第二种:无头无尾且变量已有内容,数据中段部分,继续附加即可
    if ((!BufferData.contains("{"))&(!BufferData.contains("}"))&(!PasteData.isNull()))
    {
        PasteData.append(BufferData);
    }
    //第三种:无头有尾且变量已有内容,已完整读取,附加后输出数据,并清空变量
    if ((!BufferData.contains("{"))&(BufferData.contains("}"))&(!PasteData.isNull()))
    {
        PasteData.append(BufferData);
        ReadData = PasteData;
        PasteData.clear();
    }
    //第四种:有头有尾(一段完整的内容),先清空原有内容,再附加,然后输出,最后清空变量
    if ((BufferData.contains("{"))&(BufferData.contains("}")))
    {
        PasteData.clear();
        PasteData.append(BufferData);
        ReadData = PasteData;
        PasteData.clear();
    }

    QString MidStr;
    QStringList list= ReadData.split("{");

    for(int i=0; i < list.length();i++)
    {
        if(!list.at(i).isEmpty())
        {
            MidStr = list.at(i);
            if(!MidStr.isEmpty())
            {
                MidStr.insert(0, '{');
                //qDebug() << "ReadData:" << ReadData;
                qDebug() << "MidStr:" << MidStr;
            }
        }
    }
    ReadData.clear();
}

方法二:定时接收

解决思路:增加接收延时功能,把多次读取的数据保存到缓冲区,延时结束,一次性读取数据

示例:

QByteArray baRcvData;

QSerialPort *serialPort= new QSerialPort();
QTimer *timer = new QTimer();
connect(serialPort, SIGNAL(readyRead()), this, SLOT(slotReadData()));
connect(timer, SIGNAL(timeout()), this, SLOT(timeUpdate())));

void MainWindow::slotReadData()
{
	timer->start(100);//启动定时器,接收100毫秒数据(根据情况设定)
	baRcvData.append(serialPort->readAll());
} 

void MainWindow::timeUpdate()
{
	timer->stop();
	if(baRcvData.length()!=0)
	{
		qDebug()<<baRcvData;
	}
	baRcvData.clear();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

灰光模块,彩光模块-介绍

1. 引用 知识分享系列一&#xff1a;5G基础知识-CSDN博客 5G前传的最新进展-CSDN博客 灰光和彩光_通信行业5G招标系列点评之二&#xff1a;一文读懂5G前传-光纤、灰光、彩光、CWDM、LWDM、MWDM...-CSDN博客 ADOP带你了解&#xff1a;CWDM、DWDM、MWDM、LWDM&#xff1a;快速…

久久公益节||“携手万顺叫车一起做公益”

99公益日是由腾讯公益联合多家公益组织、企业及社会各界爱心人士共同举办的年度大型公益活动。随着99公益日的到来&#xff0c;同悦社工诚挚地邀请了万顺叫车一起参与今年的公益活动&#xff0c;共同为社会公益事业贡献力量。 在本次公益倡导活动中&#xff0c;万顺叫车将发挥其…

vLLM (5) - LLMEngine下篇

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 文章目录 系列文章目录前言一、类图二、LLM._validate_and_add_requests()1.LLM2.LLMEngine3.Scheduler 三、L…

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论&#xff0c;强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作&#xff0c;敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析&#xff0c;探讨系统变化对敏捷开发的影响、业务与技术的对齐以…

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量&#xff0c;也可以直接手动写入函数(注意写入格式。) 这…

sheng的学习笔记-AI-概率图,隐马尔可夫HMM,马尔可夫随机场MRF,条件随机场CRF

ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 贝叶斯分类&#xff1a; https://blog.csdn.net/coldstarry/article/details/138861587 基础知识 概率图模型 概率图模型(probabilistic graphical model)是一类用图来表达变量相关关系的概率模型。 它以图为表示工具&…

mac|安装nginx

使用homebrew安装nginx brew install nginx 注意&#xff1a; 一般来说nginx会被默认安装在/usr/local/cellar,打开【访达】&#xff0c;前往【电脑】 由于/usr是隐藏文件&#xff0c;无法直接查看。通过 shiftommand. 即可查看 可以看到我的不在这里&#xff08;我也不知道…

【ruoyi框架】开箱即用的管理系统框架

目录 1.简介 2.快速开始 2.1.仓库 2.2.环境初始化 3.使用介绍 3.1.权限与组件 3.2.开发与测试 1.简介 管理系统是当前软件市场上最常见的软件&#xff0c;管理系统在功能和界面上都有大量通用的点。 功能上通用的点包括但不限于&#xff1a; 角色、权限管理菜单管理鉴…

智能制造中,叉车防撞报警系统的数字化管理

由于叉车的价格便宜&#xff0c;装载能力强等特点&#xff0c;在工厂得到了广泛地使用&#xff0c;极大提升了仓库物料的流转效率。但叉车在使用当中&#xff0c;也存在一些风险&#xff0c;甚至带来一些事故。另外一个方面&#xff0c;如何对仓库进行有效地数字化管理&#xf…

智能电源控制箱

在数字化浪潮的推动下&#xff0c;智能化管理已成为各行各业转型升级的重要方向。作为这一趋势下的佼佼者&#xff0c;《智能电源控制箱》凭借其卓越的性能和便捷的操作&#xff0c;正逐步成为网络通信、监控安防等领域不可或缺的关键设备。本文将详细介绍这款集智能网络传输、…

[论文笔记]QLoRA: Efficient Finetuning of Quantized LLMs

引言 今天带来LoRA的量化版论文笔记——QLoRA: Efficient Finetuning of Quantized LLMs 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 我们提出了QLoRA&#xff0c;一种高效的微调方法&#xff0c;它在减少内存使用…

[论文笔记] t-SNE数据可视化

pip install matplotlib scikit-learn sentence-transformers数据分类别可视化 t-SNE算法将高维数据映射到2D空间后的坐标。 t-SNE是一种用于数据降维和可视化的技术,它的作用是将原本在高维空间中的复杂数据压缩到低维空间,同时尽可能保留数据点之间的距离关系。 举例: h…

Pr:首选项 - 颜色

Pr菜单&#xff1a;编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“颜色” Color选项卡可以设置与显示颜色相关的选项。 若启用“显示色彩管理”&#xff0c;可以保证在不同显示设备上保持颜色一致性&#xff0c;它只影响显示效果&#xff0c;不会更改剪辑本身的颜色数…

C语言之预处理详情

目录 前言1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比7.#和##运算符7.1 #运算符7.2 ##运算符 8.命名约定9.undef10.命令行指令11.条件编译12.头文件的包含12.1 头文件包含方式12.1.1 本地头文件包含12.1.2 库文件包含 12…

还不懂BIO,NIO,AIO吗

BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;和 AIO&#xff08;Asynchronous I/O&#xff09;是 Java 中三种不同的 I/O 模型&#xff0c;主要用于处理输入 / 输出操作。 一、BIO&#xff08;Blocking I/O&#xff09; 定义与工作原…

主窗口的设计与开发(二)

主窗口的设计与开发&#xff08;二&#xff09; 前言 在上一集当中&#xff0c;我们完成了主窗口的初始化&#xff0c;主窗口包括了左中右三个区域。我们还完成了对左窗口的初始化&#xff0c;左窗口包括了用户头像、会话标签页按钮、好友标签页按钮以及好友申请标签页按钮。对…

JavaFX基本控件-TextField

JavaFX基本控件-TextField 常用属性textpromptTextpaddingalignmentwidthheighttooltipbordereditabledisablevisible 格式化整形格式化 实现方式Java实现fxml实现 常用属性 text 设置文本内容 textField.setText("测试数据");promptText 设置文本字段的提示文本&am…

django ubuntu 踩坑集锦

目录 1 ubantu mysql查看表结构2 导入同级目录文件出现未解析引用错误3 第三方包——tinymce富文本编辑器4 verbose_name,verbose_name_plural5 搜索路径的添加6 auto_now_add 和 auto_now7 auth_user的表结构8 在 Django 中定义 ForeignKey 字段时&#xff0c;必须指定 on_del…

共享内存喜欢沙县小吃

旭日新摊子好耶&#xff01; 系统从0开始搭建过通信方案&#xff0c;本地通信方案的代码&#xff1a;System V IPC 里面有共享内存、消息队列、信号量 共享内存 原理 两个进程有自己的内存区域划分&#xff0c;共享内存被创建出的时候是归属操作系统的&#xff0c;还是通过…

STM32G474内部温度传感器的使用

目录 概述 1 认识STM32G474内部温度传感器 1.1 温度传感器概述 1.2 温度传感器实现原理 1.3 读取温度方法 1.4 ADC模块上温度sensor的位置框图 2 STM32Cube创建项目 2.1 配置参数 2.2 STM32Cube生成的软件架构 3 温度数据算法实现 3.1 算法介绍 3.2 源代码 概述…