串列埠通訊上位機資料傳輸協議

負號quiet發表於2018-11-16

一、上位機協議
1.1 上位機對下位機<–傳送引數–>協議
1.1.1 協議表
在這裡插入圖片描述
1.2.1 協議解釋
傳送資料包引數協議一個資料包或者一個資料幀的資料長度為21位元組,其中資料頭2位元組,資料型別1位元組,資料長度1位元組,資料塊14位元組,校驗碼1位元組,資料尾2位元組。
資料頭和資料尾為人為設定,資料型別共有兩種0x01和0x02;0x01為傳送引數,0x02為傳送命令;資料塊長度為要傳送的資料配置引數如波特率等;校驗碼為人為設定,也可以為其它資料的求和;資料尾為人為設定。
由於串列埠傳送資料每次只能傳送1個位元組,而實際引數(比如波特率為115200)位元組數不為1個位元組,因此,為了統一需要將其先存放在4位元組的int中,然後將其拆分成4個位元組的陣列形式;然後用串列埠傳送到下位機(採集節點),下位機對資料包進行解析,同時提取資料塊資料,對資料塊中的單個位元組進行合成,合成後配置下位機引數。

1.2.3上位機對下位機傳送引數配置協議部分程式碼
用的是qt寫上位機

/*--------------------------------<--資料包初始化-->--------------------------------*/
//資料包初始化
Host_Communication_Protocol Data_Packet;//資料包(幀)
/*--------<--幀頭-->--------*/
Data_Packet.Head0=0xAA;//幀頭0
Data_Packet.Head1=0x55;//幀頭1

Data_Packet.Type=0x01;//命令型別
Data_Packet.Length=14;//資料塊長度(單位位元組)

/*--------<--資料塊-->--------*/
//資料塊,資料塊拆解成單位元組,<--由於write()只能發單位元組,因此上位機需要將4位元組的拆成1個位元組,下位機再合成-->
Data_Packet.Data.Baud_Rate=ui->comboBox_2->currentText().toUInt();//波特率
Data_Packet.Data.Sampling_Length=ui->comboBox_3->currentText().toUInt();;//取樣長度(點)
Data_Packet.Data.Sampling_Rate=ui->comboBox_4->currentText().toUInt();;//取樣率

char Baud_Rate_Byte[4];//波特率
Baud_Rate_Byte[0]=Data_Packet.Data.Baud_Rate>>24;//高位元組
Baud_Rate_Byte[1]=Data_Packet.Data.Baud_Rate>>16;
Baud_Rate_Byte[2]=Data_Packet.Data.Baud_Rate>>8;
Baud_Rate_Byte[3]=Data_Packet.Data.Baud_Rate;//低位元組

char Sampling_Length_Byte[4];//取樣長度(點)
Sampling_Length_Byte[0]=Data_Packet.Data.Sampling_Length>>24;//高位元組
Sampling_Length_Byte[1]=Data_Packet.Data.Sampling_Length>>16;
Sampling_Length_Byte[2]=Data_Packet.Data.Sampling_Length>>8;
Sampling_Length_Byte[3]=Data_Packet.Data.Sampling_Length;//低位元組

char Sampling_Rate_Byte[4];//取樣率
Sampling_Rate_Byte[0]=Data_Packet.Data.Sampling_Rate>>24;//高位元組
Sampling_Rate_Byte[1]=Data_Packet.Data.Sampling_Rate>>16;
Sampling_Rate_Byte[2]=Data_Packet.Data.Sampling_Rate>>8;
Sampling_Rate_Byte[3]=Data_Packet.Data.Sampling_Rate;//低位元組

Data_Packet.Data.Trigger_Voltage=ui->comboBox_5->currentText().toUShort();//觸發電壓
Data_Packet.Data.Sampling_Mode=ui->comboBox_6->currentIndex();//取樣模式

/*--------<--幀尾-->--------*/
Data_Packet.Check=0x03;//校驗碼

Data_Packet.End0=0x55;//幀尾0
Data_Packet.End1=0xAA;//幀尾1


/*--------------------------------<--資料包存放到緩衝區-->--------------------------------*/
//將資料包放到陣列裡面
QByteArray Data_Packet_Buffer;//資料包緩衝區
Data_Packet_Buffer.append(Data_Packet.Head0);//幀頭0
Data_Packet_Buffer.append(Data_Packet.Head1);//幀頭1

Data_Packet_Buffer.append(Data_Packet.Type);//命令型別
Data_Packet_Buffer.append(Data_Packet.Length);//資料塊長度(單位位元組)

Data_Packet_Buffer.append(Baud_Rate_Byte[0]);//波特率
Data_Packet_Buffer.append(Baud_Rate_Byte[1]);
Data_Packet_Buffer.append(Baud_Rate_Byte[2]);
Data_Packet_Buffer.append(Baud_Rate_Byte[3]);

Data_Packet_Buffer.append(Sampling_Length_Byte[0]);//取樣長度(點)
Data_Packet_Buffer.append(Sampling_Length_Byte[1]);
Data_Packet_Buffer.append(Sampling_Length_Byte[2]);
Data_Packet_Buffer.append(Sampling_Length_Byte[3]);

Data_Packet_Buffer.append(Sampling_Rate_Byte[0]);//取樣率
Data_Packet_Buffer.append(Sampling_Rate_Byte[1]);
Data_Packet_Buffer.append(Sampling_Rate_Byte[2]);
Data_Packet_Buffer.append(Sampling_Rate_Byte[3]);

Data_Packet_Buffer.append(Data_Packet.Data.Trigger_Voltage);//觸發電壓
Data_Packet_Buffer.append(Data_Packet.Data.Sampling_Mode);//取樣模式

Data_Packet_Buffer.append(Data_Packet.Check);//校驗碼

Data_Packet_Buffer.append(Data_Packet.End0);//幀尾0
Data_Packet_Buffer.append(Data_Packet.End1);//幀尾1

pSerialCollection->write(Data_Packet_Buffer);

相關文章