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