# DebugRob_MFC **Repository Path**: pch980807/DebugRob_MFC ## Basic Information - **Project Name**: DebugRob_MFC - **Description**: 上位机MFC - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2019-07-07 - **Last Updated**: 2023-10-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 计划树 ``` 符号说明: '|'表示展开的任务,或该阶段已过,不存在非常严肃的BUG问题 'o'表示正在着手的部分 'x'还没着手的计划部分 |-串口 |-开启 |-发送 |-接收(查询型) |-接收(中断型) X-通信协议 X-上下位机交互式响应 |-OpenCV的引入与成功运行 |-老算法的研究 O-用在毕业设计上算法的研究 |-MFC图形化重整 |-添加控件 |-添加控件功能与其和代码的关系 |-删除控件与代码 x-设计用在工程上的页面 |-脚本的编写 x- ``` ## 工程说明 打开Visual studio工程项目后,先试着编译运行,这时候如果失败,你可能需要沿着以下路径:Project->Properties->General->Windows SDK Version修改你自己环境SDK。另外,需要在Project->Debugging->Environment中添加环境变量PATH=$(MSBuildProjectDirectory)\opencv\opencvDLL。然后再编译运行,应该能成功运行。 工程涉及两个基本外设——串口和摄像头,部分电脑自带摄像头,能正常开启,若电脑串口没有插上相应的通信硬件,则会显示开启失败,这是正常现象,回忆一下学校里蓝牙获取单片机数据的流程,你可能需要将你的蓝牙连接在电脑那个串口上。 ## BUG反馈 工程最终要求在嵌入式平台下调试运行,所以各个编译运行不成功的问题都希望能及时反馈上来,通过Github issue就行,群里啊或者直接私聊我,总之为了最终嵌入式环境,不要放过一个可能会影响那时候的问题。 ## 关于DLL 在工程说明中提到,需要添加环境变量,使工程能够调用到对应的DLL才能使程序正常运行。由于MFC不支持静态链接库调用的方式,即使有我现在也不知道怎么实现,以及会存在什么样的问题。所以必须使用DLL,在上面提到,通过IDE调试时可以添加环境变量使调试时的程序可以找到DLL,但是,在我们竞赛用的嵌入式环境下,程序直接通过运行.exe文件时,是无法找到调试时的哪些DLL文件的。这个麻烦(配置环境的繁琐易错的过程)还没有解决。 ## 关于上下位机协议 上下位机通讯规范: 上下位机通讯中,最小通讯单位为帧。即是说每一次通讯都必须完整传送一帧数据。 在上位机没有发送指令的时候下位机保持不执行任何动作的状态。 上位机发送指令被下位机接收以后下位机会给上位机一个反馈信号,然后执行相应的命令。 命令执行完后下位机将返回“命令执行完成”信号给上位机,之后上位机可以下达新的指令。 在下位机执行上位机发送的指令时,如果下位机正在执行的指令未执行完,除急停指令外,下位机将忽略上位机下达的新指令。 如果下位机认为收到的指令有误,下位机将发送“请求重新发送命令“信号给上位机,此时上位机应该在下一个通讯过程重新发送当前指令。 定义反馈(ACK)信号:【0xAB】 定义“命令执行完成”信号“:0xA0 + 执行完成的任务编号 例如:依次发送 0xA0 0x05 代表任务5执行完成 定义“急停指令“的任务编号为 0。急停指令只会对第二字节中的指令做出急停反应。 对于其余字节的动作不具有控制作用。 定义“请求重新发送命令“信号为 0x53 总体数据格式: ----------------------------------------------------------- |-----第一字节-----|--第二字节--| 第三字节 | 第四字节 |第五字节| |--动作&ACK控制--|--命令编号--| 随机数 随机数 和校验 5个字节按顺序发送 没有开始帧也没有结束帧 第一字节 MSB LSB 第八位 第七位 第六位 第五位 第四位 第三位 第二位 第一位 NONE NONE NONE NONE ACK RIGHT HEAD LEFT 第一位控制左手舵机的摇摆动作。置位为摇摆左手,清零为无动作。 第二位控制头部舵机的摇摆动作。置位为摇摆头部,清零为无动作。 第三位控制右手舵机的摇摆动作。置位为摇摆右手,清零为无动作。 第四位为上位机需要下位机的反馈信号(ACK),置位为需要ACK信号,清零为无信号返回。 其余为无效位。 注意:第二字节的急停指令对本字节的动作无效。 第二字节 MSB LSB 第八位 第七位 第六位 第五位 第四位 第三位 第二位 第一位 OPTION OPTION OPTION OPTION OPTION OPTION OPTION OPTION 第二字节为命令控制字节,是一个unsigned char类型的数据。 第二字节为0x00时表示不执行、急停,其余状态为具体任务编号(脚本编号)。 注意:急停只对该字节的命令起作用。 第三第四字节 MSB LSB 第八位 第七位 第六位 第五位 第四位 第三位 第二位 第一位 OPTION OPTION OPTION OPTION OPTION OPTION OPTION OPTION MSB LSB 第八位 第七位 第六位 第五位 第四位 第三位 第二位 第一位 OPTION OPTION OPTION OPTION OPTION OPTION OPTION OPTION 第三第四字节现设置为随机数字节,用于产生和校验需要的数据。如有功能拓展这两字节可以另作他用。上位机需要在每次数据传输时产生2字节unsigned char类型的随机数。 第五字节 MSB LSB 第八位 第七位 第六位 第五位 第四位 第三位 第二位 第一位 OPTION OPTION OPTION OPTION OPTION OPTION OPTION OPTION 第五字节为校验和字节,用于确保数据的完整性,是一个unsigned char类型的数据。 校验算法 SUM = BYTE1 + BYTE2 + BYTE3 + BYTE4 即第五字节的值为前四字节加起来的值。 校验失败将导致下位机重新请求数据。