首页 > 代码库 > TinyOS系列——服务器远程指令多跳实现过程中问题及解决方案

TinyOS系列——服务器远程指令多跳实现过程中问题及解决方案

开发经验:

1、嵌入式程序,调试可能比较麻烦,一定要有耐心,戒骄戒躁

2、开发之前一定要理清自己的逻辑框架,不然只能越写越乱

3、代码开发与测试迭代进行,一步一步,如果代码量过大,很难跟踪找到问题出错的点

 

开发步骤:

模块开发必须理清自己的思路以及逻辑,学会分步进行:

1、测试节点C[i]是否能够正常接收、发送数据,全部需要测试一遍,确定节点能否正常使用,否则后续工作无法正常进行
2、测试发送模块A向基站B广播消息后,基站B能否正常接收
3、修改发送模块与节点程序,测试发送模块A->节点c[0]->基站B(ACK)是否正常 (关键步骤
4、修改c[i],测试发送模块A->c[0]->c[1]->c[2]->c[3]->c[4],c[4]广播ACK到基站B是否正常
5、模块任务完成

 

开发过程中遇见的问题以及解决方案:

1、问题一,越界问题:cc2420发送模块,一条消息的最大长度为26字节(带控制信息),所以在data部分,要控制好包的长度,否则无法消息无法正常传递

 1 typedef nx_struct PCUartCmd { 2     nx_uint8_t nodeid;         3     nx_uint16_t data; 4              5     nx_uint8_t relay1; 6     nx_uint8_t relay2; 7     nx_uint8_t relay3; 8     nx_uint8_t relay4; 9     nx_uint8_t relay5;10     11     nx_uint8_t  yuliu;12 } PCUartCmd;13 14 typedef nx_struct PCUartCmd_ack{15     nx_uint8_t nodeid;16     17     nx_uint8_t type;18     19     nx_uint8_t relay1;20     nx_uint8_t relay2;21     nx_uint8_t relay3;22     nx_uint8_t relay4;23     nx_uint8_t relay5;24     25     nx_uint8_t  yuliu;26 }PCUartCmd_ack;

  解决方案:

  1)尽量减少字节的使用:比如有5个relay值来记录中间路由,完全可以将hop去掉,通过优化算法来减少字节数使用

  2)如果ACK只是起确定消息是否正常到达的作用,那么ACK包完全没有必要带data值

2、问题二,如果struct中最后没有设定额外的字节,在串口调试助手中data的最后一个字节无法正常显示

  解决方案:

  1)每个struct设计,最后都要有yuliu值,否则在串口调试助手中无法正常显示data的最后一个字节,会跟控制信息出现冗余

却分

3、问题三,程序冗长

  解决方案:

  1)公共部分提取,构造函数实现

 1 void SendCmdMsg(int nodeId,int cmd,int relay1,int relay2,int relay3,int relay4,int relay5,int yuliu) 2 { 3  4     PCUartCmd* cmdpkt = (PCUartCmd*)(call Packet.getPayload(&pkt, sizeof(PCUartCmd))); 5      6     cmdpkt->nodeid = nodeId; 7     cmdpkt->data =http://www.mamicode.com/ cmd; 8      9     cmdpkt->relay1 = relay1;10     cmdpkt->relay2 = relay2;11     cmdpkt->relay3 = relay3;12     cmdpkt->relay4 = relay4;13     cmdpkt->relay5 = relay5;14     cmdpkt->yuliu = yuliu;15     call AMSend.send(nodeId, &pkt, sizeof(PCUartCmd));16 17 }