1. 项目背景与需求分析
做嵌入式开发的朋友们应该都深有体会,调试传感器数据或者分析电路信号时,一台示波器是多么重要。但专业示波器价格昂贵,携带也不方便。我之前在做智能小车项目时,就经常需要实时观察电机转速和姿态传感器的数据变化,于是萌生了自己动手做一个简易示波器的想法。
基于QT和单片机串口通信的示波器方案,正好解决了这个痛点。单片机负责采集模拟信号(比如温度、电压、加速度等),通过串口发送给上位机,QT程序接收数据并实时绘制成波形图。这种方案成本极低,只需要一块常见的STC89C51或STM32单片机,加上QT开发的PC端软件就能实现基本示波器功能。
我最初尝试这个项目时,主要考虑三个应用场景:首先是教学演示,学生可以通过直观的波形理解传感器工作原理;其次是工业监控,比如生产线上的温度波动监测;最后是个人项目调试,比如机器人的姿态数据可视化。实际用下来发现,这种软硬件结合的方式不仅灵活,而且扩展性很强,后期添加新的传感器或数据分析功能都非常方便。
2. 硬件准备与单片机端编程
2.1 硬件选型与连接
单片机我选择了最经典的STC89C51,价格便宜且资料丰富,特别适合初学者。传感器方面,可以用简单的电位器模拟电压变化,或者使用MPU6050这类数字传感器获取更复杂的数据。关键是要注意电平匹配,51单片机的工作电压是5V,如果使用3.3V的传感器需要加电平转换模块。
串口通信硬件连接很简单:单片机的TXD引脚接USB转串口模块的RXD,RXD接TXD,地线对接。我建议使用CH340G或FT232芯片的串口模块,稳定性比PL2303好很多。第一次连接时最好用万用表测量电压,避免接反烧毁芯片,这个坑我亲自踩过。
2.2 数据采集与串口配置
单片机端的核心任务是采集数据并通过串口发送。对于模拟信号,需要用到ADC转换。STC89C51内部没有ADC,我外挂了PCF8591模块,支持4通道8位精度采集,完全够用。如果是STM32,可以直接使用内置的12位ADC,精度更高。
串口配置要注意波特率匹配,常用115200或9600。我的经验是短距离传输用115200,长距离则降低波特率提高稳定性。配置代码示例:
void uart_init()
{
SM0 = 0; // 8位数据位
SM1 = 1; // 可变波特率
PCON = 0; // 波特率不加倍
TMOD = 0x20; // 定时器1工作方式2
TH1 = 256 - 3; // 波特率9600
TL1 = 256 - 3;
TR1 = 1; // 启动定时器
REN = 1; // 允许接收
EA = 1; // 开总中断
ES = 1; // 开串口中断
}
2.3 数据发送格式设计
数据格式设计很重要,既要保证传输效率,又要便于QT端解析。我推荐两种方案:对于简单数据,可以直接发送原始字节流;复杂数据则用JSON格式,可读性好且扩展方便。实测发现JSON虽然有些冗余,但开发效率更高。
下面是发送JSON数据的示例代码:
void send_sensor_data(float voltage, float temperature)
{
unsigned char json_buffer[64];
sprintf(json_buffer, "{\"v\":%.2f,\"t\":%.2f}\n", voltage, temperature);
string(json_buffer);
}
void string(unsigned char *p)
{
while(*p != 0) {
SBUF = *p;
while(TI != 1); // 等待发送完成
TI = 0;
p++;
}
}
注意每个数据包末尾加换行符\n,这样QT端可以用readLine()方便地分割数据包。如果数据传输频率高,可以改用二进制协议,效率提升明显但调试更麻烦。
3. QT开发环境搭建
3.1 QT与QCustomPlot安装
推荐使用QT5.12或更高版本,这个版本比较稳定且资料丰富。安装时记得勾选MSVC编译器(Windows)或G


4255

被折叠的 条评论
为什么被折叠?



