Qt实现串口通信的完整步骤
要实现串口通信,需要知道串口通信需要的信息
主要参数有:波特率、校验位、数据位、停止位、控制流
主要操作有:串口的打开和关闭、刷新设备串口、接发数据、开关显示灯等。实现效果如图:
界面设计如下:
每个控件类名如下:
LED灯是QLable控件,设置它的长宽都是24px,然后鼠标右击,选择"样式表",在样式表中添加代码。
文章最后附赠完整源码
第一步:在头文件中引入 QtSerialPort 类的两个头文件(必须引入)// 引入串口通信的两个头文件(第一步) #include // 提供访问串口的功能 #include // 提供系统中存在的串口信息
第二步:在工程文件中添加以下代码# 引入串口工程类型(第二步) QT += serialport
第三步:在头文件中定义全局的串口对象QSerialPort *serial; // 定义全局的串口对象(第三步)
第四步:参数设置,在头文件中定义初始化参数的函数和参数变量名,在.cpp文件中实现函数public: void SerialPortInit(); // 串口初始化(参数配置) private: // 参数配置 QStringList baudList; //波特率 QStringList parityList; //校验位 QStringList dataBitsList; //数据位 QStringList stopBitsList; //停止位 QStringList flowControlList; //控制流// 串口初始化(参数配置) void MainWindow::SerialPortInit() { serial = new QSerialPort; //申请内存,并设置父对象 // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件 foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { serial->setPort(info); // 在对象中设置串口 if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口 { ui->PortBox->addItem(info.portName()); // 添加计算机中的端口 serial->close(); // 关闭 } else { qDebug() << "串口打开失败,请重试"; } } // 参数配置 // 波特率,波特率默认选择57600 ,禁止用户点击 ui->BaudBox->addItem("57600"); serial->setBaudRate(QSerialPort::Baud57600); ui->BaudBox->setDisabled(true); // 校验,校验默认选择无 ui->ParityBox->addItem("无"); serial->setParity(QSerialPort::NoParity); // 数据位,数据位默认选择8位 ui->BitBox->addItem("8"); serial->setDataBits(QSerialPort::Data8); // 停止位,停止位默认选择1位 ui->StopBox->addItem("1"); serial->setStopBits(QSerialPort::OneStop); // 控制流,默认选择无 ui->ControlBox->addItem("无"); serial->setFlowControl(QSerialPort::NoFlowControl); // 刷新串口 RefreshSerialPort(0); // 信号 connect(serial,&QSerialPort::readyRead,this,&MainWindow::DataReceived); // 接收数据 connect(ui->SendWordOrder,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据 connect(ui->SendButton,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据 connect(ui->SendEditBtn1,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据 connect(ui->SendEditBtn2,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据 connect(ui->SendEditBtn3,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据 }
第五步:刷新串口,及时更新可用的串口
QT开发交流+赀料君羊:714620761// 刷新串口 void MainWindow::RefreshSerialPort(int index) { QStringList portNameList; // 存储所有串口名 if(index != 0) { serial->setPortName(ui->PortBox->currentText()); //设置串口号 } else { ui->PortBox->clear(); //关闭串口号 ui->PortBox->addItem("刷新"); //添加刷新 foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) //添加新串口 { portNameList.append(info.portName()); } ui->PortBox->addItems(portNameList); ui->PortBox->setCurrentIndex(1); // 当前串口号为COM1 serial->setPortName(ui->PortBox->currentText()); //设置串口号 } }
第六步:发送数据和接收数据// 接收数据,使用read () / readLine () / readAll () void MainWindow::DataReceived() { char BUF[512] = {0}; // 存储转换类型后的数据 QByteArray data = serial->readAll(); // 读取数据 if(!data.isEmpty()) // 接收到数据 { QString str = ui->DataReceived->toPlainText(); // 返回纯文本 str += tr(data); // 数据是一行一行传送的,要保存所有数据 ui->DataReceived->clear(); // 清空之前的数据 ui->DataReceived->append(str); // 将数据放入控件中 qDebug() << "str info: " << ui->DataReceived->toPlainText(); // 清除之前的数据,防止追加,因为每次获取的数据不一样 int index = str.indexOf("r "); // 找到,返回索引值,找不到,返回-1 if(index != -1) { snprintf(BUF,500,"%s", str.left(index + 2).toUtf8().data()); // QString转为char * 类型 qDebug() << "BUF info: " << BUF; // 数据类型转换成功 str.remove(0,index + 2); // 处理获取到的数据,将其放入对应的控件中 // ..... } } } // 发送数据,write () void MainWindow::DataSend() { serial->write(ui->DataSend->toPlainText().toLatin1()); // 串口发送数据 }
第七步:打开串口和关闭串口,当打开串口后,显示绿灯;关闭串口后,显示红灯// 串口开关 void color:rgb(98 189 255)">MainWindow::on_OpenSerialButton_clicked() { if(serial->isOpen()) // 如果串口打开了,先给他关闭 { serial->clear(); serial->close(); // 关闭状态,按钮显示"打开串口" ui->OpenSerialButton->setText("打开串口"); // 关闭状态,允许用户操作 ui->BaudBox->setDisabled(false); ui->ParityBox->setDisabled(false); ui->BitBox->setDisabled(false); ui->StopBox->setDisabled(false); ui->ControlBox->setDisabled(false); // 禁止操作"发送字符操作" ui->SendWordOrder->setDisabled(true); ui->SendButton->setDisabled(true); // 关闭状态,颜色为绿色 ui->OpenSerialButton->setStyleSheet("color: green;"); // 关闭,显示灯为红色 LED(true); // 清空数据 ui->DataReceived->clear(); ui->DataSend->clear(); } else // 如果串口关闭了,先给他打开 { //当前选择的串口名字 serial->setPortName(ui->PortBox->currentText()); //用ReadWrite 的模式尝试打开串口,无法收发数据时,发出警告 if(!serial->open(QIODevice::ReadWrite)) { QMessageBox::warning(this,tr("提示"),tr("串口打开失败!"),QMessageBox::Ok); return; } // 打开状态,按钮显示"关闭串口" ui->OpenSerialButton->setText("关闭串口"); // 打开状态,禁止用户操作 ui->BaudBox->setDisabled(true); ui->ParityBox->setDisabled(true); ui->BitBox->setDisabled(true); ui->StopBox->setDisabled(true); ui->ControlBox->setDisabled(true); // 允许操作"发送字符操作" ui->SendWordOrder->setDisabled(false); ui->SendButton->setDisabled(false); // 打开状态,颜色为红色 ui->OpenSerialButton->setStyleSheet("color: red;"); // 打开,显示灯为绿色 LED(false); } } // 开关显示灯 void color:rgb(98 189 255)">MainWindow::LED(bool changeColor) { if(changeColor == false) { // 显示绿色 ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(0, 229, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;"); } else { // 显示红色 ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(255, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;"); } }
第八步:相关槽函数// 控件中添加 指令"###" void MainWindow::on_SendButton_clicked() { on_ClearButton_clicked(); ui->DataSend->append("###"); } // 清空控件 void MainWindow::on_ClearButton_clicked() { ui->DataSend->setText(""); } // 清空接收到的数据 void MainWindow::on_ClearShowButton_clicked() { ui->DataReceived->setText(""); } // 点击发送后,获取串口信息并展示在接受控件中 void MainWindow::on_SendEditBtn1_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit1->text(); //获取发送框内容 ui->DataSend->setText(EditText); //将文本内容放在发送栏中 } void MainWindow::on_SendEditBtn2_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit2->text(); //获取发送框内容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //将文本内容放在发送栏中 } void MainWindow::on_SendEditBtn3_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit3->text(); //获取发送框内容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //将文本内容放在发送栏中 } void MainWindow::on_SendWordOrder_clicked() { on_SendButton_clicked(); }源码:
工程文件.pro文件源码:QT += core gui # 引入串口工程类型(第二步) QT += serialport greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui # Default rules for deployment. qnx: target.path = /tmp/${TARGET}/bin else: unix:!android: target.path = /opt/${TARGET}/bin !isEmpty(target.path): INSTALLS += target
头文件源码:#ifndef MAINWINDOW_H #define MAINWINDOW_H #include // 引入串口通信的两个头文件(第一步) #include // 提供访问串口的功能 #include // 提供系统中存在的串口信息 QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); // 串口功能 void SerialPortInit(); // 串口初始化(参数配置) void RefreshSerialPort(int index); // 刷新串口 public slots: // 串口槽函数 void DataReceived(); // 接收数据 private slots: // 串口槽函数 void DataSend(); // 发送数据 void on_OpenSerialButton_clicked(); // 串口开关 void on_SendButton_clicked(); // 控件中添加 # void on_ClearButton_clicked(); // 清空控件中的所有 # void on_ClearShowButton_clicked(); // 清空接收到的数据 void LED(bool changeColor); // 开关显示灯 // 点击发送,接收数据 void on_SendEditBtn1_clicked(); void on_SendEditBtn2_clicked(); void on_SendEditBtn3_clicked(); void on_SendWordOrder_clicked(); private: Ui::MainWindow *ui; // 串口变量 QSerialPort *serial; // 定义全局的串口对象(第三步) // 参数配置 QStringList baudList; //波特率 QStringList parityList; //校验位 QStringList dataBitsList; //数据位 QStringList stopBitsList; //停止位 QStringList flowControlList; //控制流 }; #endif // MAINWINDOW_H
.cpp文件源码:#include "color:rgb(98 189 255)">mainwindow.h" #include "ui_color:rgb(98 189 255)">mainwindow.h" #include #include color:rgb(98 189 255)">MainWindow::color:rgb(98 189 255)">MainWindow(QWidget *parent) : Qcolor:rgb(98 189 255)">MainWindow(parent) , ui(new color:rgb(144 255 173)">Ui::color:rgb(98 189 255)">MainWindow) { ui->setupcolor:rgb(144 255 173)">Ui(this); SerialPortInit(); } // 串口初始化(参数配置) void color:rgb(98 189 255)">MainWindow::SerialPortInit() { serial = new color:rgb(98 189 255)">QSerialPort; //申请内存,并设置父对象 // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件 foreach(const color:rgb(98 189 255)">color:rgb(98 189 255)">QSerialPortInfo &color:rgb(73 238 255)">info,color:rgb(98 189 255)">color:rgb(98 189 255)">QSerialPortInfo::availablePorts()) { serial->setPort(color:rgb(73 238 255)">info); // 在对象中设置串口 if(serial->open(color:rgb(98 189 255)">QIODevice::ReadWrite)) // 以读写方式打开串口 { ui->PortBox->addItem(color:rgb(73 238 255)">info.portName()); // 添加计算机中的端口 serial->close(); // 关闭 } else { qDebug() << "串口打开失败,请重试"; } } // 参数配置 // 波特率,波特率默认选择color:rgb(255 95 0)">57600 ,禁止用户点击 ui->BaudBox->addItem("color:rgb(255 95 0)">57600"); serial->setBaudRate(color:rgb(98 189 255)">QSerialPort::Baudcolor:rgb(255 95 0)">57600); ui->BaudBox->setDisabled(true); // 校验,校验默认选择无 ui->ParityBox->addItem("无"); serial->setParity(color:rgb(98 189 255)">QSerialPort::NoParity); // 数据位,数据位默认选择8位 ui->BitBox->addItem("8"); serial->setDataBits(color:rgb(98 189 255)">QSerialPort::Data8); // 停止位,停止位默认选择1位 ui->StopBox->addItem("1"); serial->setStopBits(color:rgb(98 189 255)">QSerialPort::OneStop); // 控制流,默认选择无 ui->ControlBox->addItem("无"); serial->setFlowControl(color:rgb(98 189 255)">QSerialPort::NoFlowControl); // 刷新串口 RefreshSerialPort(0); // 信号 connect(serial,&color:rgb(98 189 255)">QSerialPort::readyRead,this,&color:rgb(98 189 255)">MainWindow::DataReceived); // 接收数据 connect(ui->SendWordOrder,&color:rgb(98 189 255)">QPushButton::clicked,this,&color:rgb(98 189 255)">MainWindow::DataSend); // 发送数据 connect(ui->SendButton,&color:rgb(98 189 255)">QPushButton::clicked,this,&color:rgb(98 189 255)">MainWindow::DataSend); // 发送数据 connect(ui->SendEditBtn1,&color:rgb(98 189 255)">QPushButton::clicked,this,&color:rgb(98 189 255)">MainWindow::DataSend); // 发送数据 connect(ui->SendEditBtn2,&color:rgb(98 189 255)">QPushButton::clicked,this,&color:rgb(98 189 255)">MainWindow::DataSend); // 发送数据 connect(ui->SendEditBtn3,&color:rgb(98 189 255)">QPushButton::clicked,this,&color:rgb(98 189 255)">MainWindow::DataSend); // 发送数据 } // 刷新串口 void color:rgb(98 189 255)">MainWindow::RefreshSerialPort(int index) { QStringList color:rgb(98 189 255)">portNameList; // 存储所有串口名 if(index != 0) { serial->setPortName(ui->PortBox->currentText()); //设置串口号 } else { ui->PortBox->clear(); //关闭串口号 ui->PortBox->addItem("刷新"); //添加刷新 foreach(const color:rgb(98 189 255)">color:rgb(98 189 255)">QSerialPortInfo &color:rgb(73 238 255)">info,color:rgb(98 189 255)">color:rgb(98 189 255)">QSerialPortInfo::availablePorts()) //添加新串口 { color:rgb(98 189 255)">portNameList.append(color:rgb(73 238 255)">info.portName()); } ui->PortBox->addItems(color:rgb(98 189 255)">portNameList); ui->PortBox->setCurrentIndex(1); // 当前串口号为COM1 serial->setPortName(ui->PortBox->currentText()); //设置串口号 } } // 接收数据,使用read () / readLine () / readAll () void color:rgb(98 189 255)">MainWindow::DataReceived() { char BUF[512] = {0}; // 存储转换类型后的数据 QByteArray color:rgb(73 238 255)">data = serial->readAll(); // 读取数据 if(!color:rgb(73 238 255)">data.isEmpty()) // 接收到数据 { QString color:rgb(255 111 119)">str = ui->DataReceived->toPlainText(); // 返回纯文本 color:rgb(255 111 119)">str += tr(color:rgb(73 238 255)">data); // 数据是一行一行传送的,要保存所有数据 ui->DataReceived->clear(); // 清空之前的数据 ui->DataReceived->append(color:rgb(255 111 119)">str); // 将数据放入控件中 qDebug() << "color:rgb(255 111 119)">str color:rgb(73 238 255)">info: " << ui->DataReceived->toPlainText(); // 清除之前的数据,防止追加,因为每次获取的数据不一样 int index = color:rgb(255 111 119)">str.indexOf("r "); // 找到,返回索引值,找不到,返回-1 if(index != -1) { snprintf(BUF,500,"%s", color:rgb(255 111 119)">str.left(index + 2).toUtf8().color:rgb(73 238 255)">data()); // QString转为char * 类型 qDebug() << "BUF color:rgb(73 238 255)">info: " << BUF; color:rgb(255 111 119)">str.remove(0,index + 2); // 处理获取到的数据,将其放入对应的控件中 // .... } } } // 发送数据,write () void color:rgb(98 189 255)">MainWindow::DataSend() { serial->write(ui->DataSend->toPlainText().toLatin1()); // 串口发送数据 } // 开关显示灯 void color:rgb(98 189 255)">MainWindow::LED(bool changeColor) { if(changeColor == false) { // 显示绿色 ui->LED->setStyleSheet("color:rgb(98 189 255)">background-color: qradialgradient(color:rgb(255 211 0)">spread:pad, color:rgb(144 255 173)">cx:0.5, color:rgb(144 255 173)">cy:0.5, color:rgb(255 211 0)">radius:0.5, color:rgb(144 255 173)">fx:0.5, color:rgb(144 255 173)">fy:0.5, color:rgb(73 238 255)">stop:0 rgba(0, 229, 0, 255), color:rgb(73 238 255)">stop:1 rgba(255, 255, 255, 255));border-color:rgb(255 211 0)">radius:12px;"); } else { // 显示红色 ui->LED->setStyleSheet("color:rgb(98 189 255)">background-color: qradialgradient(color:rgb(255 211 0)">spread:pad, color:rgb(144 255 173)">cx:0.5, color:rgb(144 255 173)">cy:0.5, color:rgb(255 211 0)">radius:0.5, color:rgb(144 255 173)">fx:0.5, color:rgb(144 255 173)">fy:0.5, color:rgb(73 238 255)">stop:0 rgba(255, 0, 0, 255), color:rgb(73 238 255)">stop:1 rgba(255, 255, 255, 255));border-color:rgb(255 211 0)">radius:12px;"); } } color:rgb(98 189 255)">MainWindow::~color:rgb(98 189 255)">MainWindow() { delete ui; } // 串口开关 void color:rgb(98 189 255)">MainWindow::on_OpenSerialButton_clicked() { if(serial->isOpen()) // 如果串口打开了,先给他关闭 { serial->clear(); serial->close(); // 关闭状态,按钮显示"打开串口" ui->OpenSerialButton->setText("打开串口"); // 关闭状态,允许用户操作 ui->BaudBox->setDisabled(false); ui->ParityBox->setDisabled(false); ui->BitBox->setDisabled(false); ui->StopBox->setDisabled(false); ui->ControlBox->setDisabled(false); // 禁止操作"发送字符操作" ui->SendWordOrder->setDisabled(true); ui->SendButton->setDisabled(true); // 关闭状态,颜色为绿色 ui->OpenSerialButton->setStyleSheet("color: green;"); // 关闭,显示灯为红色 LED(true); // 清空数据 ui->DataReceived->clear(); ui->DataSend->clear(); } else // 如果串口关闭了,先给他打开 { //当前选择的串口名字 serial->setPortName(ui->PortBox->currentText()); //用ReadWrite 的模式尝试打开串口,无法收发数据时,发出警告 if(!serial->open(color:rgb(98 189 255)">QIODevice::ReadWrite)) { QMessageBox::warning(this,tr("提示"),tr("串口打开失败!"),QMessageBox::Ok); return; } // 打开状态,按钮显示"关闭串口" ui->OpenSerialButton->setText("关闭串口"); // 打开状态,禁止用户操作 ui->BaudBox->setDisabled(true); ui->ParityBox->setDisabled(true); ui->BitBox->setDisabled(true); ui->StopBox->setDisabled(true); ui->ControlBox->setDisabled(true); // 允许操作"发送字符操作" ui->SendWordOrder->setDisabled(false); ui->SendButton->setDisabled(false); // 打开状态,颜色为红色 ui->OpenSerialButton->setStyleSheet("color: red;"); // 打开,显示灯为绿色 LED(false); } } // 控件中添加 # void color:rgb(98 189 255)">MainWindow::on_SendButton_clicked() { on_ClearButton_clicked(); ui->DataSend->append("###"); } // 清空控件 void color:rgb(98 189 255)">MainWindow::on_ClearButton_clicked() { ui->DataSend->setText(""); } // 清空接收到的数据 void color:rgb(98 189 255)">MainWindow::on_ClearShowButton_clicked() { ui->DataReceived->setText(""); } // 点击发送后,获取串口信息并展示在接受控件中 void color:rgb(98 189 255)">MainWindow::on_SendEditBtn1_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit1->text(); //获取发送框内容 ui->DataSend->setText(EditText); //将文本内容放在发送栏中 } void color:rgb(98 189 255)">MainWindow::on_SendEditBtn2_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit2->text(); //获取发送框内容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //将文本内容放在发送栏中 } void color:rgb(98 189 255)">MainWindow::on_SendEditBtn3_clicked() { on_ClearButton_clicked(); QString EditText = ui->Edit3->text(); //获取发送框内容 // qDebug() << "Edit1 text: " << EditText; ui->DataSend->append(EditText); //将文本内容放在发送栏中 } void color:rgb(98 189 255)">MainWindow::on_SendWordOrder_clicked() { on_SendButton_clicked(); }
运行后效果:
利益面前,各取所得文图胡云海在利益的面前,所谓的亲情,友情都会变的渺小及微不足道。没有利益观念的人不存在,每一个人都有不同的利益思想,画家亦如此。比如想出名,想被人认可,想有收获,想借画抒情等等,这
进击的巨人金句1。所谓好人,就是用来称呼对自己有用的人而已。不存在对所有人都有用的人,为了一个人的利益,可能就会侵犯另一个人的利益。谏山创进击的巨人2。无论你期望或者不期望,清晨依旧来临。谏山创
亲密关系寻找自我的旅程亲密关系是一部关于情感关系的经典力作。他告诉我们如何穿透自我障碍,用爱酿造幸福秘方没有人能年复一年地活在火辣热情浪漫的亲密关系之中,但我们能在亲密关系的旅途中,学习面对自己最好以及
在生活的路上,靠谁都不如靠自己文成哥图网络(如有侵权联系删除)在生活的路上,我们都是孤独的行者,而你是唯一真正能帮助你的人。活着就要学会自力更生,要在风雨中撑起自己的伞,遇到困难要闯关,受伤要有耐心。只有自己,
千里之外的真情实意年关将至,尽管悲观落寞而又无奈的情绪始终萦绕在心间。但是,面对寒冬之中时常冉冉升起又缓缓洒落在大地上的阳光,我又感受到了一阵阵浓厚的暖意。三年疫情之间,芸芸众生无不处在水深火热的煎
奉献让我快乐奉献让我快乐山重水复疑无路,柳暗花明又一村,人生总是在追寻中前行。回望历史,可以发现,只有奉献让我快乐,才能成为历史河流中一朵美丽的浪花。著名诗人于坚曾说这是一个喧嚣的时代,内心宁
梅县区入选2022中国最美县域榜单梅县区人民广场。南方日报记者何森垚摄在日前举行的第十八届中国(深圳)国际文化产业博览交易会上,发布了2022中国最美县域榜单,全国共有102个县(市区)入选。其中,梅县区榜上有名,
古代中国神话时期,禹是怎么征服部落的文晨语初听编辑老涵禹对苗族的反对尧帝发布了一道圣旨,而禹亲自佩戴着权威的玉佩,对苗族进行了惩罚性的远征。闪电和雷声突然出现,一个长着人的脸和鸟的身体的精灵手持一块玉碑来压制苗族的吉
中国农科院成功培育粉红色棉花记者杨舒通讯员葛晓阳从中国农业科学院棉花研究所获悉,该所棉花分子遗传改良创新团队成功将甜菜红素在棉花纤维中富集,创制出纤维呈现粉红色的棉花,为利用基因工程方法培育多类型彩色纤维棉提
新华全媒中国疾控中心专家XBB系列变异株未在我国形成传播优势国务院联防联控机制新闻发布会现场。新华社记者李恒摄对新冠病毒感染实施乙类乙管后,随着出入境管理政策发生变化,公众担心奥密克戎变异株XBB会很快在中国传播。对此,在1月8日举行的国务
市场日报沪指6连阳剑指3200点,牛市旗手爆发,白酒贵金属携手大涨,3000亿巨头逼近涨停今日,A股三大指数集体高开,沪指高开0。37,深成指高开0。38,创业板指高开0。46。黄金概念股开盘冲高,金一文化涨停,莱绅通灵一度触板,紫金矿业涨超9,赤峰黄金银泰黄金跟涨。消
共赴绿色之约看进博会上食品企业的双碳变革来源中国经济网中国经济网11月9日讯(记者刘潇潇施晓娟石兰)从帮助奶牛减少碳排放的瘤胃缓冲剂,到比传统工艺减碳60的智慧饮料瓶,再到降低碳足迹14的植物基牛奶包装盒在第五届中国国际
首届青山论坛论剑中国企业全球化发展11月7日,由温州市政府浙江大学青山控股集团共同主办的2022首届青山论坛在温州举办。论坛以中国企业全球化与高质量发展为主题,吸引国内外近400位嘉宾参加,共同探讨中国企业全球化发
新一单太空快递,即将发货据中国载人航天工程办公室消息,北京时间11月9日,天舟五号货运飞船与长征七号遥六运载火箭组合体垂直转运至发射区。目前,文昌航天发射场设施设备状态良好,后续将按计划开展发射前的各项功
年轻人偏爱旧东西?作者白露声明题图来源于网络。惊蛰研究所原创文章,如需转载请留言申请开白。都说流行是20年一个轮回,如今这套潮流轮回定律在电子消费领域再度上演。在智能手机获得快速发展的近20年里,厂
一场世界大战能让贫富差距重新洗牌解决贫富差距的方法只有两个,一个是战争,一个是工业技术改革,前者伤亡巨大,相当于社会重新洗牌,后者是三十年一轮的康氏周期,纵观我国从民国到现代商业的新中国,经历了各军阀内战,以及对
这届年轻人,不愿再等双11面对年轻一族,14岁的双11,需要新的故事。作者吴柯出品新摘商业评论14岁的双11老了吗?2009年11月11日,第一届双11诞生,这是1111第一次被赋予购物节的身份。那一年的双
丹麦世界杯名单确定21人埃里克森领衔霍伊别尔克亚尔入选北京时间11月8日凌晨,丹麦队公布了参加世界杯的名单。但与其他国家队不同,他们不是直接公布了26人大名单,而是公布了一份21人的名单,剩余的5个名额将在本周内揭晓。在这份21人名单
科学向日葵天文课堂变脸的月球小伙伴们,上一期我们说到了月亮,通过一首简单的歌谣认识了月球的基本属性。这一期的节目,我们将带领大家继续深入熟悉月球,一起来聊聊变脸的月球。人有悲欢离合,月有阴晴圆缺,朗朗上口的古
故事华夏第一睡仙陈抟老祖传下的异术龙眠术!探究梦的秘密今天的故事是关于怪梦的那些奇闻异事!人为什么会做梦呢?它与现实生活关系究竟是怎样的?睡梦的秘密?先讲一个古代历史上赫赫有名的睡梦专家陈抟老祖的故事!陈抟老祖,人称睡仙,史书上记载,
中国空间站CSS即将建成人类进入宇宙的最新前哨站科学实验舱梦天模块的发射成功,让中国空间站的建设最终完成。中国载人航天工程办公室于2022年10月31日成功发射中国空间站科学实验舱梦天。梦天之后成功对接了中国空间站的核心模块天和
用宇宙中天体数量,来推测外星人存在的可能,宇宙的恐怖远超想象在宇宙中是否存在和我们地球人类类似的外星智慧生命?为什么大部分人相信地球并不是唯一可以孕育生命的星球?这样推测的依据又是什么呢?我们今天通过几组数据来分析一下外星人存在的可能性,概