0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ITLV格式的概念及數(shù)據(jù)處理

我快閉嘴 ? 來(lái)源:嵌入式大雜燴 ? 作者:ZhengNL ? 2022-09-02 11:15 ? 次閱讀

嵌入式開(kāi)發(fā)中,常常會(huì)自定義一些協(xié)議格式,比如用于板與板之間的通信、客戶(hù)端與服務(wù)端之間的通信等。

自定義的協(xié)議格式可能有很多種,本篇文章我們來(lái)介紹一種很常用、實(shí)用、且靈活性很高的協(xié)議格式——ITLV格式。

什么是ITLV格式?

大家可能看到網(wǎng)絡(luò)上的很多文章用的是TLV(Tag、Length、Value)格式數(shù)據(jù)。實(shí)際中,可以根據(jù)實(shí)際需要進(jìn)行修改。我們這里稍微改一下,實(shí)際上也是大同小異的。

我們這里的ITLV各字段的含義:

  • I:ID或Index,用于區(qū)分是什么數(shù)據(jù)。
  • T:Type,代表數(shù)據(jù)類(lèi)型,如int、float等。
  • L:Length,表示數(shù)據(jù)的長(zhǎng)度(Value的長(zhǎng)度)。
  • V:Value,表示實(shí)際的數(shù)據(jù)。

其中,I、T、L是固定長(zhǎng)度的,在制定具體的數(shù)據(jù)協(xié)議之前,需要評(píng)估好當(dāng)前項(xiàng)目的數(shù)據(jù)會(huì)有多少、數(shù)據(jù)的最大長(zhǎng)度是多少,考慮好后續(xù)數(shù)據(jù)擴(kuò)展也可以保證協(xié)議通用。一般I設(shè)置為1~2字節(jié),T設(shè)置為1字節(jié),L設(shè)置為1~4字節(jié)。

下面我們制定一個(gè)格式:

93363076-2a6c-11ed-ba43-dac502259ad0.png

實(shí)際中,如果在物聯(lián)網(wǎng)系統(tǒng)中數(shù)據(jù)傳輸,我們用戶(hù)自定義的協(xié)議字段可能就只包含如上四個(gè)字段就可以了。比如我們公司的云平臺(tái)上的用戶(hù)數(shù)據(jù)格式用的就是類(lèi)似ITLV這樣的格式。用戶(hù)在制定協(xié)議時(shí)的協(xié)議字段包含如上字段就可以了。

沒(méi)有包頭做一些數(shù)據(jù)區(qū)分,也沒(méi)有校驗(yàn)字段,只包含如上字段就能保證數(shù)據(jù)可靠傳輸嗎?

因?yàn)槎嗽仆ㄐ挪捎肕QTT,基于TCP,TCP的特點(diǎn)就是可靠的,網(wǎng)絡(luò)協(xié)議中會(huì)帶有校驗(yàn)。并且,實(shí)際在傳輸用戶(hù)數(shù)據(jù)時(shí),還會(huì)再用戶(hù)數(shù)據(jù)之前增加一些字段區(qū)分這就是用戶(hù)數(shù)據(jù)。所以,其實(shí)基于它的設(shè)備SDK來(lái)進(jìn)行開(kāi)發(fā),操作的數(shù)據(jù)就是如上的數(shù)據(jù)。

但是,如果應(yīng)用于板與板之間的通信,只包含如上字段自然是有風(fēng)險(xiǎn)的。我們至少還需要還要包頭、校驗(yàn)字段。

實(shí)際中根據(jù)需要還可以增加其它字段,比如如果需要分包發(fā)送,還需要增加包號(hào);如果多塊板之間進(jìn)行通信,還需要增加發(fā)送數(shù)據(jù)目標(biāo)地址等。

這里我們?cè)黾影^與校驗(yàn)字段:

93491a56-2a6c-11ed-ba43-dac502259ad0.png

其中:

(1)Head固定為0x55、0xAA。

(2)Length為1字節(jié),即Value最大為256B。

ITLV格式數(shù)據(jù)處理

下面以例子來(lái)演示ITLV格式數(shù)據(jù)的處理。

93594c3c-2a6c-11ed-ba43-dac502259ad0.png

下面我們以上面我們制定的協(xié)議編寫(xiě)A板的組包、解析代碼。

1、設(shè)計(jì)相關(guān)數(shù)據(jù)結(jié)構(gòu)

首先,我們創(chuàng)建一個(gè)協(xié)議格式結(jié)構(gòu)體:

#pragmapack(1)
//協(xié)議格式
typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_tvalue[];
}protocol_format_t;

type字段的取值:

//TLV數(shù)據(jù)類(lèi)型type
typedefenum_tlv_type
{
TLV_TYPE_UINT8,
TLV_TYPE_INT8,
TLV_TYPE_UINT16,
TLV_TYPE_INT16,
TLV_TYPE_UINT32,
TLV_TYPE_INT32,
TLV_TYPE_STRING,
TLV_TYPE_FLOAT,
TLV_TYPE_BYTE_ARR,//字節(jié)數(shù)組
}tlv_type_e;

下面設(shè)計(jì)我們的收、發(fā)數(shù)據(jù)結(jié)構(gòu),大致思路如下:

936694aa-2a6c-11ed-ba43-dac502259ad0.png

我們創(chuàng)建一個(gè)總的結(jié)構(gòu)體,用于管理A板往B板發(fā)送及A板接受來(lái)自B板的數(shù)據(jù):

//總的協(xié)議數(shù)據(jù)
typedefstruct_protocol_data
{
protocol_id_eid;
protocol_value_tvalue;
}protocol_data_t;

其中,成員id是一個(gè)枚舉:

左右滑動(dòng)查看全部代碼>>>

//數(shù)據(jù)ID
typedefenum_protocol_id
{
//A板發(fā)往B板
PROTOCOL_ID_A_TO_B_BASE=0x00,
PROTOCOL_ID_A_TO_B_CTRL_CMD,
PROTOCOL_ID_A_TO_B_DATE_TIME,
PROTOCOL_ID_A_TO_B_END=0x7F,

//B板發(fā)往A板
PROTOCOL_ID_B_TO_A_BASE=0x80,
PROTOCOL_ID_B_TO_A_WORK_STATUS,
PROTOCOL_ID_B_TO_A_END=0xFF,
}protocol_id_e;

包含著A->B、B->A的ID,因?yàn)镮D是用1個(gè)字節(jié)標(biāo)識(shí),收、發(fā)的ID各預(yù)留一半,新增的ID在各自的BASE ID及END ID之間添加。

成員value是一個(gè)聯(lián)合體,用于管理A->B、B->A的value數(shù)據(jù):

左右滑動(dòng)查看全部代碼>>>

//所有協(xié)議數(shù)據(jù)value值
typedefunion_protocol_value
{
protocol_value_a_to_b_ta_to_b_value;
protocol_value_b_to_a_tb_to_a_value;
}protocol_value_t;

a_to_b_value及b_to_a_value也是聯(lián)合體,用于管理更細(xì)分的數(shù)據(jù):

左右滑動(dòng)查看全部代碼>>>

//A板發(fā)往B板的數(shù)據(jù)value值
typedefunion_protocol_value_a_to_b
{
protocol_data_ctrl_cmd_tctrl_cmd;
protocol_data_time_tdate_time;
}protocol_value_a_to_b_t;

//B板發(fā)往A板的數(shù)據(jù)value值
typedefunion_protocol_value_b_to_a
{
protocol_data_work_status_twork_status;
}protocol_value_b_to_a_t;

更細(xì)分的數(shù)據(jù):

左右滑動(dòng)查看全部代碼>>>

//控制命令
typedefenum_ctrl_cmd
{
CTRL_CMD_LED_ON,
CTRL_CMD_LED_OFF
}ctrl_cmd_e;

typedefstruct_protocol_data_ctrl_cmd
{
ctrl_cmd_ecmd;
}protocol_data_ctrl_cmd_t;

//時(shí)間數(shù)據(jù)
typedefstruct_protocol_data_time
{
intyear;
intmon;
intmday;
inthour;
intmin;
intsec;
}protocol_data_time_t;

//工作狀態(tài)
typedefenum_work_status
{
WORK_STATUS_NORMAL,
WORK_STATUS_ERROR
}work_status_e;

typedefstruct_protocol_data_work_status
{
work_status_estatus;
}protocol_data_work_status_t;

明確了我們需要進(jìn)行交互的數(shù)據(jù)的類(lèi)型之后,解析來(lái)我們就可以根據(jù)它們的特點(diǎn)來(lái)編寫(xiě)組包、解析函數(shù)了。

2、組包

大致思路如下:

93756d4a-2a6c-11ed-ba43-dac502259ad0.png

組包函數(shù):

左右滑動(dòng)查看全部代碼>>>

intprotocol_data_packet(uint8_t*buf,uint16_tlen,protocol_data_t*protocol_data)
{
intret=-1;
intvalue_len=0;
intoffset=0;
protocol_format_t*p_protocol_format=NULL;

if(!buf||!protocol_data||lenprintf("Invalidinputargument!
");
returnret;
}

//通過(guò)ID來(lái)獲取value的長(zhǎng)度
switch(protocol_data->id)
{
casePROTOCOL_ID_A_TO_B_CTRL_CMD:
{
printf("PROTOCOL_ID_A_TO_B_CTRL_CMD
");
value_len=sizeof(protocol_data->value.a_to_b_value.ctrl_cmd);
printf("protocol_format.length=%d
",value_len);
break;
}
casePROTOCOL_ID_A_TO_B_DATE_TIME:
{
printf("PROTOCOL_ID_A_TO_B_DATE_TIME
");
value_len=sizeof(protocol_data->value.a_to_b_value.date_time);
printf("value_len=%d
",value_len);
break;
}

default:
break;
}

//為協(xié)議格式數(shù)據(jù)申請(qǐng)內(nèi)存
p_protocol_format=(protocol_format_t*)malloc(sizeof(protocol_format_t)+value_len);
if(NULL==p_protocol_format)
{
printf("mallocerror
");
returnret;
}

//填充協(xié)議數(shù)據(jù)各字段
p_protocol_format->head=PROTOCOL_HEAD;
p_protocol_format->id=protocol_data->id;
p_protocol_format->type=TLV_TYPE_BYTE_ARR;
p_protocol_format->length=value_len;
if(p_protocol_format->length<=?PROTOCOL_VALUE_MAX_LEN)
????{
????????memcpy(p_protocol_format->value,&protocol_data->value.a_to_b_value,p_protocol_format->length);
}
else
{
printf("protocol_format.length>PROTOCOL_VALUE_MAX_LEN
");
}

//計(jì)算校驗(yàn)值
uint32_tcrc_data_len=sizeof(protocol_format_t)+value_len;
uint16_tcrc16=crc16_x25_check((uint8_t*)p_protocol_format,crc_data_len);
printf("crc16=%#x
",crc16);

//struct->buf
memcpy(buf,p_protocol_format,crc_data_len);
offset+=crc_data_len;
memcpy(buf+offset,&crc16,sizeof(uint16_t));
offset+=sizeof(uint16_t);

//釋放內(nèi)存
free(p_protocol_format);
p_protocol_format=NULL;

returnoffset;
}

3、解包

大致思路如下:

93884258-2a6c-11ed-ba43-dac502259ad0.png

解包函數(shù):

左右滑動(dòng)查看全部代碼>>>

//解包函數(shù)
voidprotocol_data_parse(protocol_data_t*protocol_data,uint8_t*buf,uint16_tlen)
{
protocol_format_t*p_protocol_format=NULL;

if(!buf||!protocol_data||lenprintf("Invalidinputargument!
");
return;
}

//為協(xié)議格式數(shù)據(jù)申請(qǐng)內(nèi)存
intvalue_len=buf[PROTOCOL_LENGTH_INDEX];
p_protocol_format=(protocol_format_t*)malloc(sizeof(protocol_format_t)+value_len);
if(NULL==p_protocol_format)
{
printf("mallocp_protocol_formaterror
");
return;
}

//buf->struct
memcpy(p_protocol_format,buf,sizeof(protocol_format_t)+value_len);
printf("protocol_data->id=%#x
",p_protocol_format->id);

//通過(guò)數(shù)據(jù)ID來(lái)解析各對(duì)應(yīng)的數(shù)據(jù)
switch(p_protocol_format->id)
{
casePROTOCOL_ID_B_TO_A_WORK_STATUS:
{
printf("PROTOCOL_ID_B_TO_A_WORK_STATUS
");
uint8_twork_status_len=sizeof(protocol_data->value.b_to_a_value.work_status);
if(p_protocol_format->length==work_status_len)
{
memcpy(&protocol_data->value.b_to_a_value.work_status,p_protocol_format->value,p_protocol_format->length);
}
else
{
printf("p_protocol_format->lengtherror
");
}
break;
}

default:
break;
}

//釋放內(nèi)存
free(p_protocol_format);
p_protocol_format=NULL;
}

4、CRC16校驗(yàn)

CRC16分很多種:CRC16-X25、CRC16-MODBUS、CRC16-XMODEM等。

這里我們使用CRC16-X25:

staticconstunsignedshortcrc16_table[256]=
{
0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf,
0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7,
0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e,
0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876,
0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd,
0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5,
0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c,
0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974,
0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb,
0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3,
0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a,
0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72,
0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9,
0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1,
0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738,
0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70,
0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7,
0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff,
0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036,
0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e,
0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5,
0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd,
0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134,
0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c,
0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3,
0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb,
0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232,
0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a,
0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1,
0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9,
0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330,
0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78
};

uint16_tcrc16_x25_check(uint8_t*data,uint32_tlength)
{
unsignedshortcrc_reg=0xFFFF;

while(length--)
{
crc_reg=(crc_reg>>8)^crc16_table[(crc_reg^*data++)&0xff];
}

return(uint16_t)(~crc_reg)&0xFFFF;
}

5、測(cè)試代碼

下面我們編寫(xiě)組包、解包測(cè)試代碼:

  • 組包控制命令數(shù)據(jù),并把組包之后的發(fā)送緩沖區(qū)中的數(shù)據(jù)打印出來(lái)。
  • 組包時(shí)間數(shù)據(jù),并把組包之后的發(fā)送緩沖區(qū)中的數(shù)據(jù)打印出來(lái)。
  • 從一個(gè)模擬的工作狀態(tài)接受緩沖區(qū)數(shù)據(jù)中解析工作狀態(tài)數(shù)據(jù)并打印出來(lái)。

測(cè)試代碼如:

左右滑動(dòng)查看全部代碼>>>

//微信公眾號(hào):嵌入式大雜燴
#include
#include
#include"protocol_tlv.h"

intmain(intarc,char*argv[])
{
staticuint8_tsend_buf[PROTOCOL_MAX_LEN]={0};
protocol_data_tprotocol_data_send={0};
intsend_len=0;

printf("
==============================testpacket===========================================
");
//模擬組包發(fā)送控制命令
bzero(send_buf,sizeof(send_buf));
bzero(&protocol_data_send,sizeof(protocol_data_t));
protocol_data_send.id=PROTOCOL_ID_A_TO_B_CTRL_CMD;
protocol_data_send.value.a_to_b_value.ctrl_cmd.cmd=CTRL_CMD_LED_OFF;
send_len=protocol_data_packet(send_buf,PROTOCOL_MAX_LEN,&protocol_data_send);
printf("sendctrldata=");
print_hex_data_frame(send_buf,send_len);

//模擬組包發(fā)送時(shí)間數(shù)據(jù)
bzero(send_buf,sizeof(send_buf));
bzero(&protocol_data_send,sizeof(protocol_data_t));
protocol_data_send.id=PROTOCOL_ID_A_TO_B_DATE_TIME;
protocol_data_send.value.a_to_b_value.date_time.year=2022;
protocol_data_send.value.a_to_b_value.date_time.mon=8;
protocol_data_send.value.a_to_b_value.date_time.mday=20;
protocol_data_send.value.a_to_b_value.date_time.hour=8;
protocol_data_send.value.a_to_b_value.date_time.min=8;
protocol_data_send.value.a_to_b_value.date_time.sec=8;
send_len=protocol_data_packet(send_buf,PROTOCOL_MAX_LEN,&protocol_data_send);
printf("senddate_timedata=");
print_hex_data_frame(send_buf,send_len);

printf("
==============================testparse===========================================
");
//模擬解析工作狀態(tài)數(shù)據(jù)
uint8_twork_status_buf[11]={0x55,0xAA,0x81,0x08,0x04,0x01,0x00,0x00,0x00,0xf2,0x88};
protocol_data_tprotocol_data_recv={0};

uint16_tcalc_crc16=crc16_x25_check(work_status_buf,sizeof(work_status_buf)-2);
uint16_trecv_crc16=(uint16_t)(work_status_buf[10]<8)|work_status_buf[9];

if(calc_crc16==recv_crc16)
{
protocol_data_parse(&protocol_data_recv,work_status_buf,sizeof(work_status_buf));
printf("work_status=%d
",protocol_data_recv.value.b_to_a_value.work_status.status);
}

return0;
}

編譯、運(yùn)行:

9398de24-2a6c-11ed-ba43-dac502259ad0.png

對(duì)照著我們制定的協(xié)議,數(shù)據(jù)完全正確!

ITLV格式的其它用法

ITLV格式具有很強(qiáng)的靈活性,我們這里使用的數(shù)據(jù)類(lèi)型Type為字節(jié)數(shù)組,其實(shí)使用字符串類(lèi)型也很常用,比如為了協(xié)議具備更強(qiáng)的可讀性、方便調(diào)試,可以在Value字段里再封裝一層JSON格式數(shù)據(jù)。其實(shí)我覺(jué)得Type的選項(xiàng)只保留字節(jié)數(shù)組及字符串就夠用了,可以滿足所有情況。

當(dāng)然,可能有些數(shù)據(jù)長(zhǎng)度總是定長(zhǎng)的,也可以用其它定長(zhǎng)的類(lèi)型。比如數(shù)據(jù)都是一些定長(zhǎng)的類(lèi)型,那么L字段也可以省略掉。實(shí)際中,比較通用的做法就是:全用字節(jié)數(shù)組或者全用字符串。別混著用,代碼可能會(huì)很混亂。

代碼獲取

大家如果需要本篇文章的demo工程,也可以在“嵌入式大雜燴”公眾號(hào)后臺(tái)回復(fù)關(guān)鍵詞:ITLV協(xié)議格式 ,即可獲取。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18836

    瀏覽量

    298968
  • 數(shù)據(jù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    551

    瀏覽量

    28453

原文標(biāo)題:分享一種靈活性很高的協(xié)議格式(附代碼例子)

文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是ITLV格式

    實(shí)際中,如果在物聯(lián)網(wǎng)系統(tǒng)中數(shù)據(jù)傳輸,我們用戶(hù)自定義的協(xié)議字段可能就只包含如上四個(gè)字段就可以了。比如我們公司的云平臺(tái)上的用戶(hù)數(shù)據(jù)格式用的就是類(lèi)似ITLV這樣的格式。用戶(hù)在制定協(xié)議時(shí)的協(xié)議
    的頭像 發(fā)表于 10-12 15:18 ?1575次閱讀

    數(shù)據(jù)處理程序

    數(shù)據(jù)處理程序各子程序總程序
    發(fā)表于 01-17 15:43

    數(shù)據(jù)處理問(wèn)題!

    數(shù)據(jù)處理基本包涵擬合,插值,濾波等,LabVIEW中一般處理的都是N行1列數(shù)據(jù),怎么處理N行,M列數(shù)據(jù),我現(xiàn)在需要將所有組
    發(fā)表于 05-08 22:43

    FPGA與CPLD的概念及其區(qū)別PDF

    FPGA與CPLD的概念及其區(qū)別
    發(fā)表于 08-15 15:46

    USB基本概念及從機(jī)編程方法介紹

    慕課蘇州大學(xué).嵌入式開(kāi)發(fā)及應(yīng)用.第四章.較復(fù)雜通信模塊.USB基本概念及從機(jī)編程方法0 目錄4 較復(fù)雜通信模塊4.4 USB基本概念及從機(jī)編程方法4.4.1 課堂重點(diǎn)4.4.2 測(cè)試與作業(yè)5 下一
    發(fā)表于 11-08 09:14

    嵌入式系統(tǒng)的概念及特點(diǎn)

    文章目錄嵌入式系統(tǒng)概要嵌入式系統(tǒng)的概念及特點(diǎn)嵌入式系統(tǒng)硬件嵌入式系統(tǒng)軟件嵌入式系統(tǒng)的編程模式微控制器的程序開(kāi)發(fā)方式嵌入式系統(tǒng)概要嵌入式系統(tǒng)的概念及特點(diǎn)1. 概念國(guó)外的定義:用于控制、監(jiān)視或者輔助操作
    發(fā)表于 12-22 06:36

    嵌入式系統(tǒng)的概念及特點(diǎn)

    嵌入式系統(tǒng)概要嵌入式系統(tǒng)概要1.嵌入式系統(tǒng)的概念及特點(diǎn)2.嵌入式硬件3.嵌入式系統(tǒng)軟件4.嵌入式系統(tǒng)編程模式5.微控制器的程序開(kāi)發(fā)方式嵌入式系統(tǒng)概要1.嵌入式系統(tǒng)的概念及特點(diǎn)2.嵌入式硬件3.嵌入式系統(tǒng)軟件4.嵌入式系統(tǒng)編程模式5.微控制器的程序開(kāi)發(fā)方式...
    發(fā)表于 12-22 07:21

    數(shù)據(jù)處理同步的問(wèn)題

    有一個(gè)概念性的問(wèn)題:用隊(duì)列讀取數(shù)據(jù)處理。入隊(duì)列與出隊(duì)列是不同的兩個(gè)循環(huán)。每循環(huán)一次從出隊(duì)列去一個(gè)數(shù)據(jù)處理。如果出隊(duì)列的循環(huán)快于入隊(duì)列的循環(huán),必然導(dǎo)致隊(duì)列緩存讀空。我現(xiàn)在就遇到這種問(wèn)題
    發(fā)表于 03-09 03:36

    檢測(cè)數(shù)據(jù)處理基礎(chǔ)知識(shí)

    檢測(cè)數(shù)據(jù)處理基礎(chǔ)知識(shí)誤差及相關(guān)概念 → 真實(shí)值與標(biāo)準(zhǔn)值   誤差是測(cè)量值與真實(shí)結(jié)果之間的差異,要想知道誤差的大小,必須知道真實(shí)的結(jié)果,這
    發(fā)表于 11-09 15:46 ?966次閱讀

    誤差分析與數(shù)據(jù)處理基礎(chǔ)

    3.1 誤差的概念與分類(lèi) 3.1.1 測(cè)量誤差的概念及表達(dá)式 3.1.2 測(cè)量誤差的分析 3.2 隨機(jī)誤差的處理 3.2.1 隨機(jī)誤差的概率分布 3.2.2 被測(cè)量真值和測(cè)量方差的估計(jì)值 3.2.3 測(cè)量結(jié)果的置信度與表示方法
    發(fā)表于 03-13 20:19 ?0次下載

    游客游跡RFID數(shù)據(jù)處理與清洗方法研究與實(shí)現(xiàn)

    針對(duì)游客游跡跟蹤與追溯系統(tǒng),本文深入分析了游客游跡不確定數(shù)據(jù)產(chǎn)生的原因,根據(jù)景區(qū)應(yīng)用特點(diǎn),提出了一種游客游跡RFID數(shù)據(jù)處理與清洗方法。在數(shù)據(jù)處理時(shí),引入事件概念,設(shè)計(jì)
    發(fā)表于 07-25 17:52 ?24次下載
    游客游跡RFID<b class='flag-5'>數(shù)據(jù)處理</b>與清洗方法研究與實(shí)現(xiàn)

    數(shù)據(jù)處理指令的尋址方式解析

    4.1 數(shù)據(jù)處理指令的尋址方式 4.1.1 數(shù)據(jù)處理指令的尋址方式概要 數(shù)據(jù)處理指令的基本語(yǔ)法格式如下。 《opcode》 {《cond》} {S} 《Rd》,《Rn
    發(fā)表于 10-18 14:45 ?2次下載
    <b class='flag-5'>數(shù)據(jù)處理</b>指令的尋址方式解析

    Thumb數(shù)據(jù)處理指令

    Thumb數(shù)據(jù)處理指令 數(shù)據(jù)處理指令是指那些操作寄存器中數(shù)據(jù)的指令。Thumb指令集中的數(shù)據(jù)處理指令是ARM指令集數(shù)據(jù)處理指令的一個(gè)子集,其
    發(fā)表于 10-19 10:04 ?0次下載

    智能電網(wǎng)的概念及通信技術(shù)詳解

    智能電網(wǎng)的概念及通信技術(shù)詳解
    發(fā)表于 11-21 20:41 ?1132次閱讀

    S參數(shù)的概念及應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《S參數(shù)的概念及應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 08-12 14:29 ?0次下載