標題:
STM32 Modbus RTU Master slave源程序sth11驅(qū)動
[打印本頁]
作者:
ben6
時間:
2019-6-9 15:29
標題:
STM32 Modbus RTU Master slave源程序sth11驅(qū)動
STM32 KEIL編寫 Modbus RTU Master slave程序源碼
單片機源程序如下:
#include "stm32f10x.h"
#include "modbus.h"
#include "Init_Config.h"
// Mudbus 功能碼
#define ReadCoilSta 0x01 // 讀位COIL,對應PLC的DO狀態(tài)
#define ReadHoldReg 0x03 // 讀字,對應PLC的AO狀態(tài)
#define ForceSingleCoil 0x05 // 寫位,只寫一位COIL,對應PLC的DO輸出
#define PresetSingleReg 0x06 // 寫字,對單一寄存器賦值,對應PLC的AO輸出
#define SlaveID 0x01 // 從機ID號
unsigned int crc16(unsigned char* puchMsg,unsigned char usDataLen);
unsigned char n=17,c[17]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// 變量聲明
// 保存接收與發(fā)送消息的數(shù)組
unsigned char aRxBuff[8]; // 接收緩沖區(qū)
unsigned char aTxBuff[17]; // 發(fā)送緩沖區(qū)
volatile unsigned char nTxBuff = 0; // 發(fā)送計數(shù)
unsigned char CommIndex=0; // 數(shù)據(jù)位置索引,從0開始,到CommIndexEnd結(jié)束
unsigned char CommIndexEnd=7; // 接收長度
unsigned char RecFinishF=0; // 是否接收完成標志
unsigned long RecTimer=0; // 通信間隔時間
unsigned char FreOneH=0x00; //變頻器一高位
unsigned char FreOneL=0x00;
unsigned char FreTwoH=0x00; //變頻器二高位
unsigned char FreTwoL=0x00;
unsigned char Run=0x00; //啟動
unsigned char Stop=0x00; //停止
unsigned char FrePOne=0x00; //點動變頻器一
unsigned char FrePTwo=0x00; //點動變頻器二
unsigned char FrePROne=0x00; //點加變頻器一
unsigned char FrePDOne=0x00; //減
unsigned char FrePRTwo=0x00; //點加變頻器二
unsigned char FrePDTwo=0x00; //減
unsigned char FreR=0x00; //變頻器統(tǒng)調(diào)加
unsigned char FreD=0x00; //減
/* Table Of CRC Values for high-order unsigned char */
unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
};
/* Table of CRC values for low-order unsigned char */
unsigned char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};
/*###############################################NO
purpose: 計算CRC16的值
function name: crc16
return data: unsigned int
parameters: par1:
name: puchMsg
type: unsigned char*
meaning: 將要計算CRC16值的
所有數(shù)據(jù)
par2:
name: usDataLen
type: unsigned char
meaning: 將要計算CRC16值的
數(shù)據(jù)個數(shù)
finished time: 2007/5/16
amended time:
NO###############################################*/
unsigned int crc16(unsigned char* puchMsg,unsigned char usDataLen)
{
unsigned char uchCRCHi = 0xFF ;
unsigned char uchCRCLo = 0xFF ;
unsigned int uIndex ;
while (usDataLen--)
{
uIndex = uchCRCHi ^ *puchMsg++;
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (((unsigned int)(uchCRCHi) << 8) | uchCRCLo) ;
}
void InitVar_my(void)
{
RecFinishF=0;
CommIndex=0;
CommIndexEnd=7; // First enlarge recieve lenght
RecTimer=0;
}
void ParseRecieve(void) //包解析
{
unsigned int uIndex ;
unsigned int crc16tem;
unsigned char i = 0;
sendnum=1;
if (aRxBuff[0] == SlaveID) // 從機ID是否正確
{
crc16tem=((unsigned int)(aRxBuff[CommIndexEnd-1]) << 8) | aRxBuff[CommIndexEnd]; // calculate CRC check, erase two CRC byte
uIndex=crc16(aRxBuff,CommIndexEnd-1);
if (crc16tem==uIndex)// crc16檢校正確
{
switch (aRxBuff[1]) // 判斷功能碼
{
case ReadCoilSta: // 0x01
aTxBuff[0]=SlaveID;
aTxBuff[1]=ReadCoilSta;
aTxBuff[2]=0x01; //字節(jié)數(shù)
nTxBuff=4;
switch (aRxBuff[3]) //判斷起始地址
{
/* case 0x32: //畫面0
aTxBuff[3]=Run|Stop|PPback|PPfo|FrePOne|FrePTwo;
break;
case 0x3c: //畫面1
aTxBuff[3]=TemR|TemD|SignSwD|SignSwS;
break;*/
case 0x46: //變頻器設定
aTxBuff[3]=FrePROne|FrePDOne|FrePRTwo|FrePDTwo|FreR|FreD;
break;
}
crc16tem=crc16(aTxBuff,nTxBuff);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
/* for(i = 0; i < nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
} */
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
// sendnum=1;
break;
case ReadHoldReg: // 0x03 讀取寄存器值
aTxBuff[0]=SlaveID;
aTxBuff[1]=ReadHoldReg;
aTxBuff[2]=aRxBuff[5]*2; //每個數(shù)據(jù)占16位 要讀的寄存器數(shù)量*2 相應的第3個字節(jié)
nTxBuff=3;
/* if(aRxBuff[3]==0x0a)
{
aTxBuff[nTxBuff++]=IntendDisH;
aTxBuff[nTxBuff++]=IntendDisL; //設定袋長
aTxBuff[nTxBuff++]=IntendNumH;
aTxBuff[nTxBuff++]=IntendNumL; //整本數(shù)設定
aTxBuff[nTxBuff++]=FailNumH;
aTxBuff[nTxBuff++]=FailNumL; //脫標次數(shù)
aTxBuff[nTxBuff++]=AutoRunH;
aTxBuff[nTxBuff++]=AutoRunL; //自啟動時間
aTxBuff[nTxBuff++]=IntendSignH;
aTxBuff[nTxBuff++]=IntendSignL; //追標長度
aTxBuff[nTxBuff++]=TemH;
aTxBuff[nTxBuff++]=TemL; //切刀加溫
crc16tem=crc16(aTxBuff,nTxBuff);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
for(i = 0; i < nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
}
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
sendnum=1;
}
if(aRxBuff[3]==0x00)
{
aTxBuff[nTxBuff++]=RecNumH;
aTxBuff[nTxBuff++]=RecNumL; //計數(shù)
aTxBuff[nTxBuff++]=GroupH;
aTxBuff[nTxBuff++]=GroupL; //批次
aTxBuff[nTxBuff++]=IntendVelH;
aTxBuff[nTxBuff++]=IntendVelL; //速度
aTxBuff[nTxBuff++]=FreOneH;
aTxBuff[nTxBuff++]=FreOneL; //變頻器一速度
aTxBuff[nTxBuff++]=TemH;
aTxBuff[nTxBuff++]=TemL; //切刀加熱
aTxBuff[nTxBuff++]=FreTwoH;
aTxBuff[nTxBuff++]=FreTwoL; //變頻器二速度
crc16tem=crc16(aTxBuff,nTxBuff);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
for(i = 0; i < nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
}
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
sendnum=1;
}
*/
if(aRxBuff[3]==0x01)
{
aTxBuff[nTxBuff++]=0x01;
aTxBuff[nTxBuff++]=0x02; //溫度高低
aTxBuff[nTxBuff++]=0x03;
aTxBuff[nTxBuff++]=0x04; //濕度高低
crc16tem=crc16(aTxBuff,nTxBuff); //crc校驗函數(shù)
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff); //生成校驗碼 高位加低位
/* for(i = 0; i < nTxBuff+1; i++) //將相應數(shù)據(jù)發(fā)送出去
{
c[i]=aTxBuff[i];
} */
for(i=0;i<9;i++)
{
USART_SendData(USART1,aTxBuff[i]);
while (!(USART1->SR & USART_FLAG_TXE));
}
// USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
/* USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_Cmd(USART1, ENABLE);
USART_SendData(USART1,aTxBuff[0]); */
// sendnum=1;
}
if(aRxBuff[3]==0x14)
{
aTxBuff[nTxBuff++]=FreOneH;
aTxBuff[nTxBuff++]=FreOneL; //變頻器一
aTxBuff[nTxBuff++]=FreTwoH;
aTxBuff[nTxBuff++]=FreTwoL; //變頻器二
crc16tem=crc16(aTxBuff,nTxBuff);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
for(i = 0; i < nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
}
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
// sendnum=1;
}
/* if(aRxBuff[3]==0x1e)
{
aTxBuff[nTxBuff++]=IntendVelH;
aTxBuff[nTxBuff++]=IntendVelL; //送料速度
aTxBuff[nTxBuff++]=PluseNOH;
aTxBuff[nTxBuff++]=PluseNOL; //步進脈沖數(shù)
aTxBuff[nTxBuff++]=LineH;
aTxBuff[nTxBuff++]=LineL; //曲線選擇
aTxBuff[nTxBuff++]=CheckH;
aTxBuff[nTxBuff++]=CheckL; //修輪
crc16tem=crc16(aTxBuff,11);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
for(i =0; i <nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
}
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
sendnum=1;
} */
break;
case ForceSingleCoil: // 0x05
aTxBuff[0]=SlaveID;
aTxBuff[1]=ForceSingleCoil;
aTxBuff[2]=aRxBuff[2];
aTxBuff[3]=aRxBuff[3];
nTxBuff=6;
switch (aRxBuff[3]) //判斷地址碼
{
/*case 0x32: //啟動
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
Run=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
Run=0x01;
Stop=0x00;
}
break;
case 0x33: //停止
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
Stop=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
Stop=0x02;
Run=0x00;
}
break;
case 0x34: //點退
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
PPback=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
if(Stop==0x02)
{
PPback=0x04;
//此處加退料
}
if(Run==0x01)
{
PPback=0x04;
RecNumL-=0x01;
}
}
break;
case 0x35: //點進
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
PPfo=0x00;
}
else if(aRxBuff[4]==0xFF&&Stop==0x02)
{
aTxBuff[4]=0xFF;
PPfo=0x08;
//此處加送料
}
break; */
case 0x36: //點動變頻器1
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FrePOne=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FrePOne=0x10;
}
break;
case 0x37: //點動變頻器2
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FrePTwo=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FrePTwo=0x20;
}
break;
/* case 0x3c: //切刀加溫
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
TemR=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
TemR=0x01;
if(TemL<0xDC)
TemL+=0x01;
else TemL+=0x00;
}
break;
case 0x3d: //切刀降溫
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
TemD=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
TemD=0x02;
if(TemL>0)
TemL-=0x01;
else TemL-=0;
}
break;
case 0x3e: //追標深
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
SignSwD=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
SignSwD=0x04;
SignSwS=0x00;
}
break;
case 0x3f: //追標淺
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
SignSwS=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
SignSwS=0x08;
SignSwD=0x00;
}
break;*/
case 0x46: //變頻器一加
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FrePROne=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FrePROne=0x01;
FreOneL+=0x01;
}
break;
case 0x47: //變頻器一減
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FrePDOne=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FrePDOne=0x02;
FreOneL-=0x01;
}
break;
case 0x48: //變頻器二加
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FrePRTwo=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FrePRTwo=0x04;
FreTwoL+=0x01;
}
break;
case 0x49: //變頻器二減
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FrePDTwo=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FrePDTwo=0x08;
FreTwoL-=0x01;
}
break;
case 0x4A: //統(tǒng)調(diào)加
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FreR=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FreR=0x10;
FreOneL+=0x01;
FreTwoL+=0x10;
}
break;
case 0x4b: //統(tǒng)調(diào)減
if(aRxBuff[4] == 0x00)
{
aTxBuff[4]=0x00;
FreD=0x00;
}
else if(aRxBuff[4]==0xFF)
{
aTxBuff[4]=0xFF;
FreD=0x20;
FreOneL-=0x01;
FreTwoL-=0x10;
}
break;
}
aTxBuff[5]=0x00;
crc16tem=crc16(aTxBuff,nTxBuff);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
for(i = 0; i < nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
}
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
sendnum=1;
break;
case PresetSingleReg: // 0x06
for(i=0;i<6;i++)
{aTxBuff[i]=aRxBuff[i];}
nTxBuff=6;
switch (aRxBuff[3]) //判斷地址碼
{
case 0x14: //變頻器一速度
FreOneH=aRxBuff[4];
FreOneL=aRxBuff[5];
break;
case 0x15: //變頻器二速度
FreTwoH=aRxBuff[4];
FreTwoL=aRxBuff[5];
break;
/* case 0x0f: //切刀加溫
TemH=aRxBuff[4];
TemL=aRxBuff[5];
break;
case 0x0b: //整本數(shù)設定
IntendNumH=aRxBuff[4];
IntendNumL=aRxBuff[5];
break;
case 0x0a: //設定袋長
IntendDisH=aRxBuff[4];
IntendDisL=aRxBuff[5];
break;
case 0x1e: //速度
IntendVelH=aRxBuff[4];
IntendVelL=aRxBuff[5];
break;
case 0x0e: //追標長度
IntendSignH=aRxBuff[4];
IntendSignL=aRxBuff[5];
break;
case 0x0c: //脫標次數(shù)
FailNumH=aRxBuff[4];
FailNumL=aRxBuff[5];
break;
case 0x0d: //自動起機
AutoRunH=aRxBuff[4];
AutoRunL=aRxBuff[5];
break;
case 0x1f: //步進脈沖數(shù)
PluseNOH=aRxBuff[4];
PluseNOL=aRxBuff[5];
break;
case 0x20: //曲線選擇
LineH=aRxBuff[4];
LineL=aRxBuff[5];
break;
case 0x21: //修輪
CheckH=aRxBuff[4];
CheckL=aRxBuff[5];
break; */
}
crc16tem=crc16(aTxBuff,nTxBuff);
aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
for(i = 0; i < nTxBuff+1; i++)
{
c[i]=aTxBuff[i];
}
// USART1_Putc(c,n);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1, aTxBuff[0]);
// sendnum=1;
break;
}
}
}
}
復制代碼
/******************** (C) COPYRIGHT 2012 WildFire Team **************************
* 文件名 :main.c
* 描述 :實現(xiàn)sht10傳感器的modbus與上位機的通訊。
* 實驗平臺:奮斗mini開發(fā)板
* 庫版本 :ST3.5.0
**********************************************************************************/
#include "stm32f10x.h"
#include "Init_Config.h"
#include "modbus.h"
#include "myiic.h"
#include "MeasuerTEMP.h"
#include "Systick.h"
/*
* 函數(shù)名:main
* 描述 : 主函數(shù)
* 輸入 :無
* 輸出 : 無
*/
int main(void)
{
RCC_Configuration();
Init_Config();
SHT10_Config();
SysTick_Init();
while (1)
{
if(Uart0_rev_comflag==0x01)
{
Uart0_rev_comflag=0x00;
ParseRecieve();
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
}
}
/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
復制代碼
所有資料51hei提供下載:
STM32_MODBUS1.7z
(186.31 KB, 下載次數(shù): 139)
2019-6-10 03:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
Longan.Wang
時間:
2022-3-25 10:51
謝謝!可以參考一下!
作者:
雪玉寐影
時間:
2022-5-4 03:59
這個應該是slave從機,不是master吧
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1