迪文科技论坛

 找回密码
 立即注册
搜索
查看: 936|回复: 5

【开源】收音机 modbus主从源码 ,STM32主,迪文屏从 干货

[复制链接]

9

主题

15

回帖

896

积分

高级会员

Rank: 4

积分
896
QQ
发表于 2023-9-13 11:04:49 | 显示全部楼层 |阅读模式
这个STM32 modbus框架总线,如果有多个从机,硬件上可以用485接口,也可以用其实方式进行隔离,
适用于1主多个从机之间的通信,只要添加数组指令,即可跑多个从机

视频效果如下链接
https://v.youku.com/v_show/id_XNjAyNzM2NjIyMA==.html

效果图


1.屏幕上原理图

上面是stm32的

这个是连接屏幕的串口2

2.屏幕界面工程上讲解

屏幕的界面上比较简单,设置如下


给每个触摸变量,和显示变量,输入地址

地址表如下:
  
收音机底下按键
  
1
0x2200
静音按键与图标
1
0x2201+1
收音机频号
2
0x2202
收音机FM/AM
4
0x2204+04
收音机 Mhz/Khz
4
0x2208+04
频率显示
3
0x220C+03

3.屏幕modbus讲解
主要如下内容
屏幕使用的是串口2




voidMainMachineHandle(void)
{
                     if(UartDataHandle)
                     {
                     uartHandle(Uart4_Rx,uart4_rx_count);
                     CLR_UartMp3();
                     }
}

voidOneMsHandle(void)
{
                     if(!OnemsFlag)
                     return;
                     OnemsFlag=0;

                     MainMachineHandle();
}



bool uartHandle(u8*Tdata,u8 len);




4.主MCU 的modbus讲解
用了ucosiii 系统
初始化硬件
Init_HW();
voidInit_HW(void)
{
                           uart_init();    //串口波特率设置
                           LED_Init();         //LED初始化
}

voidTaskInit(void);
这里新建了3个线程

LOOP_task 这个是主循环,查看触摸等,是否发生了变化,进行控制操作,和收音机的控制
RecDataHandle_task 进行串口接收数据的控制
DMT_task 这个是重点,modbus底层逻辑
voidCommandHandle(void);
voidUartRecHandle(void);
u16advanceCmd=5000;
u16DevCountError[3]={0,0,0};
// DMTDisplay_ID在 0
u8JumpChildID[3]={0,0,0};
//页面ID位于 数组0号
u8 DmtDataBuf[DmtDataBufMax][2] ={
};
const u8Dmt60Pageid[][10]=
{
//0 //读取歌曲进度页面
{0x00},
};
//0x03 0x060x10  len是字长度
//;0=5A(启用)  1=模式 2=延时 3 4=备份(利用) 5=从id 6=cmd
//;7=len  8 9=本机内存  10 11=从内存地址 12:执行当前指令完成
u8 DmtModbus[DMTCommandLen][13] ;
voidModubusInputEvents(ModbusEven *Even);
boolReadModubusHasOk(u8 id);
voidCmdMoubusEnable(u8 CmdLineNum,u8 Enable);
boolWaitModbusOK(u8 id);
//0xffff 为清除变量
ModbusHandleSTSendCommand(u16 CommandID);

voidCommandHandle这个比较 重要,底层modbus框架,在这里运行
voidCommandHandle(void);

其中 DmtModbus ,这个数组比较重要,在这里,你添加你自已需要的指令控制
几个简单使用的核心函数
voidDMT_ChangePage(u16 page);
只要使用了这个函数,就能改变屏幕的页面
//写从机地址内容
voidDMT_WriteLen(u16 addr,u8 *data,u8 len,u8 clearBuff);
//len 为多少个字
//读从机地址内容
voidDMT_ReadLen(u8 ChildID,u16 addr,u8 *data,u8 len);
//屏幕上显示的字符串
voidDMT_DispString(u16 addr,char *data);
//addr 从内存地址
//清理掉从机地址内容为0
voidClearDGUSIIMemory(u8 len,u16 addr);
收音机的源码,我就不讲了,感兴趣的自已去看,用的是I2C通信的驱动。
整个框架,就是这样,新手感兴趣可以下载理解下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

9

主题

15

回帖

896

积分

高级会员

Rank: 4

积分
896
QQ
 楼主| 发表于 2023-9-30 13:28:53 | 显示全部楼层
自己顶一个
回复

使用道具 举报

18

主题

79

回帖

407

积分

中级会员

Rank: 3Rank: 3

积分
407
发表于 2023-10-31 16:19:16 | 显示全部楼层
厉害  可惜不是freertos 不然我就拿到项目中参考了
回复

使用道具 举报

9

主题

15

回帖

896

积分

高级会员

Rank: 4

积分
896
QQ
 楼主| 发表于 2023-11-1 10:54:24 | 显示全部楼层
吴天明 发表于 2023-10-31 16:19
厉害  可惜不是freertos 不然我就拿到项目中参考了

其实,用STM32移植好的freertos,在上面稍微移植一下,代码就行了,很简单的。
回复

使用道具 举报

0

主题

6

回帖

105

积分

注册会员

Rank: 2

积分
105
发表于 2023-11-3 17:52:17 | 显示全部楼层
小白Mark来学习
回复

使用道具 举报

9

主题

35

回帖

346

积分

中级会员

Rank: 3Rank: 3

积分
346
发表于 2023-11-15 17:08:14 | 显示全部楼层
很有帮助  谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-12-4 01:29 , Processed in 0.070238 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表