STM32 modbus程序

STM32 modbus程序

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

modbus-rtu 通讯规约

通讯方式:rs-485 半双功

校验方式:crc16

停止位:2位

编写:孙可

编写日期:2008年6月18日

版本:v0.2

编程思路:

1.串口中断允许自动接收总线上的信息,当接收的

字节后超过3.5个字节时间没有新的字节认为本次

接收完成,接收完成标志置1;如果接收完成标志已

经置1又有数据进来则丢弃新来的数据。

2.串口接收数据的处理, 当接收完成标志置1进入

接收数据处理, (1)首先判断接收的第一位数据与

本机地址是否相同,如果不相同清空接收缓存不发

送任何信息; (2)接收的第一位数据与本机地址相

同,则对接收缓存中的数据进行crc16校验,如果接

收的校验位与本校验结果不相同清空接收缓存不发

送任何信息;

(3)如果crc16校验正确则根据数据串中的命令码进

行相应的处理。

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

#include "modbus.h"

u8 Com0_id = 0x05;//本机串口0的通讯地址

u8 Uart0_rev_buff[100];//com0串口接收缓冲区

u8 Uart0_send_buff[100];//com0串口发送缓冲区

vu8 Uart0_rev_count;

vs8 Uart0_send_counter = 0;

vu8 Uart0_rev_comflag;

vu8 Crc_counter = 0;//com0校验计数器

vu8 *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;//浮充电压

vu16 user_day = 1825;//使用天数

void Delay(vu32 nCount);

unsigned short getCRC16(volatile unsigned char *ptr,unsigned char len) ;

void mov_data(u8 a[100],u8 b[100],u8 c);

void Modbus_Function_3(void);

void Modbus_Function_6(void);

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

函数名称:crc16校验

函数功能:crc16校验

函数输入:字节指针*ptr,数据长度len

函数返回:双字节crc

函数编写:孙可

编写日期:2008年6月9日

函数版本:v0.2

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

unsigned short getCRC16(volatile unsigned char *ptr,unsigned char len)

{

unsigned char i;

unsigned short crc = 0xFFFF;

if(len==0)

{

len = 1;

}

STM32 modbus程序相关文档

最新文档

返回顶部