这个STM32 modbus框架总线,如果有多个从机,硬件上可以用485接口,也可以用其实方式进行隔离, 适用于1主多个从机之间的通信,只要添加数组指令,即可跑多个从机
视频效果如下链接 https://v.youku.com/v_show/id_XNjAyNzM2NjIyMA==.html
效果图
1.屏幕上原理图
上面是stm32的
这个是连接屏幕的串口2
2.屏幕界面工程上讲解
屏幕的界面上比较简单,设置如下
给每个触摸变量,和显示变量,输入地址
地址表如下:
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通信的驱动。 整个框架,就是这样,新手感兴趣可以下载理解下 |