该方法基于单位某园区的老旧电表物联改造工作项目,作者主要负责下位机端的选型制作与编写代码、以及和服务器端工程师进行对接,并对服务器编程进行了自学。
开发环境
选用RT-Thread官方idea:RT-Thread Studio,并配合使用STM32官方开发环境STM32CUBEMX配置引脚,初学者可以通过该链接进行配置
RT-Thread Studio联合STM32CubeMX进行开发
系统流程

该项目中,下位机使用json格式数据,定时将485菊花链连接的多个电表数据发送到服务器。STM32主要使用了串口1和串口3来进行通讯,串口1将数据转换成485信号,和电表进行指令的发送和数据的读取;串口3对串口1接受到的电表数据进行json格式打包,通过4G模块发送给服务器云端。
软件流程

测试代码
相关变量的定义
unsigned char usart_tx_data[89]; //4G模块发送数组
unsigned char usart_485_send[8]; //485发送数组
uint8_t power_sum[20]={
0}; //电量存储数组
uint8_t test_data[100]={
0};
rt_mutex_t dynamic_mutex = RT_NULL;
char not_connect_4G=0; //连接4G未成功次数
unsigned char receive_ok; //统计电表接受次数
串口1接收数据回调函数
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
rt_sem_release(&rx_sem1);
return RT_EOK;
}
串口1的相关线程
static void serial_thread_entry(void *parameter)
{
char ch;
char Con485_i = 0;
while (1)
{
/* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
while (rt_device_read(serial1, -1, &ch, 1) != 1)
{
/* 阻塞等待接收信号量,等到信号量后再次读取数据 */
rt_sem_take(&rx_sem1, RT_WAITING_FOREVER);
}
rt_device_write(serial1, 0, &ch, 1);
//接收到了电表发来的数据
receive_ok++;
if(receive_ok == 4 )//接收到了四个电表的数据
{
Connect_4G();
//清空、置FF操作
receive_ok = 0;
power_sum[4*Con485_i-1]=0xff;
power_sum[4*Con485_i-4]=0xff;
power_sum[4*Con485_i-2]=0xff;
power_sum[4*Con485_i-3]=0xff;
Con485_i = 0;
}
else
{
power_sum[4*Con485_i++]=ch;
}
}
}
串口1的初始化函数并导出到 msh 命令列表中(从命令行启动)
int uart_sample(void)

本文介绍了一个基于STM32的老旧电表物联改造项目,通过RT-Thread和STM32CUBEMX配置实现下位机开发。下位机使用串口1和串口3,采用485菊花链读取多个电表数据,通过4G模块以JSON格式上传至服务器。串口1接收电表数据并打包,串口3发送至服务器。项目涉及串口通信、数据处理和服务器对接,具备定时发送和错误处理机制。
最低0.47元/天 解锁文章

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



