移植与电子模块通信相关代码
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include "crc.h"
|
||||
#include "dev_flash.h"
|
||||
#include "codec.h"
|
||||
#include "elec_det.h"
|
||||
|
||||
|
||||
|
||||
@@ -199,6 +200,76 @@ protuc_codec_export(ym_coder,protu_decode2,protu_encode2);
|
||||
|
||||
|
||||
|
||||
// 小板协议解码
|
||||
array_def *protm_decode(protu_def *p,array_def *data)
|
||||
{
|
||||
array_def *r=arr_creat();
|
||||
param_check(r);
|
||||
str_set(p->str_err,"ok");
|
||||
if(arr_length(data)<10)
|
||||
{
|
||||
DBG_WARN("recv data len too less.");
|
||||
DBG_WARN("data=%s",str_temp(arr_string(data)));
|
||||
str_set(p->str_err,"recv data len too less.");
|
||||
return r;
|
||||
}
|
||||
uint8_t src=arr_get(data,4);
|
||||
uint8_t dst=arr_get(data,5);
|
||||
if((src!=0)||(dst!=elec_local_addr())){
|
||||
DBG_WARN("src_addr/dst_addr not allowed.");
|
||||
DBG_WARN("data=%s",str_temp(arr_string(data)));
|
||||
str_set(p->str_err,"src_addr/dst_addr not allowed.");
|
||||
return r;
|
||||
}
|
||||
uint16_t len=arr_get(data,2)|(arr_get(data,3)<<8);
|
||||
uint8_t crc=crc_crc8(arr_data(data),arr_length(data)-1);
|
||||
if(len!=arr_length(data))
|
||||
{
|
||||
// 如果长度不相等则产生了数据丢失
|
||||
DBG_WARN("recv data have lossed.");
|
||||
str_set(p->str_err,"recv data have lossed.");
|
||||
return r;
|
||||
}
|
||||
uint16_t no=arr_get(data,7)|(arr_get(data,8)<<8);
|
||||
uint16_t h_no=p->cmd_no;
|
||||
if(no!=h_no)
|
||||
{
|
||||
// 发送一条指令等待其返回,此时流水号应相同
|
||||
//DBG_WARN("slave_addr=%d cmd_no error:h_no=%d,no=%d.",src,h_no,no);
|
||||
//str_set(p->str_err,"cmd no err.");
|
||||
//return r;
|
||||
}
|
||||
if(crc!=arr_get(data,-1))
|
||||
{
|
||||
DBG_WARN("recv data crc check error:%02x,%02x.",crc,arr_get(data,-1));
|
||||
str_set(p->str_err,"crc check err.");
|
||||
}
|
||||
p->cmd=arr_get(data,6);
|
||||
arr_delete(r);
|
||||
return arr_mid(data,9,len-10);
|
||||
}
|
||||
|
||||
|
||||
// 编码
|
||||
array_def *protm_encode(protu_def *p,array_def *data)
|
||||
{
|
||||
array_def *t=arr_creat();
|
||||
param_check(t);
|
||||
uint16_t len=arr_length(data)+10;
|
||||
arr_append(t,'Y');
|
||||
arr_append(t,'e');
|
||||
arr_append(t,len&0xff);
|
||||
arr_append(t,len>>8);
|
||||
arr_append(t,elec_local_addr());// 源地址
|
||||
arr_append(t,0);// 目标地址
|
||||
arr_append(t,p->cmd);// 命令码
|
||||
arr_append(t,p->cmd_no&0xff);
|
||||
arr_append(t,p->cmd_no>>8);
|
||||
arr_appends_from(t,data);
|
||||
arr_append(t,crc_crc8(arr_data(t),arr_length(t)));
|
||||
return t;
|
||||
}
|
||||
|
||||
protuc_codec_export(ym_slave,protm_decode,protm_encode);
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user