Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件。 支持485和232串口通信,该从机源码支持51系列和STC12系列单片机,支持功能码01,02,03,04,05,06,15,16等常用功能码...买该源码赠送威纶通,信捷,昆仑通泰三个触摸屏的测试工程文件,界面看图片。

最近在折腾Modbus RTU协议,搞了个51单片机的从机工程,顺手把昆仑通泰触摸屏的测试工程也打通了。这玩意儿支持485和232双通信模式,实测STC89C52和STC12C5A60S2都能跑,手里有老旧开发板的可以拿出来溜溜了。

串口配置这块挺有意思,直接看代码:

void UART_Init() {
    SCON = 0x50;        // 8位数据+可变波特率
    TMOD |= 0x20;       // 定时器1模式2
    TH1 = 0xFD;         // 9600波特率@11.0592MHz
    TR1 = 1;
    ES = 1;             // 允许串口中断
}

这里有个坑——STC12系列需要额外配置AUXR寄存器。解决办法是用条件编译:

#ifdef STC12
    AUXR |= 0x01;       // 切换定时器1到1T模式
#endif

Modbus的核心在功能码处理。比如处理03功能码(读保持寄存器)时,数据帧组装要特别注意字节序:

void Handle03(uint8_t *pdu) {
    uint16_t startAddr = (pdu[1] << 8) | pdu[2];
    uint16_t regCount = (pdu[3] << 8) | pdu[4];
    
    response[0] = 0x03;
    response[1] = regCount * 2;
    for(int i=0; i<regCount; i++) {
        response[2+i*2] = holdingReg[startAddr+i] >> 8;
        response[3+i*2] = holdingReg[startAddr+i] & 0xFF;
    }
    SendResponse(response, 2 + regCount*2);
}

实测发现昆仑通泰的地址偏移和标准Modbus有差异。他们的输入框地址得从40001开始填,但底层会自动减1,所以在单片机里寄存器数组得从0开始对应40001地址。

Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件。 支持485和232串口通信,该从机源码支持51系列和STC12系列单片机,支持功能码01,02,03,04,05,06,15,16等常用功能码...买该源码赠送威纶通,信捷,昆仑通泰三个触摸屏的测试工程文件,界面看图片。

触摸屏测试工程里有个实用技巧——用指示灯控件绑定线圈状态。在HMI软件里设置读取地址为0x0001(对应01功能码的00001地址),再关联到图片切换动画,就能实现LED灯的状态同步。

源码包里还藏了个调试彩蛋:在发送函数里加了串口打印,用调试助手能看到原始数据帧。遇到通信故障时,把下面这行取消注释就能抓包:

// DebugHex(frame, len);  // 调试时打开

赠送的威纶通工程里用了他们家的宏指令做数据转换,信捷的工程文件则需要注意他们的地址是直接十进制输入,不像昆仑通泰需要加偏移量。三个厂家的HMI配置差异挺大,建议先用昆仑通泰入门。

最后说个实战经验:用STC12跑Modbus时,如果通信不稳定,试试在RS485芯片的DE/RE引脚加个10us的延时。这个细节在源码的发送函数里已经处理好,但自己移植时容易漏掉。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐