推荐一款我私藏已久的串口示波神器
大家好,我是小麦,实不相瞒,关于串口示波器软件的文章,我之前写过一期了,具体可以看这个项目《一个超赞的开源串口虚拟示波器项目,玩起来!》。
这是一款开源的Qt库,非常简单,容易上手,还能二次开发,所以我就强烈推荐给大家了。
之前发过一篇关于SVPWM的文章《对不起!这篇SVPWM来晚了!》,于是不少读者朋友来询问文中的串口示波器能否共享一下。
当然是可以的,这款软件非常古老,但是却出奇地好用,用小而美来形容,丝毫不过分。
这个软件是上学时候,参加智能车比赛的时候用来调试PID
的利器,大家之前,在时域上分析时间响应的曲线,就可以完美通过串口示波器工具来显示,如果要采集的数据需要很高的采样频率,可以参考我这篇文章《一款超级好用的虚拟示波器软件》。
随着时间的推移,各种串口示波器软件层出不穷,但是我还是在用这个软件,下面我要开始安利了。
软件功能
这是软件主界面,支持的功能不是很多,但是完全够用了;
主要特性如下:
最多支持四个通道; 支持拖动,缩放波形; 支持将波形数据保存为matlab数据; 支持实时跟踪波形;
下面是我测试SVPWM生成的波形。
移植到所需平台
通常单片机上需要通过串口往PC发送数据,PC接受数据并将接受的数据通过图形显示出来,这中间数据就需要遵循一定规则,即双方约定好通讯协议。
所以下面我们来讲一下在硬件上适配通讯协议。
这里是几个文件列表,简单看一下SDS.c
和SDS.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);
大功告成;
公众号后台回复【串口示波器】获取。
原创不易,欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!
长按识别二维码关注我