1、硬件连接

单片机IO口配置

2、上位机系统环境

要用Windows系统,(XP 32bit亦可)。下载好SerialChart-0.3.4。

我使用的是Keil MDK 4 + STM32CubeMX。

SerialChart配置文件:

[_setup_]
port=COM9
baudrate=115200width=1000
height=400
background_color = whitegrid_h_origin = 0
grid_h_step = 10
grid_h_color = #EEE
grid_h_origin_color = #000grid_v_origin = 0
grid_v_step = 10
grid_v_color = #EEE
grid_v_origin_color = #000[_default_]
min=-8
max=8[interval]
color=transparent
min=0
max=100000[InVolt]
color=blue[InCurr]
color=red[InPwr][OutVolt]
color=black[OutCurr]
color=orange[OutPwr][an3]
color=transparent
min=0
max=1023

[_setup_]里:port口请选择正确的COM口,打开设备管理器确认,或者打开串口调试助手(我使用的是ATK-XCOM V2.0),即可查看对应的COM口。波特率baudrate=115200,这个参数要和STM32的对应。

[_default_]是默认参数的大小。这个范围外的界面无法显示。

[interval]以及以下的就是数据的配置,数据的名称可自由配置。[interval]是第一列数据。[InVolt]是第二列数据。[InCurr]是第三列数据。以此类推。因为当时我用这个配置文件,显示输入电流、输入电压、输出电流、输出电压,所以用这个英文名字。可以随意改的,与数据显示无关系的。

我使用的数据是:第一列是时间戳,第二列开始是CH1,第三列是CH2。

例子:SerialChart会显示一包数据:20180110083138,1.2931,0.0758

其中第一个数据是时间戳,指当前时刻是2018年1月10日8:31:38。第二个数据是CH1=1.2931V,第三个数据是CH2=0.0758V。

另外要注意在配置ADC_DMA时候,DMA要配置成Circular才可以调用HAL_ADC_Start_DMA()。如果还是DMA Mode Normal,会进入硬件hardfault_handler。不知道为什么。

3、STM32程序

参数声明:

float b_PirRaw,b_PirFltr;
char s_PirRaw[10];
char s_PirFltr[10];uint32_t b_date, b_month, b_year, b_hour, b_minute, b_second, b_day;
char s_time[25];
char a_date[2], a_month[2], a_year[4], a_hour[2], a_minute[2], a_second[2];

3.1 main主函数:

int main(void)
{while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(flag_100ms==1){flag_100ms=0;SerialDisplay();        //数据通过串口发送出去}if(flag_1s==1){    flag_1s=0;UpdateDateTime();        //更新时间}}/* USER CODE END 3 */}

3.2 SerialDisplay():


void SerialDisplay(void)
{s_time[0] = a_year[0];s_time[1] = a_year[1];s_time[2] = a_year[2];s_time[3] = a_year[3];s_time[4] = a_month[0];s_time[5] = a_month[1];s_time[6] = a_date[0];s_time[7] = a_date[1];s_time[8] = a_hour[0];s_time[9] = a_hour[1];s_time[10] = a_minute[0];s_time[11] = a_minute[1];s_time[12] = a_second[0];s_time[13] = a_second[1];s_time[14] = '\0';float2str(b_PirRaw, 2, s_PirRaw);    //将float转换为strfloat2str(b_PirFltr, 2, s_PirFltr);    //将float转换为strstrcpy(a_UartTxBuf, s_time);        //将s_time复制至a_UartTxBufstrcat(a_UartTxBuf, ",");           //这句语句效果是a_UartTxBuf += ","strcat(a_UartTxBuf, s_PirRaw);      //这句语句效果是a_UartTxBuf += s_PirRawstrcat(a_UartTxBuf, ",");  strcat(a_UartTxBuf, s_PirFltr);strcat(a_UartTxBuf, "\r\n");        //一个数据包的结尾是"\r\n",同时strlen计算字符串长度是计算到\r\nHAL_UART_Transmit(&huart1, (uint8_t*)a_UartTxBuf, strlen(a_UartTxBuf), 100);    //发送数据}

以上转换时间那几行真的不怎么优雅……

3.3 float2str

浮点数转换字符串。这代码我是复制的,来自https://www.cnblogs.com/gleam/p/3607984.html

/*** @brief  convert float to string* @param  * @usage  char buf[128]; *                  printf("%s\n", float2str((float)1234.56789, -2, buf)); * @retval None*/
char * float2str(float val, int precision, char *buf)
{char *cur, *end;sprintf(buf, "%.4f", val);if (precision < 4) {cur = buf + strlen(buf) - 1;end = cur - 4 + precision; while ((cur > end) && (*cur == '0')) {*cur = '\0';cur--;}}return buf;
}

3.4 UpdateDateTime

每秒要执行一次这代码,更新本机时间。


/** @brief UpdateDateTime* input param: none* output param: none* relevent param: b_date b_month b_year b_hour b_minute b_second* must be execute every 1 second*/
void UpdateDateTime(void)
{b_second++;if(b_second>=60){b_second = 0;b_minute++;if(b_minute>=60){b_minute = 0;b_hour++;if(b_hour>=24){b_hour = 0;b_date++;if((b_date>=29)&&(b_month==2)){b_date = 1;b_month++;}if((b_date>=30)&&(b_month==2)&&(b_year%4==0)){b_date = 1;b_month++;}else if((b_date>=29)&&(b_month==2)&&(b_year%4!=0)){b_date = 1;b_month++;}  else if((b_date>=31)&&((b_month==4)||(b_month==6)||(b_month==9)||(b_month==11))){b_date = 1;b_month++;}else if((b_date>=32)&&((b_month==1)||(b_month==3)||(b_month==5)||(b_month==7)||(b_month==8)||(b_month==10)||(b_month==12))){b_date = 1;b_month++;if(b_month>=13){b_month = 1;b_year++;}}}}}a_year[0] = b_year/1000 + '0';a_year[1] = b_year%1000/100 + '0';a_year[2] = b_year%100/10 + '0';a_year[3] = b_year%10 + '0';a_month[0] = (uint8_t)b_month/10 + '0';a_month[1] = (uint8_t)b_month%10 + '0';a_date[0] = (uint8_t)b_date/10 + '0';a_date[1] = (uint8_t)b_date%10 + '0';a_hour[0] = (uint8_t)b_hour/10 + '0';a_hour[1] = (uint8_t)b_hour%10 + '0';a_minute[0] = (uint8_t)b_minute/10 + '0';a_minute[1] = (uint8_t)b_minute%10 + '0';a_second[0] = (uint8_t)b_second/10 + '0';a_second[1] = (uint8_t)b_second%10 + '0';}

4、显示效果

以上看到本程序使用的数据包格式是:

<Timestramp>,<ch1>,<ch2>\r\n

即实现了带时间戳的双通道数据显示。

如果需要显示4通道,可以按照这样的格式:

<Timestramp>,<ch1>,<ch2>,<ch3>,<ch4>\r\n

如果需要显示更多的数据,可以按照这样的格式:

<Timestramp>,<ch1>,<ch2>,<ch3>,<ch4>,<ch5>,<ch6>,...,<chn>\r\n

也可以不发送第一列时间戳,但要在配置文件中删除[interval]

共享了工程:

链接: https://pan.baidu.com/s/1CQk6l4ziFMHXGxQEBbF_OA 提取码: aey4

使用STM32串口模块配合SerialChart实现虚拟示波器功能相关推荐

  1. Jlink使用技巧之J-Scope虚拟示波器功能

    J-Link简介 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.简单地说,是给一个JTAG协议转换盒.其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议. ...

  2. 两个HC-05蓝牙模块互相绑定构成无线串口模块 1

    文章目录 关于HC-05蓝牙模块 工作模式 获取蓝牙模块地址 两个蓝牙模块互相绑定 对A模块的设置: 对B模块的设置: HC蓝牙模块参考资料 SPP蓝牙模块参考资料 关于HC-05蓝牙模块 蓝牙模块B ...

  3. STM32串口打印输出乱码的解决办法

    前言 最近在试用uFUN开发板,下载配套的Demo程序,串口数据输出正常,当使用另一个模板工程,调用串口printf调试功能时,输出的却是乱码,最后发现是外部晶振频率不一样.很多STM32开发板都是使 ...

  4. STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...

  5. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  6. HC06蓝牙2.0模块连接不稳定 和 STM32串口不传输数据(串口接收中断)的一些问题

    HC06蓝牙2.0模块连接不稳定和STM32串口不传输数据(串口接收中断)的一些问题(推荐) 1.蓝牙 最近,在一个项目中使用到蓝牙,但是调试过程出现了很多问题. 刚开始使用的是HC06蓝牙,刚开始使 ...

  7. 使用CH340串口模块对STM32进行程序下载

    使用CH340串口模块对STM32进行程序下载 一.接线 二.利用FlyMcu进行STM32程序下载 1.STM32配置 2.FlyMcu配置 一.接线 CH340 STM32 VCC VCC GND ...

  8. MJKDZ PS2手柄控制OskarBot小车(三):STM32接收无线串口模块的数据并处理

    MJKDZ PS2手柄控制OskarBot小车(三):无线串口模块接收数据并处理 [目录] 1.硬件与软件设计思路 - 1.1 硬件资源 - 1.2 STM32串口接收数据的方法 2.源代码详解 - ...

  9. stm32驱动Lora串口模块

    本文使用的硬件 stm32MCU+亿佰特-Lora串口模块,型号E32-433T20D 定义各配置字节 /*配置报文头部选项*/ #define HEAD_Save 0xC0//配置后掉电保存 #de ...

最新文章

  1. 把eclipse从英文调整为中文
  2. windows 2003 活动目录的更改域名后缀技巧
  3. getcoo php_PHP简单实现DES加密解密的方法
  4. git 第三天 SSH免密码登录 2
  5. Netty实战 IM即时通讯系统(十一)pipeline与channelHandler
  6. 一直以来都没直视的轮播-_-
  7. MSSQL-最佳实践-如何监控备份还原进度
  8. “sudo: apt-get:找不到命令”的解决方法
  9. 电脑太慢了最简单的办法怎么弄_最简单的电脑端微信多开方法
  10. IP地址规划设计技术
  11. p值小于0.05拒绝还是接受_p值的困惑
  12. poj1008(Maya Calendar)玛雅历(c++实现)
  13. dba成长随笔 -- 深入了解Oracle
  14. 逆火软件测试工资,HyperXPulsefireFPS逆火评测 值不值得买
  15. CF949D Curfew solution
  16. 经典语录 - 人生十悟
  17. chatGPT发送图片的方法
  18. 连接手表_小米手表首批已到手 这些事儿你必须知道
  19. 你的typora图床配置了吗?人家都开始收费了
  20. 计算机网络管理员设备清单,网络管理员资料:计算机网络互联设备路由器

热门文章

  1. 阿撸php手册,《一屋赞客》原班人马 打造《宅男防撸手册》
  2. java微信小程序开发教程,靠着这份面试题跟答案
  3. Linux内核文件系统5
  4. 前世五百次的回眸,才换来今生的擦肩而过。
  5. CAS操作与ABA问题
  6. 【笨嘴拙舌WINDOWS】SetCapture和ReleaseCapture
  7. SpringCloud及单点登录
  8. php echo 中文乱码_怎么解决php echo中文乱码问题?
  9. 无人机航空摄影测量技术的优势
  10. 基于用户的协同过滤(user-based collaborative filtering)