首页 > 代码库 > 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。