通信协议的打包与拆包基础运用的核心代码
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 许可协议。转载请注明来自
羽老板的心事!
喜欢就支持一下吧