MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

Freescale MC9S12XS 系列CAN总线波特率配置 1.CAN总线时钟设置32M 外部晶振为16M SYNR = 0x43; REFDV = 0x81; PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M 2.总线波特率设置500kb/s CAN0BTR0_SJW = 0; //设置同步 CAN0BTR0_BRP = 3; ... 阅读详情

接着我的上一篇文章:MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能。本篇文章主要记录下在实现小车九宫格方位移动功能过程中,遇到的一些程序问题以及解决措施。

1. 上位机小车响应开发板按键CAN报文指令的响应出错问题

问题现象描述:

开发板上按KEY2键指示小车离开初始化的位置(0,0)即九宫格的左上角向下移动一格,但是发现小车向下先后移动了两次。

在这里插入图片描述

出错原因排查:程序关键位置添加打印,通过打印出来的下面截图中的三个列表可以判断出小车向下移动两次是通过小车需要移动位置列表curr_orient=[2,0]更新判断出来的。程序里面小车是否需要移动的逻辑判断是通过比较列表curr_orient与列表origin_orient的一致性,只要小车需要移动位置列表curr_orient与小车当前位置的列表origin_orient不一致,就执行列表curr_orient表示的方位的移动。

在这里插入图片描述

def analyse_orientation(data_str, origin_orient):
    data_list = data_str.split(" ")
    valid_data = data_list[:4]  # 前4字节表示方位的报文信息
    if "01" in valid_data:
        idx = valid_data.index("01")
        orient = orient_dict[idx]
        if orient == "上":
            curr_orient = [origin_orient[0] - 1, origin_orient[1]]
        elif orient == "下":
            curr_orient = [origin_orient[0] + 1, origin_orient[1]]
        elif orient == "左":
            curr_orient = [origin_orient[0], origin_orient[1] - 1]
        elif orient == "右":
            curr_orient = [origin_orient[0], origin_orient[1] + 1]
        else:
            raise Exception("无效的方位")
        # 判断更新的方位是否有效
        if check_orient(origin_orient, curr_orient):
            return curr_orient
        else:
            return origin_orient
    else:
        return origin_orient
def check_orient(origin_orient, curr_orient):
    if (curr_orient[0] < 0) or (curr_orient[1] < 0):
        return False
    elif (curr_orient[0] > 2) or (curr_orient[1] > 2):
        return False
    elif (origin_orient[0]) == curr_orient[0] and (origin_orient[1] == curr_orient[1]):
        return False
    else:
        return True

经分析主要是开发板按键一次发送向下移动报文后,会一直发送该条报文,导致小车会一直执行向下移动的指令。修改开发板程序后,上位机程序能够按照原逻辑正确解析报文指示小车移动。

在这里插入图片描述

2. 上位机小车响应一帧指示移动方位的报文存在延时响应或者响应不及时的问题

由于出现了问题1:上位机小车响应开发板按键CAN报文指令的响应出错问题,调整了开发板的程序每次只会发送一帧指示方位更新的报文,会导致上位机程序在接收处理报文信息时存在延时响应或者响应不及时的问题。

分析程序发现,目前造成信息不同步的原因主要是写入报文数据和读取报文数据判断方位的逻辑是不同线程控制的,两个线程之间存在信息不同步的问题。暂时可以通过以下方式解决该问题:设置读取报文数据判断方位的线程中run()方法执行1秒钟的延时。

    def run(self):
        while not self.stop_flag:
            # 按“开始”按钮进入小车方位移动线程后,重新读取报文存储文件,通过最后一条报文判断小车应该前进的方位
            msg_data = self.read_msg_fromtext()
            curr_orient = analysis_msg.analyse_orientation(msg_data, self.origin_orient)
            if curr_orient != self.origin_orient:
                self.update_bitmap(curr_orient).SetBitmap(wx.Bitmap(self.img))
                # time.sleep(5)
                time.sleep(1)
            self.origin_orient = curr_orient

3. CAN通信连接-断开-连接过程中,上位机界面显示接收到的报文帧序号出错

出错现象截图如下:

在这里插入图片描述

从上图可以看出,断开CAN通信后,接收到的报文帧序号后三位有的是从001开始依次增加1的,有的报文帧序号从断开CAN通信前的最后一帧报文序号384依次增加1的。

出错原因排查:分析程序代码,出错原因在于鼠标点击“断开”按钮后,程序执行关闭CAN通信的线程但是没有中断CAN通信接收报文的线程,重新点击“连接”按钮启动CAN通信接收报文的线程,导致存在先后两个CAN通信接收报文的线程执行。

使用知乎https://www.zhihu.com/question/595940230?utm_id=0上的Python中断线程方法成功解决了该问题,Python线程中断方法如下:

在这里插入图片描述

增加“断开”CAN通信中断CAN报文接收线程功能后,上位机界面成功运行的截图如下:

在这里插入图片描述

4. 关闭上位机界面,程序未响应,界面卡死

在这里插入图片描述

经分析发现是程序处理逻辑问题:只是按照上述问题3:CAN通信连接-断开-连接过程中,上位机界面显示接收到的报文帧序号出错,通过设置标志位的方式中止了线程中循环的执行,并没有堵塞线程,应该通过join()方式堵塞线程的执行使线程执行完成后正常退出。

        # 窗口关闭事件
        self.Bind(wx.EVT_CLOSE, self.exit_sys)
    def exit_sys(self, event):
        try:
            # 先强制结束报文接收线程
            self.link_thread.stop()
            self.link_thread.join()
            self.click_thread.stop()
            self.click_thread.join()
            if self.MyPanel1.m_button1.GetLabel() == "断开":  # 表示处于CAN通信连接的状态
                self.close_link()
        except AttributeError:
            pass
        # 清空报文记录文件receive_msg.txt
        open("receive_msg.txt", 'w').close()
        self.Destroy()
        sys.exit(1)
关于xs128单片机的一点小小学习心得--code warrior使用 codewarrior5.1使用方法 阅读详情

相关推荐

飞思卡尔MC9S12G系列单片机flash擦写

飞思卡尔MC9S12G系列单片机flash擦写 最近在学习飞思卡尔MC9S12G系列单片机底层驱动,看了很多,目前理解还不深,处于入门菜鸟级别,仅在此记录下学习心得,后续准备在实操中强化底层驱动开发能力,不能老是处于光说不练,搞些假把式, ...

QL198_8的博客 2737

MC9S12G128——关于USBDM 的驱动软件

资料利用上传资源的方式上传时文件内存太大,就用文章的形式上传,该资源来路政党,是笔者花费一笔资产够买开发板之后,提供的关于开发板烧写器USBDM 驱动及安装包。但愿可以呈现出来,共享!链接:https://pan.baidu.com/s/18LSwNq98indE0T1iIph_Ag?好久都没有更信了,今天更新只是提供一个关于烧录器的驱动等相关资料。

weixin_44806212的博客 355

笔记:freescale-S9S12G系列单片机开发指南

记录学习freescale的S9S12G系列单片机时期的学习笔记

布丁Plus的博客 2271

python实现九宫格的车辆路径轨迹上位机界面

基本功能:控制开发板上的按键,模拟车辆移动的上下左右四个方位,通过can通信告诉上位机界面,车辆轨迹的移动方位;

Logintern09的博客 835

51单片机:MC9S12XS128设计一个单片机应用控制系统

利用MC9S12XS128单片机设计一个单片机应用控制系统,该系统不仅能够实时显示室内温度、湿度和废气浓度的数值,而且能够根据预置的参数,控制室内温度、湿度和废气浓度。此外,用户还可通过控制键盘,直接控制窗户的开/关、换气扇的启/停、温(湿)度的升/降,选择所显示参数的种类等。该系统通过单片机实现了对室内环境的实时监测和控制,用户可以通过预设参数和手动输入,实现对室内温湿度和废气浓度的控制。用户可通过控制键盘直接控制窗户的开/关、换气扇的启/停、温(湿)度的升/降,选择所显示参数的种类等。

走向CTO的路上... 1543

MC9S12XS128单片机演示代码

包括485发送接收、AD采集数字量、ATD驱动8位、ATD驱动12位、CAN发送接收、D_Flash、LIN发送接收、PIT秒表、PIT模块、PWM音阶、SCI、SD卡、SPI、TIM、按键查询中断、定时器、秒表、模数转换、模拟IIC、温度传感器、液晶等相关例程。

MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能

MC9S12G128开发板:控制开发板上的按键,模拟车辆移动的上下左右四个方位,通过can通信告诉上位机界面,车辆轨迹的移动方位。

Logintern09的博客 989

龙丘MC9S12(X)DV60开发板手册V10.pdf

mc9s12开发板是龙丘开发板的核心芯片,这个芯片主要用于汽车电子,新能源行业,通过开发板可以快速熟悉这个单片机的开发技巧,欢迎大家交流合作,谢谢各位。

S12(X)微控制器的Bootloader程序

官方文档AN4258,介绍了一个官方实现S12(X)的Bootloader示例程序,我将其进行了翻译。如果要在S12(X)系列单片机中实现远程升级程序,则必看这个参考资料。

夏日白云的boke 7752

MC9S12G128完全手册

MC9S12G128完全手册,16位单片机family介绍

MC9S12DG128最小系统开发板核心板ALTIUM硬件原理图PCB+AD集成封装库.zip

MC9S12DG128最小系统开发板核心板ALTIUM硬件原理图PCB+AD集成封装库,2层板设计,Altium Designer 设计的工程文件,包括完整的原理图及PCB文件,可以用Altium(AD)软件打开或修改,可作为你产品设计的参考。集成封器件型号列表: Library Component Count : 15 Name Description ---------------------------------------------------------------------------------------------------- CAPACITOR POL Capacitor Cap Capacitor Cap Pol1 Polarized Capacitor (Radial) D Connector 9 Receptacle Assembly, 9 Position, Right Angle HEADER 30X2 HEADER 32*2 Header 3 Header, 3-Pin Header 3X2 Header, 3-Pin, Dual row Jumper Jumper Wire LED2 Typical RED, GREEN, YELLOW, AMBER GaAs LED MAX232CPE +5V Powered RS-232 Driver/Receiver MC9S12DG128BMPV 16-Bit Microcontroller Res2 Resistor SW-PB Switch XTAL Crystal Oscillator

MC9S12G128模块化分层化软件架构之七_外部中断

文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 上一期的 MC9S12G128模块化分层化软件架构之六——KEY代码下载地址: https://download.youkuaiyun.com/download/Sure_gengjia/12801323 实物展示: 更多内容,请持续关注公众号:激活未来。 1overview 1.1目的 本文档用于起点开发板的外部中断模块软件说明。...

Sure_gengjia的博客 1743

【Unity报错】Unity导入海康SDK 报错 DllNotFoundException: PlayCtrl assembly

2.尝试按网上其他的办法(包括使用depengs查看dll依赖等)1.先检查Plugins文件夹中是否存在PlayCtrl文件。3.如果网上查阅的办法都不能解决,请继续往下看。更换低版本的SDK库文件。

weixin_42968584的博客 1127

MC9S2XS128 单片机基本知识点

MC9S12系列单片机是飞思卡尔半导体推出的基于 CPU12内核的 16位车用MCU,本章介绍其入门知识

嵌入式学习记录站点 9148

liquibase扩展支持达梦数据库

近期项目中需要支持国产数据库,需要liquibase底层支持达梦数据库,记录下操作的详细步骤以便分享。 1.liquibase支持的数据库很多如MySQL, PostgreSQL, Oracle, Sql Server, DB2。但是达梦数据库并不支持,所以需要新建DMDatabase类来适配达梦数据库。达梦语法和Oracle很像所以只需要复制liquibase-core下的Oracle Database做些修改就可了。以下为需要修改的地方 public class DMDatabase extends A

qq_43677719的博客 5472

告别调试烦恼:用Lattice Diamond手把手教你JTAG烧录FPGA(附SRAM/Flash模式详解)

本文详细介绍了使用Lattice Diamond软件进行JTAG烧录FPGA的全流程,包括SRAM临时调试和Flash固化的核心区别。从环境准备、硬件连接到文件准备、烧录模式选择,再到典型问题排查和高级技巧,手把手教你快速掌握FPGA烧录技术,提升开发效率。

weixin_42569329的博客 496

freescale MC9S12G128单片机概述

MC9S12G128: 飞思卡尔S12G系列是需要CAN(控制器区域网络)或LIN(本地互连网络)/SAE J2602通讯的汽车应用的理想之选,这些应用包括车身控制器、车门模块、乘客检测、空调、座椅控制器和照明模块。这款16位S12G系列基于业界公认的S12架构,提供更复杂的应用设计所需的处理功能,保留了代码的有效性,同时还利用了广泛的S12生态系统,而这则有助于减少内存占用和开发成本。   MC9S12G128/96和MC9S12GN32/16是MC9S12G系列在市场上最先推出的四款主要产品。   汽车

若有博文对您有帮助,欢迎点赞关注,收藏评论。 2172

实战指南:在UE5中高效集成Entt(ECS)框架

本文提供了一份在虚幻引擎5中高效集成Entt ECS框架的实战指南。针对UE5项目在处理大规模动态实体时的性能瓶颈,详细讲解了如何通过数据驱动的ECS架构进行优化。内容包括前期环境准备、核心构建步骤、创建首个ECS子系统以及与UE原生系统的数据同步技巧,旨在帮助开发者快速掌握集成方法,提升游戏逻辑的执行效率。

weixin_29002209的博客 158

手把手教你写MC9S12G128 Timer

实现用定时器

m0_50027156的博客 1661

FI 应计对象的创建和摊销

创建/修改:ACACTREE01/ACACTREE02 应计对象的过账:ACACPOSTING

nancyln9711的博客 903

京东运维面试题及参考答案

cgroup(Control Group)是 Linux 内核提供的一种可以限制、控制与分离一个进程组群的资源(如 CPU、内存、磁盘 I/O 等)的机制。通过 cgroup,可以为不同的进程或进程组分配特定的资源配额,实现资源的隔离和管理。比如,在一个服务器上运行多个容器时,可以使用 cgroup 来限制每个容器对 CPU 和内存的使用,防止某个容器占用过多资源而影响其他容器的运行。cgroup 还可以对进程进行优先级设置,确保关键进程能够优先获得资源。

大模型大数据攻城狮的专栏 1236

中3d库后接负载_C:手势控制搬运小车 D:线路负载及故障检测装置

C:手势控制搬运小车一、任务小车在边长为1.2米内的正方形九宫格内运动,每个空格放置不容颜色进行区分。小车可沿Z字路线在九宫格内根据地面的颜色完成相应的动作。小车运行的起点在九宫格的左下方,终点在右上方。二、要求1、基本要求:1)从起点出发,到终点结束,以最快时间统计九宫格内地面三种颜色的相应个数,并在显示屏上进行显示。2)从起点出发前,人为设置一种颜色,要求小车按照要求设置的颜色在九宫...

weixin_42510717的博客 249

STM32串口编程基础知识讲解

本篇文章给大家介绍一下串口的基础编程知识,这些知识是属于串口的理论知识,在开始学习编写代码的时候必须要掌握这些基本的知识点。本篇文章讲解了串口的基本概念知识,大家在学习编写代码时将其掌握才能更好的理解代码。

m0_49476241的博客 1208

基于STM32单片机汉语拼音输入法教学板九宫格TFT彩屏设计146

基于STM32单片机的汉语拼音输入法教学板设计九宫格TFT屏/DIY套件146。

单片机设计开发 1210

Google Earth Engine 红树林制图方法的代码(三个模块)

谷歌地球引擎红树林制图方法(GEM)提供了一种直观、易用且可复制的工具,适用于广泛的非专业沿海管理者和决策者。该工具全面回顾并整合了相关的红树林遥感文献,并利用云计算的力量,包括简化的基于图像的潮汐校准方法。GEM 可免费用于非营利用途,并在 GEE 中运行,包含全面且详细注释的代码。GEM 专门设计用于绘制全球范围内多日期红树林分布并量化其动态变化。目前可用的工具和方法未能充分利用沿海管理者通常持有的丰富地方专业知识——GEM 致力于填补这一空白,帮助结合地方专业知识与 GEE 的云计算能力。

此星光明博客 560

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Pycharm打开工程Project后如何显示.py文件内部的函数
下一篇: 【文献研究】运用核心法查证班轮联盟的稳定性—verifying liner shipping alliance stability by applying core theory
草莓仙生
博客等级 码龄8年 2033粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓仙生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值