|
本人使用stm8af62a6,stm8s和stm8af大多數(shù)是互通的,只用一個(gè)庫函數(shù)
62a6只能使用uart3!
485接口是硬件,不需要管,任何硬件接線都可以實(shí)現(xià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
|
評(píng)分
-
查看全部評(píng)分
|