|
数据是以数据包为单位传输的,就像手册里说的,每个数据包由同步信号,控制指令,数据长度和校验和组成(当然这种组成方式是人为设定的,不同厂家很可能不同,但基本大同小异)
FC并不主动发送数据,需要上位机向其发送指令后按要求返回数据(也是以包为单位),上位机收到这个包后要对这个包进行解析,提取自己需要的内容。
我是使用同步信号和数据长度来获取一个完整的数据包的,然后通过校验和判断数据是否正确。
以下是解析部分的代码
if(getone==1)
{
getone=0;
if(rxd_buffer_locked) return; // if rxd buffer is locked immediately return
// the rxd buffer is unlocked
if((ptr_rxd_buffer == 0) && (c == 0x24)) // if rxd buffer is empty and syncronisation character is received
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
crc = c; // init crc
Form1->Memo1->Lines->Add("start");
kaishi=1;
return;
}
if((ptr_rxd_buffer == 1)&& kaishi==1)
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
kaishi=2;
Form1->Memo1->Lines->Add("start1");
return;
}
if((ptr_rxd_buffer == 2)&& kaishi==2)
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
kaishi=3;
Form1->Memo1->Lines->Add("start2");
return;
}
if (ptr_rxd_buffer-3 < rxd_buffer[2]&&kaishi==3) // collect incomming bytes
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
return;
}
else
{
kaishi=4;
}
if (ptr_rxd_buffer-3 == rxd_buffer[2]&&kaishi==4)
{
Form1->Memo1->Lines->Add("start3");
rxd_buffer[ptr_rxd_buffer] = c; // copy byte to rxd buffer
if(crc==rxd_buffer[ptr_rxd_buffer])
{
ReceivedBytes = ptr_rxd_buffer + 1;// store number of received bytes
rxd_buffer_locked = TRUE; // lock the rxd buffer
Form1->Memo1->Lines->Add("okk");
Form1->Button4->Click() ;//数据处理并绘图
}
else
{ // checksum invalid
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
kaishi=0;
crc=0;
}
} |
|