標(biāo)題:
stm8 stm8s stm8af 485接口 modbus協(xié)議代碼(已實(shí)現(xiàn))
[打印本頁(yè)]
作者:
tyx623521553
時(shí)間:
2019-9-29 10:58
標(biāo)題:
stm8 stm8s stm8af 485接口 modbus協(xié)議代碼(已實(shí)現(xiàn))
本人使用stm8af62a6,stm8s和stm8af大多數(shù)是互通的,只用一個(gè)庫(kù)函數(shù)
62a6只能使用uart3!
485接口是硬件,不需要管,任何硬件接線都可以實(shí)現(xiàn)
代碼見(jiàn)附件,已實(shí)現(xiàn)通信
主函數(shù)代碼,主要為初始化函數(shù),以及modbus幀接收處理函數(shù),幀接收處理按自己的需求自行修改,本例的處理函數(shù)為接收數(shù)據(jù)再多輸出一點(diǎn)數(shù)據(jù)
單片機(jī)源程序如下:
/******************************************************************
mian.c文件部分
******************************************************************/
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
UART3_DeInit();
UART3_Init((u32)9600, UART3_WORDLENGTH_8D, UART3_STOPBITS_1, UART3_PARITY_NO, UART3_MODE_TXRX_ENABLE);
UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);
TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 0);
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
TIM1_Cmd(ENABLE);
ITC_SetSoftwarePriority(ITC_IRQ_UART3_RX, ITC_PRIORITYLEVEL_3);
ITC_SetSoftwarePriority(ITC_IRQ_TIM1_OVF, ITC_PRIORITYLEVEL_1);
enableInterrupts();
while (1)
{
UartDriver();
}
}
/******************************************************************
modbus.c文件
******************************************************************/
#include "stm8s.h"
extern void Delay(uint16_t nCount); //延遲1us
unsigned char cntRxd = 0; //接受計(jì)數(shù)器
unsigned char bufRxd[64]; //接受寄存器
unsigned char flagFrame = 0;
void UartWriteBuf(unsigned char * buf ,unsigned char len) //串口輸出buf
{
GPIO_WriteHigh(GPIOD, GPIO_PIN_3);
while(len--)
{
while(( UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET));
UART3_SendData8(*buf++);
while(( UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET));
}
Delay(0xFFFF);
GPIO_WriteLow(GPIOD, GPIO_PIN_3);
}
void UartAction(unsigned char * buf ,unsigned char len) //幀處理函數(shù)
{
buf[len++] = '\r';
buf[len++] = '\n';
UartWriteBuf(buf ,len);
}
unsigned char UartReadBuf(unsigned char * buf ,unsigned char len) //串口buf讀取
{
unsigned char i;
if(len > cntRxd)
{
len = cntRxd;
}
for(i = 0; i < len; i++)
{
*buf++ = bufRxd[i];
}
cntRxd = 0;
return len;
}
void UartReadMonitor(unsigned char ms) //接收結(jié)束幀判斷
{
static unsigned char cntbkp = 0;
static unsigned char idletmr = 0;
if(cntRxd > 0)
{
if(cntbkp != cntRxd)
{
cntbkp = cntRxd;
idletmr = 0;
}
else
{
if(idletmr < 30)
{
idletmr += ms;
if(idletmr >= 30)
{
flagFrame = 1;
}
}
}
}
else
{
cntbkp = 0;
}
}
void UartDriver(void) //接收buf[len-2],處理判斷幀結(jié)構(gòu)
{
unsigned char len;
unsigned char buf[40];
if(flagFrame)
{
flagFrame = 0;
len = UartReadBuf(buf ,sizeof(buf)-2);
UartAction(buf ,len);
}
}
/******************************************************************
it.c文件部分(中斷函數(shù))
******************************************************************/
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
UartReadMonitor(1);
}
INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21)
{
UART3_ClearITPendingBit(UART3_IT_RXNE);
if(cntRxd < sizeof(bufRxd))
{
bufRxd[cntRxd++] = UART3_ReceiveData8();
}
}
復(fù)制代碼
全部資料51hei下載地址:
Demo.7z
(3.94 MB, 下載次數(shù): 128)
2019-9-29 16:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
yffpn
時(shí)間:
2021-9-19 17:14
一直再尋找,非常感謝
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1