使用STM32串口模块配合SerialChart实现虚拟示波器功能
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实现虚拟示波器功能相关推荐
- Jlink使用技巧之J-Scope虚拟示波器功能
J-Link简介 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.简单地说,是给一个JTAG协议转换盒.其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议. ...
- 两个HC-05蓝牙模块互相绑定构成无线串口模块 1
文章目录 关于HC-05蓝牙模块 工作模式 获取蓝牙模块地址 两个蓝牙模块互相绑定 对A模块的设置: 对B模块的设置: HC蓝牙模块参考资料 SPP蓝牙模块参考资料 关于HC-05蓝牙模块 蓝牙模块B ...
- STM32串口打印输出乱码的解决办法
前言 最近在试用uFUN开发板,下载配套的Demo程序,串口数据输出正常,当使用另一个模板工程,调用串口printf调试功能时,输出的却是乱码,最后发现是外部晶振频率不一样.很多STM32开发板都是使 ...
- STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时
参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- HC06蓝牙2.0模块连接不稳定 和 STM32串口不传输数据(串口接收中断)的一些问题
HC06蓝牙2.0模块连接不稳定和STM32串口不传输数据(串口接收中断)的一些问题(推荐) 1.蓝牙 最近,在一个项目中使用到蓝牙,但是调试过程出现了很多问题. 刚开始使用的是HC06蓝牙,刚开始使 ...
- 使用CH340串口模块对STM32进行程序下载
使用CH340串口模块对STM32进行程序下载 一.接线 二.利用FlyMcu进行STM32程序下载 1.STM32配置 2.FlyMcu配置 一.接线 CH340 STM32 VCC VCC GND ...
- MJKDZ PS2手柄控制OskarBot小车(三):STM32接收无线串口模块的数据并处理
MJKDZ PS2手柄控制OskarBot小车(三):无线串口模块接收数据并处理 [目录] 1.硬件与软件设计思路 - 1.1 硬件资源 - 1.2 STM32串口接收数据的方法 2.源代码详解 - ...
- stm32驱动Lora串口模块
本文使用的硬件 stm32MCU+亿佰特-Lora串口模块,型号E32-433T20D 定义各配置字节 /*配置报文头部选项*/ #define HEAD_Save 0xC0//配置后掉电保存 #de ...
最新文章
- 把eclipse从英文调整为中文
- windows 2003 活动目录的更改域名后缀技巧
- getcoo php_PHP简单实现DES加密解密的方法
- git 第三天 SSH免密码登录 2
- Netty实战 IM即时通讯系统(十一)pipeline与channelHandler
- 一直以来都没直视的轮播-_-
- MSSQL-最佳实践-如何监控备份还原进度
- “sudo: apt-get:找不到命令”的解决方法
- 电脑太慢了最简单的办法怎么弄_最简单的电脑端微信多开方法
- IP地址规划设计技术
- p值小于0.05拒绝还是接受_p值的困惑
- poj1008(Maya Calendar)玛雅历(c++实现)
- dba成长随笔 -- 深入了解Oracle
- 逆火软件测试工资,HyperXPulsefireFPS逆火评测 值不值得买
- CF949D Curfew solution
- 经典语录 - 人生十悟
- chatGPT发送图片的方法
- 连接手表_小米手表首批已到手 这些事儿你必须知道
- 你的typora图床配置了吗?人家都开始收费了
- 计算机网络管理员设备清单,网络管理员资料:计算机网络互联设备路由器