[原创]发一个基于MODBUS-RTU规约的485通讯

新作!在别的论坛都没发过的.开发环境IAR4.42A
/*****************************************************
          modbus-rtu 通讯规约
通讯方式:rs-485 半双功
校验方式:crc16
停止位:2位
编写:孙可
编写日期:2008年8月26日
版本:v0.3(励磁的通讯)
编程思路:
    1.串口中断允许自动接收总线上的信息,当接收的
    字节后超过3.5个字节时间没有新的字节认为本次
    接收完成,接收完成标志置1;如果接收完成标志已
    经置1又有数据进来则丢弃新来的数据。
    2.串口接收数据的处理, 当接收完成标志置1进入
    接收数据处理, (1)首先判断接收的第一位数据与
    本机地址是否相同,如果不相同清空接收缓存不发
    送任何信息; (2)接收的第一位数据与本机地址相
    同,则对接收缓存中的数据进行crc16校验,如果接
    收的校验位与本校验结果不相同清空接收缓存不发
    送任何信息;
    (3)如果crc16校验正确则根据数据串中的命令码进
    行相应的处理。
******************************************************/
#include "modbus.h"

unsigned char Com0_id = 0x05;//本机串口0的通讯地址
unsigned char Uart0_rev_buff[100];//com0串口接收缓冲区
unsigned char Uart0_send_buff[100];//com0串口发送缓冲区
volatile unsigned char Uart0_rev_count;
vs8 Uart0_send_counter = 0;
volatile unsigned char Uart0_rev_comflag;
volatile unsigned char Crc_counter = 0;//com0校验计数器
volatile unsigned char *Uart0_send_pointer = Uart0_send_buff;//com0串口发送指针
vu16 Mkgz_bz = 0;//模块故障标志1:输入异常,2:过压,3:欠压,4:过温
vu16 Out_current = 50;//输出电流
vu16 Out_voltage = 240;//输出电压
vu16 Mkzt_bz = 0;//模块状态标志
vu16 OutX_current = 1000;//输出限流
vu16 Jc_voltage = 2530;//均充电压
vu16 Fc_voltage = 2400;//浮充电压

MODBUS2.rar (287.6 KB)

2

评分人数

  • aleyn

  • jasonjee

谢谢楼主的原创作品。

TOP

下载回来,细细研读。谢谢sunke9的热心贡献。

TOP

好东西撒。顶一个先

TOP

下载回来,细细研读。谢谢sunke9的热心贡献。

TOP

谢谢楼主的无私奉献。顶一个

TOP

下来,学习下

TOP

下来研究一下!

TOP

谢谢,参考一下,我正做tcpipmodbus

TOP

好东西,先研究一下.

TOP

下载回来,细细研读

TOP

已下~~~~~~~~~~~~~

TOP

高手 谢谢 我做PLC

TOP

谢谢 学习一下

TOP

这个很不错哦,谢谢楼主

TOP

学习学习

TOP

请教个问题,如果接收的数据正确,对于写寄存器其操作,要写的数不是要求的范伟,该怎么办?

TOP

回楼上:你可以加判断程序进行限制

TOP

娃哈哈哈 谢谢小可哥的无私奉献哦 呵呵
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

谢谢

TOP

学习了,谢谢。

TOP

这是主机的还是从机的

TOP

从机,主机是PC机

TOP

很好的东西支持

TOP

在楼主的帮助下,我把这个程序用在上海沁科的SK学习版上。也能通讯啦。
谢谢楼主!

[ 本帖最后由 laotong 于 2008-11-20 16:03 编辑 ]

TOP

谢谢,参考一下

TOP

很好的东西支持

TOP

谢谢,学习一下

TOP

正好要做Modbus ,学习一下,谢谢了

TOP

谢谢楼主了~~~

TOP

Review opelc.org on alexa.com