380091044 发表于 2023-7-27 21:36:47

有这么一个帖子:求STC8系列4个串口同时通信的程序,Modbus 演示程序,我想收藏,始终没找收藏二字,https://www.stcaimcu.com/forum.php?mod=viewthread&tid=375&page=3#pid22194,大家有兴趣的看一下,可能是我新注册,级别不够吧,

梁工 发表于 2023-7-27 22:05:16

380091044 发表于 2023-7-27 21:26
感谢的您支持,其实不理解的发送后面是读,接收后面是写,接收后面是写,我理解的就是接收后,写入指定内 ...

读出要发送的字节,写入接收到的字节。

wuzhenchuang 发表于 2023-8-15 11:54:54

学习了。到时候借鉴一下。

wuzhenchuang 发表于 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;为从机接收。
没有成功。

康辉55AA 发表于 2023-9-3 21:59:46



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




wuzhenchuang 发表于 2023-9-14 19:10:38

已经调通了。注意如果用串口2的接出串口线的话,,串口2又接了RS485的芯片是会有影响的。要去掉RS485芯片,在试串口2.

18220866638 发表于 2023-9-26 10:49:26

梁工 发表于 2022-12-19 13:09
STC8H/STC8G 的 4组独立串口程序, 通用
Modbus 演示程序, 2023/8/28更新
解压缩后参考、测试“08-串口1中 ...

怎么在降龙棍里实验

梁工 发表于 2023-9-26 11:28:42

本帖最后由 梁工 于 2023-9-26 11:31 编辑

18220866638 发表于 2023-9-26 10:49
怎么在降龙棍里实验
直接下载HEX文件就可以测试了,不过要用引线接串口出来(降龙棍只有USB口)。

18220866638 发表于 2023-9-30 19:32:42

梁工 发表于 2023-9-26 11:28
直接下载HEX文件就可以测试了,不过要用引线接串口出来(降龙棍只有USB口)。 ...

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

梁工 发表于 2023-9-30 21:21:40

18220866638 发表于 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时要处理信息, 但不返回应答.

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





页: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
查看完整版本: 8H/8G/8C/8A系列4组串口同时通信的程序,Modbus 演示程序;可共享T2做波特率发生器