开发经验:
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 = 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 }
TinyOS系列——服务器远程指令多跳实现过程中问题及解决方案,布布扣,bubuko.com
时间: 2024-10-13 12:32:38