魔方机器人之下位机编程-----两种串口通信方式的比较

2023-11-02

      由于上位机软件的串口通信部分和魔方复原算法部分已经完成,接下来的一步就是如何将魔方复原的具体步骤(字符串的形式)通过串口发送给单片机MC9S12XS128单片机了,调试的过程中,采用了两种串口通信的方式,一种是查询的方式,另一种是中断的方式。首先采用的是查询的方式,通过循环,不断的判断有没有接收到数据,如果接收到数据,则单片机向电脑立即发送接收到的数据。单纯的执行数据的接收和发送不执行其他的操作,正常的收发是没有问题的。但是当将PWM程序和传统通信程序整合到一起的时候,问题出现了,由于PWM程序含有占空比赋值语句和延时函数,当上位机发送的数据的时候,如果下位机没有执行到串口接收的部分,将会造成数据接收的数据不完整甚至接收不到数据。

//包含头文件
#include "Includes.h"     //包含总头文件

//在此添加全局变量定义
uint8 msg[14] = "Hello! World!";
      
//主函数
void main(void)
{
    //0.1 主程序使用的变量定义
    uint32 mRuncount=0;       //运行计数器
    uint8 i;
    uint8 SerialBuff[1];      //存放接收数据的数组
    
    //0.2 关总中断
    DisableInterrupt();  
       
    //0.3 芯片初始化
    MCUInit(FBUS_32M);
    
    //0.4 模块初始化
    Light_Init(Light_Run_PORT,Light_Run,Light_OFF); //RUN指示灯初始化为暗
    SCIInit(0,FBUS_32M,9600);                   //串口0初始化
    SCISendN(0,13,msg);                             //发送"Hello! World!"

 
    // 主循环
    for(;;)
    {
      //1. 主循环计数到一定的值,使Run灯的亮、暗状态切换
      mRuncount++;
      if (mRuncount>=50000) 
      {
        mRuncount=0;
        Light_Change(Light_Run_PORT,Light_Run);   //指示灯的亮、暗状态切换
      }
      
      //--------------------------------------------------------------------
      //2. 主循环中等待接收PC机发送的数据,当接收到了来自PC机的数据后立即回发
        i = SCIReN(0,1,SerialBuff);                  //等待接收1个数据
        if (i == 0) SCISendN(0,1,SerialBuff);        //发送接到的数据
      //--------------------------------------------------------------------
      Delay(100000);
    } //for_end(主循环结束)
} //main_end
       该程序没有使用串口中断,isr.cpp中的中断向量表都是默认值,没有修改。没有延时函数Delay(100000)数据的收发是正常的,但是加上延时语句之后,上位机数据的发送时机就要有所讲究,要在执行数据接收的时候进行发送,而不能在延时的时候进行发送,否则导致接收数据的不完整。发送的数据为串口调试助手发送框内部的内容,每次发送都只接收到了一个字母D,接收的字符串不完整,如下:


    这样的话肯定不能满足串口通信的实时性的要求,也不能保证传输的准确性,所以后面修改为了串口接收中断方式进行通信,主要的代码如下:

main.c文件代码:

  //头文件包含
  #include "Includes.h"                             //总头文件
  
//在此添加全局变量定义
uint8 msg[14] = "Hello! World!";
         

  void PWM_Init(void)
  {
      PWME_PWME3=0x00;   // Disable  PWM            禁止(通道3)             
      PWMPRCLK=0x33;     // 0011 0011 A=B=32M/8=4M  时钟预分频寄存器设置 
      PWMSCLA=200;       // SA=A/2/200=10k          时钟设置 
      PWMSCLB=200;       // SB=B/2/200 =10k          时钟设置                     
      PWMCLK_PCLK3=1;   // PWM3-----SB             时钟源的选择 
      PWMPOL_PPOL3=1;   // Duty=High Time          极性设置 
      PWMCAE_CAE3=0;    // Left-aligned            对齐方式设置 
      PWMCTL=0x00;      // no concatenation        控制寄存器设置  
      PWMPER3=200;     // Frequency=SB/200=50HZ   周期寄存器设置 
      PWMDTY3=15;     // 1.5ms对应的占空比       占空比寄存器设置 
      PWME_PWME3=1;     // Enable  PWM             使能 
  } 
  void main()
  {
         
         //关总中断-------0.1
         DisableInterrupt(); 
         //芯片初始化-----0.2     
         MCUInit(FBUS_32M);        
         //模块初始化-----0.3
         SCIInit(0,FBUS_32M,9600);  //串口0初始化
         SCISendN(0,13,msg);        //发送"Hello!World!"
       
          
          // 开放中断------0.4
         EnableSCIReInt0;           //开放SCI0接收中断
         EnableInterrupt();         //开放总中断     
 
       
       
         PWM_Init();             //PWM初始化 1.5ms对应的占空比-----90°      
         Delay(1000000);
         for(;;)
         {
              PWMDTY3=5;          //0.5ms对应的占空比------0°
             Delay(1000000);
             PWMDTY3=25;         //2.5ms对应的占空比----180°
             Delay(1000000);
         } //for_end(主循环结束)  
  } //main_end
中断服务子程序代码():
//--------------------------------------------------------------------------*
//文件名: isr.c                                                             *
//说  明: 中断处理函数,本文件包含:                                          *                                                             *  
//        isr_default: 中断处理程序                                         *
//--------------------------------------------------------------------------*

//头文件包含,及宏定义区

    //头文件包含
    #include "Includes.h"     //包含总头文件
    
    #pragma CODE_SEG __NEAR_SEG NON_BANKED

//中断服务程序区

    //未定义的中断处理函数,本函数不能删除,默认
    __interrupt void isr_default(void)
    {   
       DisableInterrupt();
       EnableInterrupt();
    }

    //串行接受中断
    __interrupt void SCI0_Recv(void)
    {    
        uint8 i;
        uint8 SerialBuff[1];     		                 //存放接收数据的数组
        
        DisableInterrupt();                          //禁止总中断
        
        i = SCIReN(0,1,SerialBuff);                  //等待接收1个数据
        if (i == 0) SCISendN(0,1,SerialBuff);        //发送接到的数据
        
        EnableInterrupt();                           //开放总中断
    }
    
    //复制上述默认中断处理函数isr_default(),作为模板而得到相应的中断程序
    
    #pragma CODE_SEG DEFAULT

//中断矢量表对应区

    //中断处理子程序类型定义
    typedef void (*near tIsrFunc)(void);
    
    //中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目
    const tIsrFunc _InterruptVectorTable[] @0xFF10 = { 
      // ISR name                     No.   Address  Pri Name            
      isr_default,                 // 0x08  0xFF10   -   ivVsi           
      isr_default,                 // 0x09  0xFF12   -   ivVsyscall      
      isr_default,                 // 0x0A  0xFF14   1   ivVReserved118  
      isr_default,                 // 0x0B  0xFF16   1   ivVReserved117  
      isr_default,                 // 0x0C  0xFF18   1   ivVReserved116  
      isr_default,                 // 0x0D  0xFF1A   1   ivVReserved115  
      isr_default,                 // 0x0E  0xFF1C   1   ivVReserved114  
      isr_default,                 // 0x0F  0xFF1E   1   ivVReserved113  
      isr_default,                 // 0x10  0xFF20   1   ivVReserved112  
      isr_default,                 // 0x11  0xFF22   1   ivVReserved111  
      isr_default,                 // 0x12  0xFF24   1   ivVReserved110  
      isr_default,                 // 0x13  0xFF26   1   ivVReserved109  
      isr_default,                 // 0x14  0xFF28   1   ivVReserved108  
      isr_default,                 // 0x15  0xFF2A   1   ivVReserved107  
      isr_default,                 // 0x16  0xFF2C   1   ivVReserved106  
      isr_default,                 // 0x17  0xFF2E   1   ivVReserved105  
      isr_default,                 // 0x18  0xFF30   1   ivVReserved104  
      isr_default,                 // 0x19  0xFF32   1   ivVReserved103  
      isr_default,                 // 0x1A  0xFF34   1   ivVReserved102  
      isr_default,                 // 0x1B  0xFF36   1   ivVReserved101  
      isr_default,                 // 0x1C  0xFF38   1   ivVReserved100  
      isr_default,                 // 0x1D  0xFF3A   1   ivVReserved99   
      isr_default,                 // 0x1E  0xFF3C   1   ivVReserved98   
      isr_default,                 // 0x1F  0xFF3E   1   ivVatd0compare  
      isr_default,                 // 0x20  0xFF40   1   ivVReserved96   
      isr_default,                 // 0x21  0xFF42   1   ivVReserved95   
      isr_default,                 // 0x22  0xFF44   1   ivVReserved94   
      isr_default,                 // 0x23  0xFF46   1   ivVReserved93   
      isr_default,                 // 0x24  0xFF48   1   ivVReserved92   
      isr_default,                 // 0x25  0xFF4A   1   ivVReserved91   
      isr_default,                 // 0x26  0xFF4C   1   ivVReserved90   
      isr_default,                 // 0x27  0xFF4E   1   ivVReserved89   
      isr_default,                 // 0x28  0xFF50   1   ivVReserved88   
      isr_default,                 // 0x29  0xFF52   1   ivVReserved87   
      isr_default,                 // 0x2A  0xFF54   1   ivVReserved86   
      isr_default,                 // 0x2B  0xFF56   1   ivVReserved85   
      isr_default,                 // 0x2C  0xFF58   1   ivVReserved84   
      isr_default,                 // 0x2D  0xFF5A   1   ivVReserved83   
      isr_default,                 // 0x2E  0xFF5C   1   ivVReserved82   
      isr_default,                 // 0x2F  0xFF5E   1   ivVReserved81   
      isr_default,                 // 0x30  0xFF60   1   ivVReserved79   
      isr_default,                 // 0x31  0xFF62   1   ivVReserved78   
      isr_default,                 // 0x32  0xFF64   1   ivVReserved77   
      isr_default,                 // 0x33  0xFF66   1   ivVReserved76   
      isr_default,                 // 0x34  0xFF68   1   ivVReserved75   
      isr_default,                 // 0x35  0xFF6A   1   ivVReserved74   
      isr_default,                 // 0x36  0xFF6C   1   ivVReserved73   
      isr_default,                 // 0x37  0xFF6E   1   ivVReserved72   
      isr_default,                 // 0x38  0xFF70   1   ivVReserved71   
      isr_default,                 // 0x39  0xFF72   1   ivVReserved70   
      isr_default,                 // 0x3A  0xFF74   1   ivVpit3         
      isr_default,                 // 0x3B  0xFF76   1   ivVpit2         
      isr_default,                 // 0x3C  0xFF78   1   ivVpit1         
      isr_default,                 // 0x3D  0xFF7A   1   ivVpit0         
      isr_default,                 // 0x3E  0xFF7C   1   ivVhti          
      isr_default,                 // 0x3F  0xFF7E   1   ivVapi          
      isr_default,                 // 0x40  0xFF80   1   ivVlvi          
      isr_default,                 // 0x41  0xFF82   1   ivVReserved62   
      isr_default,                 // 0x42  0xFF84   1   ivVReserved61   
      isr_default,                 // 0x43  0xFF86   1   ivVReserved60   
      isr_default,                 // 0x44  0xFF88   1   ivVReserved59   
      isr_default,                 // 0x45  0xFF8A   1   ivVReserved58   
      isr_default,                 // 0x46  0xFF8C   1   ivVpwmesdn      
      isr_default,                 // 0x47  0xFF8E   1   ivVportp        
      isr_default,                 // 0x48  0xFF90   1   ivVReserved55   
      isr_default,                 // 0x49  0xFF92   1   ivVReserved54   
      isr_default,                 // 0x4A  0xFF94   1   ivVReserved53   
      isr_default,                 // 0x4B  0xFF96   1   ivVReserved52   
      isr_default,                 // 0x4C  0xFF98   1   ivVReserved51   
      isr_default,                 // 0x4D  0xFF9A   1   ivVReserved50   
      isr_default,                 // 0x4E  0xFF9C   1   ivVReserved49   
      isr_default,                 // 0x4F  0xFF9E   1   ivVReserved48   
      isr_default,                 // 0x50  0xFFA0   1   ivVReserved47   
      isr_default,                 // 0x51  0xFFA2   1   ivVReserved46   
      isr_default,                 // 0x52  0xFFA4   1   ivVReserved45   
      isr_default,                 // 0x53  0xFFA6   1   ivVReserved44   
      isr_default,                 // 0x54  0xFFA8   1   ivVReserved43   
      isr_default,                 // 0x55  0xFFAA   1   ivVReserved42   
      isr_default,                 // 0x56  0xFFAC   1   ivVReserved41   
      isr_default,                 // 0x57  0xFFAE   1   ivVReserved40   
      isr_default,                 // 0x58  0xFFB0   1   ivVcan0tx       
      isr_default,                 // 0x59  0xFFB2   1   ivVcan0rx       
      isr_default,                 // 0x5A  0xFFB4   1   ivVcan0err      
      isr_default,                 // 0x5B  0xFFB6   1   ivVcan0wkup     
      isr_default,                 // 0x5C  0xFFB8   1   ivVflash        
      isr_default,                 // 0x5D  0xFFBA   1   ivVflashfd      
      isr_default,                 // 0x5E  0xFFBC   1   ivVReserved33   
      isr_default,                 // 0x5F  0xFFBE   1   ivVReserved32   
      isr_default,                 // 0x60  0xFFC0   1   ivVReserved31   
      isr_default,                 // 0x61  0xFFC2   1   ivVReserved30   
      isr_default,                 // 0x62  0xFFC4   1   ivVcrgscm       
      isr_default,                 // 0x63  0xFFC6   1   ivVcrgplllck    
      isr_default,                 // 0x64  0xFFC8   1   ivVReserved27   
      isr_default,                 // 0x65  0xFFCA   1   ivVReserved26   
      isr_default,                 // 0x66  0xFFCC   1   ivVporth        
      isr_default,                 // 0x67  0xFFCE   1   ivVportj        
      isr_default,                 // 0x68  0xFFD0   1   ivVReserved23   
      isr_default,                 // 0x69  0xFFD2   1   ivVatd0         
      isr_default,                 // 0x6A  0xFFD4   1   ivVsci1         
      SCI0_Recv,                   // 0x6B  0xFFD6   1   ivVsci0         
      isr_default,                 // 0x6C  0xFFD8   1   ivVspi0         
      isr_default,                 // 0x6D  0xFFDA   1   ivVtimpaie      
      isr_default,                 // 0x6E  0xFFDC   1   ivVtimpaaovf    
      isr_default,                 // 0x6F  0xFFDE   1   ivVtimovf       
      isr_default,                 // 0x70  0xFFE0   1   ivVtimch7       
      isr_default,                 // 0x71  0xFFE2   1   ivVtimch6       
      isr_default,                 // 0x72  0xFFE4   1   ivVtimch5       
      isr_default,                 // 0x73  0xFFE6   1   ivVtimch4       
      isr_default,                 // 0x74  0xFFE8   1   ivVtimch3       
      isr_default,                 // 0x75  0xFFEA   1   ivVtimch2       
      isr_default,                 // 0x76  0xFFEC   1   ivVtimch1       
      isr_default,                 // 0x77  0xFFEE   1   ivVtimch0       
      isr_default,                 // 0x78  0xFFF0   1   ivVrti          
      isr_default,                 // 0x79  0xFFF2   1   ivVirq          
      isr_default,                 // 0x7A  0xFFF4   -   ivVxirq         
      isr_default,                 // 0x7B  0xFFF6   -   ivVswi          
      isr_default                  // 0x7C  0xFFF8   -   ivVtrap           
    };                                      

    
     注意:串口接收中断里面的中断服务子程序是在isr.c文件中实现的,以及相应的串口接收中断向量表的修改。

     通过实验测试证明将PWM程序和以中断方式进行的串口通信两者之间互不影响,克服查询串口通信方式的缺陷。实现结果如下:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

魔方机器人之下位机编程-----两种串口通信方式的比较 的相关文章

  • 开机自动启动_Mac如何彻底关掉开机自动开启的应用程序

    使用Mac的小伙伴有没有这样的烦恼 电脑一开机 一堆烦人的软件就自动开启了 让人很懊恼 如何才能彻底关掉开机自动开启的应用程序 mac开机启动项怎么设置 开机启动项要怎么禁止 今天macdown小编就带大家解决这个懊恼的问题 感兴趣的朋友就
  • 最优服务次序问题-贪心算法

    1 最优服务次序问题 1 问题描述 设有n 个顾客同时等待一项服务 顾客i需要的服务时间为ti 1 lt i lt n 应如何安排n个顾客的服务次序才能使平均等待时间达到最小 平均等待时间是n 个顾客等待服务时间的总和除以n 2 编程任务

随机推荐

  • Better-Scroll可滚动区域问题

    解决Better Scroll可滚动区域的问题 Better Scroll在决定有多少区域可以滚动时 是根据scrollerHeight属性决定 scrollerHeight属性石根据放Better Scroll的content中的子组件的
  • c语言中常见的几种排序方式详解补充优化及总结

    在学习过程中我们常常会遇到各种排序的问题 给定一个数组 从大到小排序或者从小到大排序等等 我们通常有思路去解决这个问题 但是在敲代码的过程中可能会出现各种问题 我们接下来详细介绍三种常用且好理解的方法 扩展我们的思路 冒泡排序 假如给我们一
  • 计算机组成原理3--<存储体系>

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 存储器的分类 二 存储器的层次结构 1 主存储器 总结 一 存储器的分类 按存储介质分类 半导体存储器 磁存储器 纸带存储器 光存储器等 按照存取方式分类 随机
  • ajax和getjson区别,jQuery中$ .getJSON()和$ .ajax()之间的区别

    内容型强 gt 您无需在调用MVC控制器操作时指定内容类型 只有在调用ASP NET AJAX ScriptServices 和页面方法时才需要特殊的 application json charset utf 8 内容类型 jQuery的默
  • c语言简单介绍&编译过程

    标题 为什么要写 include 编译过程 编译 链接 为什么是 lt gt 中写的是stdio h 函数 Java中称为方法 C语言是大部分人接触的第一门计算机语言 虽然很多学校将C作为一门初始语言 但是其难度还是有的 计算机只具有一维思
  • OLED滚动显示

    少年 一 滚动显示介绍 1 1 具体介绍 1 2 水平滚动命令 1 3 垂直滚动命令 二 代码模块 三 显示效果 四 总结 五 参考资料 一 滚动显示介绍 1 1 具体介绍 SSD1306 OLED驱动芯片 指令详解 1 2 水平滚动命令
  • 普通二本,去过阿里外包,到现在年薪40W+的高级测试工程师,我的两年转行经历...

    我是一个普通二本大学机械专业毕业 14年毕业 16年转行 目前做IT行业的软件测试已经有3年多 职位是高级软件测试工程师 坐标上海 我想现在我也有一点资格谈论关于转行这个话题 希望你在决定转行之前 首先搞清楚转行是你内心热爱还是一时冲动 如
  • 解决pycharm连接mysql报错(DB Navigator-Connection error)

    在上一篇连接操作里 可能不是每个电脑都能一次成功 https blog csdn net forever up422 article details 122631096 spm 1001 2014 3001 5502 如果在最后测试一步出现
  • 【云原生之Docker实战】使用Docker部署BookStack文档管理系统

    云原生之Docker实战 使用Docker部署BookStack文档管理系统 一 BookStack介绍 1 BookStack简介 2 BookStack功能 二 检查本地docker环境 1 检查docker服务状态 2 检查docke
  • Java学习路线(超详细)

    目录 前言 1 学习Java基础知识 2 掌握面向对象编程 OOP 概念 3 熟悉Java集合框架 4 学习Java异常处理 5 学习Java IO 6 掌握Java多线程编程 7 学习Java网络编程 8 学习Java数据库编程 9 学习
  • Android 设置屏幕自动关闭时间

    Android 设置屏幕自动关闭时间 在Android设备上 屏幕的自动关闭时间是指手机在没有操作的情况下 屏幕自动关闭的时间间隔 默认情况下 Android设备的屏幕自动关闭时间为几分钟 但用户可以根据自己的需求进行修改 本文将介绍如何通
  • Linux·字符设备再分析

    Linux系统将设备分成字符设备 块设备 网络设备三类 用户程序调用硬件的过程如下 一 用户级 内核级和系统调用 Linux Unix系统下的进程运行分为用户态和进程态两种状态 我们的应用程序通常仅在用户态下运行 出于保护内核资源的需要 用
  • 安装cargo-generate各种坑【mac + wasm + rust 环境搭建】

    cargo install cargo generate 如果报openssl错误千万别再去装了 各种坑 这个cargo generate可以手动下载安装的 先贴上我的报错信息 run pkg config fail pkg config
  • Python队列Queue详解,超详细

    Queue queue模块简介 queue Queue maxsize 0 queue LifoQueue maxsize 0 queue PriorityQueue maxsize 0 queue SimpleQueue 3 7 新版功能
  • OpenHarmony3.2 beta4上照相机的使用之1--开启照相机预览画面

    随着OpenHarmony的版本更新 在3 2上已经提供了非常丰富的API来调用照相机 此处讲解的是原生的使用相机的流程 并发像Android普通应用开发一样通过一个intent直接调用系统相机应用进行拍照 根据原生的调用相机的API可以让
  • [FPGA中的最大与最小输入延迟]——如何优化输入延迟

    FPGA中的最大与最小输入延迟 如何优化输入延迟 在FPGA设计中 输入延迟是一个重要的考虑因素 输入延迟指的是从信号被输入到FPGA开始处理所需的时间 而FPGA中的最大与最小输入延迟是非常关键的两个参数 最小输入延迟 Minimum I
  • spring事务操作及mysql事务原理

    文章目录 1 事务概念 2 事务操作 搭建事务操作环境 3 事务操作 Spring事务管理介绍 4 事务操作 注解声明式事务管理 5 事务操作 声明式事务管理参数配置 6 事务操作 XML声明式事务管理 7 事务操作 完全注解声明式事务管理
  • 数据结构实验预习报告

    项目1 中国计算机设计大赛赛事统计 问题描述 参加计算机设计大赛的n个学校编号为1 n 赛事分成m个项目 项目的编号为1 m 比赛获奖按照得分降序 取前三名 写一个统计程序产生各种成绩单和得分报表 基本要求 1 每个比赛项目至少有10支参赛
  • mysql数据库表之间关系,一对一、一对多、多对多,多表查询

    多表查询分类 1内连接查询 加粗样式隐式内连接 SELECT t1 name t2 type from book t1 booktype t2 WHERE t1 type t2 tid 显示内连接 SELECT t1 namefrom bo
  • 魔方机器人之下位机编程-----两种串口通信方式的比较

    由于上位机软件的串口通信部分和魔方复原算法部分已经完成 接下来的一步就是如何将魔方复原的具体步骤 字符串的形式 通过串口发送给单片机MC9S12XS128单片机了 调试的过程中 采用了两种串口通信的方式 一种是查询的方式 另一种是中断的方式