📄 modbusslaver.c
字号:
#include "msp430x42x.h"
#include "Global.h" // 全局定义
#include "ModbusReg.h" // 数据操作, 错误定义
#include "USART.h" // 串口硬件操作, 错误定义
unsigned char Reg_MasterAddress = 4; // 主机地址
// 发送信息
unsigned char Sended_SlaverAddress;
unsigned char Sended_Function;
unsigned int Sended_StartingAddress;
unsigned int Sended_NoOfRegisters;
unsigned char Flg_CommStatus;
// 发送 - 读单/多寄存器操作命令
void Modbus_Echo_Command0x03(void)
{
unsigned char Receive_SlaverAddress; // 接收到的从机地址
unsigned char Receive_Function; // 接收到的功能代码
unsigned int Receive_StartingAddress; // 接收到的寄存器起始地址
unsigned int Receive_NoOfRegisters; // 接收到的寄存器数据个数
unsigned char Tmp_DataHi;
unsigned char Tmp_DataLo;
unsigned int Tmp_RegisterData;
unsigned char i;
// 读取信息
Flg_CommStatus = USART_ReceiveByte(&Receive_SlaverAddress); // 获得从机地址
Flg_CommStatus = USART_ReceiveByte(&Receive_Function); // 功能代码
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
Receive_StartingAddress = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
Receive_NoOfRegisters = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
Queue_ClearRxQueue(); // !!! 如果没有把队列里的数据都读取完的话, 必须清空 !!!
// 返回数据头
USART_SendInit();
USART_SendByte(Receive_SlaverAddress); // Slave Address
USART_SendByte(Receive_Function); // Function
USART_SendByte(Receive_NoOfRegisters*2); // No.Of Datas
for(i=0; i<Receive_NoOfRegisters; i++)
{
Flg_CommStatus = Modbus_RegsiterRead(Receive_StartingAddress + i, &Tmp_RegisterData);
USART_SendByte(Tmp_RegisterData/256); // No. of Registers Hi
USART_SendByte(Tmp_RegisterData%256); // No. of Registers Lo
}
USART_SendChech(); // Error Check
}
// 发送 - 写单寄存器操作命令
void Modbus_Echo_Command0x06(void)
{
unsigned char Receive_SlaverAddress; // 接收到的从机地址
unsigned char Receive_Function; // 接收到的功能代码
unsigned int Receive_RegisterAddress; // 接收到的寄存器地址
unsigned int Receive_RegisterValue; // 接收到的寄存器数据
unsigned char Tmp_DataHi;
unsigned char Tmp_DataLo;
// 读取信息
Flg_CommStatus = USART_ReceiveByte(&Receive_SlaverAddress); // 获得从机地址
Flg_CommStatus = USART_ReceiveByte(&Receive_Function); // 功能代码
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
Receive_RegisterAddress = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
Receive_RegisterValue = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
Queue_ClearRxQueue(); // !!! 如果没有把队列里的数据都读取完的话, 必须清空 !!!
//Flg_CommStatus = Modbus_RegsiterWrite(Receive_RegisterAddress, Receive_RegisterValue);
// 返回数据
if (Flg_CommStatus == ERR_OK)
{
// 操作成功
USART_SendInit();
USART_SendByte(Receive_SlaverAddress); // Slave Address
USART_SendByte(Receive_Function); // Function
USART_SendByte(Receive_RegisterAddress/256); // Register Address Hi
USART_SendByte(Receive_RegisterAddress%256); // Register Address Lo
USART_SendByte(Receive_RegisterValue/256); // Register Value Hi
USART_SendByte(Receive_RegisterValue%256); // Register Value Lo
USART_SendChech(); // Error Check
}
else
{
// 操作失败
USART_SendInit();
USART_SendByte(Receive_SlaverAddress); // Slave Address
USART_SendByte(Receive_Function|0x80); // Error Function
USART_SendByte(Flg_CommStatus); // Error No.
USART_SendChech(); // Error Check
}
}
// 发送 - 写多寄存器操作命令
void Modbus_Echo_Command0x10(void)
{
unsigned char Receive_SlaverAddress; // 接收到的从机地址
unsigned char Receive_Function; // 接收到的功能代码
unsigned int Receive_StartingAddress; // 接收到的寄存器起始地址
unsigned int Receive_NoOfRegisters; // 接收到的寄存器数据个数
unsigned char Receive_NoOfDatas; // 有效字节数
unsigned char Tmp_DataHi;
unsigned char Tmp_DataLo;
//unsigned int Tmp_RegisterData;
unsigned char i;
// 读取信息
Flg_CommStatus = USART_ReceiveByte(&Receive_SlaverAddress); // 获得从机地址
Flg_CommStatus = USART_ReceiveByte(&Receive_Function); // 功能代码
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
Receive_StartingAddress = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
Receive_NoOfRegisters = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
Flg_CommStatus = USART_ReceiveByte(&Receive_NoOfDatas);
for(i=0; i<Receive_NoOfRegisters; i++)
{
// 读取受到的数据
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);
Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);
// Tmp_RegisterData = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo; // 有效数据字节数
// 将受到的数据写入寄存器
// Flg_CommStatus = Modbus_RegsiterWrite(Receive_StartingAddress + i, Tmp_RegisterData);
if (Flg_CommStatus != ERR_OK) break;
}
Queue_ClearRxQueue(); // !!! 如果没有把队列里的数据都读取完的话, 必须清空 !!!
// 返回数据
if (Flg_CommStatus == ERR_OK)
{
// 操作成功
USART_SendInit();
USART_SendByte(Receive_SlaverAddress); // Slave Address
USART_SendByte(Receive_Function); // Function
USART_SendByte(Receive_StartingAddress/256); // Starting Address Hi
USART_SendByte(Receive_StartingAddress%256); // Starting Address Lo
USART_SendByte(Receive_NoOfRegisters/256); // No. of Registers Hi
USART_SendByte(Receive_NoOfRegisters%256); // No. of Registers Lo
USART_SendChech(); // Error Check
}
else
{
// 操作失败
USART_SendInit();
USART_SendByte(Receive_SlaverAddress); // Slave Address
USART_SendByte(Receive_Function|0x80); // Error Function
USART_SendByte(Flg_CommStatus); // Error No.
USART_SendChech(); // Error Check
}
}
// 发送 - 错误消息
void Modbus_Send_CommandError(void)
{
}
void Modbus_DelayNms(unsigned int Nms)
{
unsigned int i;
for(; Nms>0; Nms--)
{
for(i=0; i<260; i++) _NOP();
}
}
// 处理函数
_EXTERN void Modbus_Deal(void)
{
unsigned char SlaverAddress;
unsigned char Function;
// 检查处理标志
if (Flg_ReceiveData == FALSE) return;
Flg_ReceiveData = FALSE;
// 检查数据头2个字节
Flg_CommStatus = USART_ReceiveInfo(&SlaverAddress, &Function);
if (Reg_MasterAddress != SlaverAddress) return; // 地址检查
// 帧间延迟, 4个字节间隔
Modbus_DelayNms(88);
// 数据处理
switch(Function)
{
case 0x03: Modbus_Echo_Command0x03(); break;
//case 0x06: Modbus_Echo_Command0x06(); break;
//case 0x10: Modbus_Echo_Command0x10(); break;
default: break;//Modbus_Send_CommandError();// 错误Function
}
}
// Modbus初始化函数
_EXTERN void Modbus_Init(void)
{
// 读取设置, 初始化串口
USART_Init();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -