查看原文
其他

推荐一款我私藏已久的串口示波神器

菜刀和小麦 小麦大叔 2022-10-21


大家好,我是小麦,实不相瞒,关于串口示波器软件的文章,我之前写过一期了,具体可以看这个项目《一个超赞的开源串口虚拟示波器项目,玩起来!》。

这是一款开源的Qt库,非常简单,容易上手,还能二次开发,所以我就强烈推荐给大家了。

之前发过一篇关于SVPWM的文章《对不起!这篇SVPWM来晚了!》,于是不少读者朋友来询问文中的串口示波器能否共享一下。


        


当然是可以的,这款软件非常古老,但是却出奇地好用,用小而美来形容,丝毫不过分。

这个软件是上学时候,参加智能车比赛的时候用来调试PID的利器,大家之前,在时域上分析时间响应的曲线,就可以完美通过串口示波器工具来显示,如果要采集的数据需要很高的采样频率,可以参考我这篇文章《一款超级好用的虚拟示波器软件》。

随着时间的推移,各种串口示波器软件层出不穷,但是我还是在用这个软件,下面我要开始安利了。

软件功能

这是软件主界面,支持的功能不是很多,但是完全够用了;

主要特性如下:

  • 最多支持四个通道;
  • 支持拖动,缩放波形;
  • 支持将波形数据保存为matlab数据;
  • 支持实时跟踪波形;

下面是我测试SVPWM生成的波形。

移植到所需平台

通常单片机上需要通过串口往PC发送数据,PC接受数据并将接受的数据通过图形显示出来,这中间数据就需要遵循一定规则,即双方约定好通讯协议

所以下面我们来讲一下在硬件上适配通讯协议。

这里是几个文件列表,简单看一下SDS.cSDS.h

先看看头文件SDS.h里的内容,只提供了一个接口,SDS_OutPut_Data,只需要调用这个函数就可以向上位机发送波形了。

#ifndef SDS_H
#define SDS_H
void SDS_OutPut_Data(float S_Out[]);
#endif

我们再看一下SDS.c文件里的内容,这里需要注意的地方是:

#define uart_putchar(x) usart_send_char(x)

这里需要具体实现usart_send_char函数,要适配自己的硬件平台。这里还做了CRC校验,可以看一下CRC_CHECK函数;

以确保串口数据的可靠性。

具体源码如下;

#include "SDS.h"
#include "usart_driver.h"
//#include "uart.h"  //LINK TO UART

#define uart_putchar(x) usart_send_char(x)

//float SDS_OutData[4] = { 0 };

unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
{
    unsigned short CRC_Temp;
    unsigned char i,j;
    CRC_Temp = 0xffff;

    for (i=0;i<CRC_CNT; i++){      
        CRC_Temp ^= Buf[i%CRC_CNT];
        for (j=0;j<8;j++) {
            if (CRC_Temp & 0x01)
                CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
            else
                CRC_Temp = CRC_Temp >> 1;
        }
    }
    return(CRC_Temp);
}

void SDS_OutPut_Data(float S_Out[])
{
  int temp[4] = {0};
  unsigned int temp1[4] = {0};
  unsigned char databuf[10] = {0};
  unsigned char i;
  unsigned short CRC16 = 0
  float SDS_OutData[4];
  for(i=0;i<4;i++) {
   SDS_OutData[i%4]=S_Out[i%4];
  }
  for(i=0;i<4;i++)
   {
    
    temp[i%4]  = (int)SDS_OutData[i%4];
    temp1[i%4] = (unsigned int)temp[i%4];
    
   }
   
  for(i=0;i<4;i++) 
  {
    databuf[(i*2)%10]   = (unsigned char)(temp1[i%4]%256);
    databuf[(i*2+1)%10] = (unsigned char)(temp1[i%4]/256);
  }
  
  CRC16 = CRC_CHECK(databuf,8);
  databuf[8] = CRC16%256;
  databuf[9] = CRC16/256;
  
  for(i=0;i<10;i++)
    uart_putchar(databuf[i%10]);  //LINK TO UART 
}

需要实现硬件相关的代码。usart_send_char,本文基于STM32的串口进行测试的,具体代码如下所示;

void usart_send_char(char ch){

 /* Loop until the end of transmission */
 //while (USART_GetFlagStatus(COM_PORT, USART_FLAG_TC) == RESET){}
 while((COM_PORT->SR & USART_FLAG_TC) != USART_FLAG_TC){
 
 } 
 USART_SendData(COM_PORT, (uint8_t) ch);
}

最后怎么使用呢?

float user_data[4] = { 0 };
user_data[0] = sv_regs.ccr1;
user_data[1] = sv_regs.ccr2;
user_data[2] = sv_regs.ccr3;
user_data[3] = svpwm.VecSector*1000;
SDS_OutPut_Data(user_data);

大功告成;

公众号后台回复【串口示波器】获取。

—— The End —

推荐好文  点击蓝色字体即可跳转
 太牛了,国人纯手工自制CPU,耗时半年,用了3000多个晶体管
☞ 一个超级好用的插件—EIDE,在VSCODE下快速创建ARM工程
☞ 如何在GitHub上白嫖代码?先学会Git吧
☞ ARM与RISC-V的恩爱情仇

原创不易,欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!


长按识别二维码关注我


你点的每个好看,我都认真当成了喜欢

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存