找回密码
 立即注册
楼主: manzunzu

8H/8G/8C/8A系列4组串口同时通信的程序,Modbus 演示程序;可共享T2做波特率发生器

 火.. [复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:497
  • 最近打卡:2025-04-30 20:48:13
已绑定手机

151

主题

589

回帖

1196

积分

金牌会员

积分
1196
发表于 2023-7-27 21:36:47 | 显示全部楼层
有这么一个帖子:求STC8系列4个串口同时通信的程序,Modbus 演示程序,我想收藏,始终没找收藏二字,https://www.stcaimcu.com/forum.p ... amp;page=3#pid22194,大家有兴趣的看一下,可能是我新注册,级别不够吧,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-7-27 22:05:16 | 显示全部楼层
38009*** 发表于 2023-7-27 21:26
感谢的您支持,其实不理解的发送后面是读,接收后面是写,接收后面是写,我理解的就是接收后,写入指定内 ...

读出要发送的字节,写入接收到的字节。
回复 支持 反对

使用道具 举报 送花

0

主题

5

回帖

38

积分

新手上路

积分
38
发表于 2023-8-15 11:54:54 | 显示全部楼层
学习了。到时候  借鉴一下。
回复 支持 反对

使用道具 举报 送花

0

主题

5

回帖

38

积分

新手上路

积分
38
发表于 2023-9-2 16:49:36 | 显示全部楼层
上边的modbus 文件  经过测试室可以的。   但是把他对应的改为串口2

void        UART2_config(u32 brt, u8 timer, u8 io)        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
{
        brt = 65536UL - (MAIN_Fosc / 4) / brt;
        if(timer == 2)        //波特率使用定时器2
        {
                AUXR |= 0x01;                //S1 BRT Use Timer2;
                SetTimer2Baudraye((u16)brt);
        }

        else                //波特率使用定时器1
        {
                TR1 = 0;
                AUXR &= ~0x01;                //S1 BRT Use Timer1;
                AUXR |=  (1<<6);        //Timer1 set as 1T mode
                TMOD &= ~(1<<6);        //Timer1 set As Timer
                TMOD &= ~0x30;                //Timer1_16bitAutoReload;
                TH1 = (u8)(brt >> 8);
                TL1 = (u8)brt;
                ET1 = 0;                        // 禁止Timer1中断
                INT_CLKO &= ~0x02;        // Timer1不输出高速时钟
                TR1  = 1;                        // 运行Timer1
        }

                 if(io == 1)        {S1_USE_P36P37();        P3n_standard(0xc0);}        //切换到 P3.6 P3.7
        else if(io == 2)        {S1_USE_P16P17();        P1n_standard(0xc0);}        //切换到 P1.6 P1.7
        else if(io == 3)        {S1_USE_P43P44();        P4n_standard(0x18);}        //切换到 P4.3 P4.4
//        else                                {S1_USE_P30P31();        P3n_standard(0x03);}        //切换到 P3.0 P3.1
        else                                {S2_USE_P10P11();        P1n_standard(0xc0);}        //切换到 P1.0 P1.1

        S2CON = (S2CON & 0x3f) | (1<<6);        // 8位数据, 1位起始位, 1位停止位, 无校验
//        PS  = 1;        //高优先级中断
        ES  = 1;        //允许中断
        REN = 1;        //允许接收

     切换到 P1.0 P1.1,且用RS485的格式   P37=1;为从机发送   P37=0;为从机接收。
没有成功。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:383
  • 最近打卡:2025-04-30 09:42:19

40

主题

194

回帖

601

积分

高级会员

积分
601
发表于 2023-9-3 21:59:46 | 显示全部楼层


今天利用周末时间,看到了腾讯会议上梁工讲的MODBUS协议部分的讲解。梁工讲的太棒了。
梁工的程序一直那么严谨,思路清淅,讲的也很透彻。




1111.png
回复 支持 反对

使用道具 举报 送花

0

主题

5

回帖

38

积分

新手上路

积分
38
发表于 2023-9-14 19:10:38 | 显示全部楼层
已经  调通了。  注意如果用串口2的接出串口线的话,,串口2又接了RS485的芯片是会有影响的。要去掉RS485芯片  ,在试串口2.
回复 支持 反对

使用道具 举报 送花

8

主题

29

回帖

164

积分

注册会员

积分
164
发表于 2023-9-26 10:49:26 | 显示全部楼层
梁*** 发表于 2022-12-19 13:09
STC8H/STC8G 的 4组独立串口程序, 通用
Modbus 演示程序, 2023/8/28更新
解压缩后参考、测试“08-串口1中 ...

怎么在降龙棍里实验

点评

直接下载HEX文件就可以测试了。  详情 回复 发表于 2023-9-26 11:28
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-9-26 11:28:42 | 显示全部楼层
本帖最后由 梁工 于 2023-9-26 11:31 编辑
182208*** 发表于 2023-9-26 10:49
怎么在降龙棍里实验

直接下载HEX文件就可以测试了,不过要用引线接串口出来(降龙棍只有USB口)。
回复 支持 反对

使用道具 举报 送花

8

主题

29

回帖

164

积分

注册会员

积分
164
发表于 2023-9-30 19:32:42 | 显示全部楼层
梁*** 发表于 2023-9-26 11:28
直接下载HEX文件就可以测试了,不过要用引线接串口出来(降龙棍只有USB口)。 ...

降龙棍的P3.0和P3.1口自己焊接了排针,外接串口不行

点评

不好意思!我的例程是STC8系列的,降龙棍勇的是STC32G,不能直接下载运行(我记混了)。 下面的工程我改为STC32G的了,直接下载"Objects"里的"UART1.hex"测试即可, 主频选择11.0592MHZ。 /***********************  详情 回复 发表于 2023-9-30 21:21
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-9-30 21:21:40 | 显示全部楼层
182208*** 发表于 2023-9-30 19:32
降龙棍的P3.0和P3.1口自己焊接了排针,外接串口不行

不好意思!我的例程是STC8系列的,降龙棍勇的是STC32G,不能直接下载运行(我记混了)。
下面的工程我改为STC32G的了,直接下载"Objects"里的"UART1.hex"测试即可, 主频选择11.0592MHZ。


/*********************************************************/
#define MAIN_Fosc                11059200L        //定义主时钟
#include        "..\..\STC32G.h"


/*************        功能说明        **************
请先别修改程序, 直接下载"08-串口1中断收发-C语言-MODBUS-RTU协议"里的"Objects"里的"UART1.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.

串口1按MODBUS-RTU协议通信. 本例为从机程序.


本例程只支持多寄存器读和多寄存器写, 寄存器长度为64个, 别的命令用户可以根据需要按MODBUS-RTU协议自行添加.
本例子数据使用大端模式(与C51一致), CRC16使用小端模式(与PC一致).


默认参数:
串口1设置均为 1位起始位, 8位数据位, 1位停止位, 无校验.
串口1(P3.0 P3.1): 9600bps.

定时器0用于超时计时. 串口每收到一个字节都会重置超时计数, 当串口空闲超过35bit时间时(9600bps对应3.6ms)则接收完成.
用户修改波特率时注意要修改这个超时时间.

本例程只是一个应用例子, 科普MODBUS-RTU协议并不在本例子职责范围, 用户可以上网搜索相关协议文本参考.
本例定义了64个寄存器, 访问地址为0x1000~0x103f.
命令例子:
写入4个寄存器(8个字节):
10 10 1000 0004 08 1234 5678 90AB CDEF 4930
返回:
10 10 10 00 00 04 C64B
读出4个寄存器:
10 03 1000 0004 4388
返回:
10 03 08 12 34 56 78 90 AB CD EF D53D

命令错误返回信息(自定义):
0x90: 功能码错误. 收到了不支持的功能码.
0x91: 命令长度错误.
0x92: 写入或读出寄存器个数或字节数错误.
0x93: 寄存器地址错误.

注意: 收到广播地址0x00时要处理信息, 但不返回应答.

******************************************/


STC32G-串口相关程序.rar (65.97 KB, 下载次数: 205)


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 20:26 , Processed in 0.178029 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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