title: 通信协议的打包与拆包基础运用的核心代码
date: 2023-07-22 17:45:00
tags:

mcu与上位机通信之数据协议的设计

---

1.stm32端主要实现代码

void head(void)
{
    headEnderDate[0] = 0xaa;	
    headEnderDate[1] = 0x66;
    headEnderDate[2] = 0x14;
    headEnderDate[3] = 0x14;
    headEnderDate[4] = 0x3;
    headEnderDate[5] = '\r';
    headEnderDate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,headEnderDate,7,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
}

void over(void)
{
    headEnderDate[0] = 0xaa;	
    headEnderDate[1] = 0x77;
    headEnderDate[2] = 0x88;
    headEnderDate[3] = 0xff;
    headEnderDate[4] = 0x00;
    headEnderDate[5] = '\r';
    headEnderDate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,headEnderDate,7,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
}

示例

void head(void)
{
    headEnderDate[0] = 0xaa;	
    headEnderDate[1] = 0x66;
    headEnderDate[2] = 0x14;
    headEnderDate[3] = 0x14;
    headEnderDate[4] = 0x3;
    headEnderDate[5] = '\r';
    headEnderDate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,headEnderDate,7,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
}

void over(void)
{
    headEnderDate[0] = 0xaa;	
    headEnderDate[1] = 0x77;
    headEnderDate[2] = 0x88;
    headEnderDate[3] = 0xff;
    headEnderDate[4] = 0x00;
    headEnderDate[5] = '\r';
    headEnderDate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,headEnderDate,7,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
}

void enderF(void)
{

    HAL_UART_Transmit(&UART1_Handler,ender,2,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
}

void pic1(void)
{
    i =0;
    headEnderDate[0] = 0xaa;	
    headEnderDate[1] = 0x66;
    headEnderDate[2] = 0x5;
    headEnderDate[3] = 0x5;
    headEnderDate[4] = 0x3;
    headEnderDate[5] = '\r';
    headEnderDate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,headEnderDate,7,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
	
	
    for(i =0;i<25;i++){
//			maindate[0] = 0xaa;	
//			maindate[1] = 0x55;
    maindate[0 ]= img[i][0];
    maindate[1] = img[i][1];
    maindate[2] = img[i][2];
//			maindate[5] = '\r';
//			maindate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,maindate,3,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
//			delay_ms(5);
    }
    //enderF();
    over();
}

void pic2(void)
{
	i =0;
    head();	
    for(i =0;i<400;i++){
//		maindate[0] = 0xaa;	
//		maindate[1] = 0x55;
	maindate[0] = img2[i][0];
    maindate[1] = img2[i][1];
    maindate[2] = img2[i][2];
    HAL_UART_Transmit(&UART1_Handler,maindate,3,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
//			delay_ms(5);
    }
    over();

}


void pic3(void)
{
    i =0;
    headEnderDate[0] = 0xaa;	
    headEnderDate[1] = 0x66;
    headEnderDate[2] = 0x32;
    headEnderDate[3] = 0x32;
    headEnderDate[4] = 0x3;
    headEnderDate[5] = '\r';
    headEnderDate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,headEnderDate,7,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
	
	
    for(i =0;i<2500;i++){
//			maindate[0] = 0xaa;	
//			maindate[1] = 0x55;
    maindate[0 ]= img3[i][0];
    maindate[1] = img3[i][1];
    maindate[2] = img3[i][2];
//			maindate[5] = '\r';
//			maindate[6] = '\n';
    HAL_UART_Transmit(&UART1_Handler,maindate,3,1000);	//发送接收到的数据
    while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
    USART_RX_STA=0;
//			delay_ms(5);
    }
    //enderF();
    over();

}

2.上位机端主要实现代码

//判断是否开始接收
if((unsigned char)temp2[0] == 170 ){
    if(((unsigned char)temp2[1] == 102)&&((unsigned char)temp2[5] == 13)){

        flag_rx_pic = true;    //开启开始接收标志位
        pic_wi = (unsigned char)temp2[2];
        pic_he = (unsigned char)temp2[3];
        pic_ch = (unsigned char)temp2[4];
        ui->progressBar->setRange(0,100);
        ui->progressBar->setValue(0);
        qDebug("wi = %d,he = %d,ch = %d",(unsigned char)temp2[2],(unsigned char)temp2[3],(unsigned char)temp2[4]);
    }
}

//数据接收
if(flag_rx_pic ==true){
    if(((unsigned char)temp[7+pic_ch*pic_he+0] == 170 )         //判断是否接收完图片
        &&((unsigned char)temp[7+pic_ch*pic_he*3+1] == 119 )
        &&((unsigned char)temp[7+pic_ch*pic_he*3+2] == 136 )
        &&((unsigned char)temp[7+pic_ch*pic_he*3+3] == 255 )
        &&((unsigned char)temp[7+pic_ch*pic_he*3+4] == 0 ))
    {
        flag_rx_date =true; //开启接受结束标志位,开始数据拷贝
        flag_rx_pic =false; //清除接受标志位
        temp2.clear();
    }
    else {


        temp +=temp2;
        temp2.clear();
        //qDebug()<<"**********************";
        //qDebug()<<temp;
        //qDebug()<<temp.size();
//            qDebug("temp[7+pic_ch*pic_he*3+0] = %d\ntemp[7+pic_ch*pic_he*3+1] = %d\ntemp[7+pic_ch*pic_he*3+2] = %d",
//                    (unsigned char)temp[temp.size()-7],
//                    (unsigned char)temp[temp.size()-6],
//                    (unsigned char)temp[temp.size()-5]);
    }

    if(((unsigned char)temp[temp.size()-7] == 170 )         //判断是否接收完图片
        &&((unsigned char)temp[temp.size()-6] == 119 )
        &&((unsigned char)temp[temp.size()-5] == 136 )
        &&((unsigned char)temp[temp.size()-4] == 255 )
        &&((unsigned char)temp[temp.size()-3] == 0 ))
    {
        flag_rx_date =true; //开启接受结束标志位,开始数据拷贝
        flag_rx_pic =false; //清除接受标志位
        temp2.clear();
        ui->progressBar->setValue(20);
    }
}

示例

void MainWindow::serial_readyRead(QByteArray temp2)
{

    //判断是否开始接收
    if((unsigned char)temp2[0] == 170 ){
        if(((unsigned char)temp2[1] == 102)&&((unsigned char)temp2[5] == 13)){

            flag_rx_pic = true;    //开启开始接收标志位
            pic_wi = (unsigned char)temp2[2];
            pic_he = (unsigned char)temp2[3];
            pic_ch = (unsigned char)temp2[4];
            ui->progressBar->setRange(0,100);
            ui->progressBar->setValue(0);
            qDebug("wi = %d,he = %d,ch = %d",(unsigned char)temp2[2],(unsigned char)temp2[3],(unsigned char)temp2[4]);
        }
    }

    //数据接收
    if(flag_rx_pic ==true){
        if(((unsigned char)temp[7+pic_ch*pic_he+0] == 170 )         //判断是否接收完图片
           &&((unsigned char)temp[7+pic_ch*pic_he*3+1] == 119 )
           &&((unsigned char)temp[7+pic_ch*pic_he*3+2] == 136 )
           &&((unsigned char)temp[7+pic_ch*pic_he*3+3] == 255 )
           &&((unsigned char)temp[7+pic_ch*pic_he*3+4] == 0 ))
        {
            flag_rx_date =true; //开启接受结束标志位,开始数据拷贝
            flag_rx_pic =false; //清除接受标志位
            temp2.clear();
        }
        else {


            temp +=temp2;
            temp2.clear();
            //qDebug()<<"**********************";
            //qDebug()<<temp;
            //qDebug()<<temp.size();
//            qDebug("temp[7+pic_ch*pic_he*3+0] = %d\ntemp[7+pic_ch*pic_he*3+1] = %d\ntemp[7+pic_ch*pic_he*3+2] = %d",
//                    (unsigned char)temp[temp.size()-7],
//                    (unsigned char)temp[temp.size()-6],
//                    (unsigned char)temp[temp.size()-5]);
        }

        if(((unsigned char)temp[temp.size()-7] == 170 )         //判断是否接收完图片
           &&((unsigned char)temp[temp.size()-6] == 119 )
           &&((unsigned char)temp[temp.size()-5] == 136 )
           &&((unsigned char)temp[temp.size()-4] == 255 )
           &&((unsigned char)temp[temp.size()-3] == 0 ))
        {
            flag_rx_date =true; //开启接受结束标志位,开始数据拷贝
            flag_rx_pic =false; //清除接受标志位
            temp2.clear();
            ui->progressBar->setValue(20);
        }
    }
    //数据拷贝
    if(flag_rx_date ==true){
        flag_rx_date = false;
        for(he = 0;he<pic_he;he++){
            for(wi =0;wi<pic_wi;wi++){
                picbuf[he][wi][2] = (unsigned char)temp[7+ he*pic_wi*3 +wi*3+0];
                picbuf[he][wi][1] = (unsigned char)temp[7+ he*pic_wi*3 +wi*3+1];
                picbuf[he][wi][0] = (unsigned char)temp[7+ he*pic_wi*3 +wi*3+2];
            }
            //qDebug()<<"he = "<<he;
        }
        ui->progressBar->setValue(40);
        //QByteArray piccc = QByteArray((const char*)picbuf);
       // qDebug()<<piccc;
        //qDebug()<<piccc.size();
        flag_pic = true;        //开启图片显示标志位
        flag_rx_date = false;   //关闭数据处理标志位
    }


    if(flag_pic == true){
        flag_pic = false;      //清除图片显示标志位,开始显示图片

        qDebug()<<"pic";
        cv::Mat picc(pic_he,pic_wi,CV_8UC3);
        Vec3b bgr=picc.at<Vec3b>(pic_he,pic_wi);

        for(unsigned int i =0;i<pic_he;i++){
            for(unsigned int j = 0;j<pic_wi;j++){
                for(unsigned int k =0;k<pic_ch;k++){
                   picc.at<Vec3b>(i, j)[k] = picbuf[i][j][k];
                }
            }
        }

        ui->progressBar->setValue(100);
        cv::cvtColor(picc, picc, CV_BGR2RGB);//BGR convert to RGB
        QImage Qtemp = QImage((const unsigned char*)(picc.data), picc.cols, picc.rows, picc.step, QImage::Format_RGB888);
        Qtemp.scaled(ui->label->size(),Qt::KeepAspectRatio);//把图片
        ui->label->setScaledContents(true);
        ui->label->setPixmap(QPixmap::fromImage(Qtemp));
        //ui-> label->resize(Qtemp.size());
        ui->label->show();
//        namedWindow( "Display window", cv::WINDOW_NORMAL );
//        imshow( "Display window", picc);
//        cvWaitKey(0);
        temp.clear();
    }
}

文章作者: 戎劲羽
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 羽老板的心事
串口通信 通信 python
喜欢就支持一下吧