來源:csdn博客 蕭年已逝;在此特別鳴謝!
freemodbus教程之freemodbus移植應用串口中斷接收和數(shù)據(jù)解析
本篇主要講解從機數(shù)據(jù)的接收流程。接收流程分為兩個階段:串口中斷接收和數(shù)據(jù)解析。
第二階段:數(shù)據(jù)解析eMBPoll( )。
一、串口中斷接收
從機正常狀態(tài)下,串口設(shè)置為接收中斷模式,也不啟動定時器。當檢測到有數(shù)據(jù)時,中斷函數(shù)調(diào)用xMBRTUReceiveFSM()函數(shù),通過該函數(shù)中的ucRTUBuf數(shù)組存儲接收幀,用usRcvBufferPos存儲數(shù)據(jù)幀長度。具體函數(shù):
1、中斷接收函數(shù)。
void UART1_IRQ(void)
{
IF(USART_GetITStatus(USART1,USART_IT_TXE))
{
pxMBFrameCBTransmitterEmpty( );
}
else if(USART_GetITStatus(USART1,USART_IT_RXNE))//接收中斷
{
pxMBFrameCBByteReceived( );//pxMBFrameCBByteReceived = xMBRTUReceiveFSM;
}
}
2、xMBRTUReceiveFSM()函數(shù)。RTU接收狀態(tài)函數(shù)。只要進人該函數(shù),就會啟動定時器中斷。
從機的接收狀態(tài):
?。ǎ保㏒TATE_RX_INIT(協(xié)議棧初始化);
(2)STATE_RX_ERROR(接收錯誤);
(3)STATE_RX_IDLE(接收空閑,接收幀頭,常用);
(4)STATE_RX_RCV(接收所有數(shù)據(jù),常用)。
注意:接收數(shù)據(jù)時,只要接收到數(shù)據(jù),定時器就會清零,重新計數(shù)。
BOOL
xMBRTUReceiveFSM( void )
{
BOOL xTaskNeedSwitch = FALSE;
UCHAR ucByte;
assert( eSndState == STATE_TX_IDLE );
( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte );
switch ( eRcvState )
{
/* If we have received a character in the init state we have to
*/
case STATE_RX_INIT:
vMBPortTimersEnable( );
break;
/* In the error state we wait until all characters in the
* damaged frame are transmitted.
*/
case STATE_RX_ERROR:
vMBPortTimersEnable( );
break;
/* In the idle state we wait for a new character. If a character
* is received the t1.5 and t3.5 timers are started and the
* receiver is in the state STATE_RX_RECEIVCE.
*/
case STATE_RX_IDLE:
usRcvBufferPos = 0;
ucRTUBuf[usRcvBufferPos++] = ucByte;
eRcvState = STATE_RX_RCV;
/* Enable t3.5 timers. */
vMBPortTimersEnable( );
break;
/* We are currently receiving a frame. Reset the timer after
* every character received. If more than the maximum possible
* number of bytes in a modbus frame is received the frame is
* ignored.
*/
case STATE_RX_RCV:
if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX )
{
ucRTUBuf[usRcvBufferPos++] = ucByte;
}
else
{
eRcvState = STATE_RX_ERROR;
}
vMBPortTimersEnable( );
break;
}
return xTaskNeedSwitch;
}
二、數(shù)據(jù)解析
涉及到的函數(shù) eMBPoll、eMBRTUReceive和xFuncHandlers[i]是結(jié)構(gòu)體數(shù)組。
1、eMBPoll函數(shù)。eMBPoll函數(shù)調(diào)用eMBRTUReceive和xFuncHandlers[i]結(jié)構(gòu)體數(shù)組。
eMBErrorCode
eMBPoll( void )
{
static UCHAR *ucMBFrame;
static UCHAR ucRcvAddress;
static UCHAR ucFunctionCode;
static USHORT usLength;
static eMBException eException;
int i;
eMBErrorCode eStatus = MB_ENOERR;
eMBEventType eEvent;
/* Check if the protocol stack is ready. */
if( eMBState != STATE_ENABLED )
{
return MB_EILLSTATE;
}
/* Check if there is a event available. If not return control to caller.
* Otherwise we will handle the event. */
if( xMBPortEventGet( &eEvent ) == TRUE )
{
switch ( eEvent )
{
case EV_READY:
break;
case EV_FRAME_RECEIVED:
eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );
if( eStatus == MB_ENOERR )
{
/* Check if the frame is for us. If not ignore the frame. */
if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) )
{
( void )xMBPortEventPost( EV_EXECUTE );
}
}
break;
case EV_EXECUTE:
ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF];//把接收的數(shù)據(jù)傳遞給ucFunctionCode
eException = MB_EX_ILLEGAL_FUNCTION;
for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ )
{
/* No more function handlers registered. Abort. */
if( xFuncHandlers[i].ucFunctionCode == 0 )
{
break;
}
else if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode )//查詢匹配的功能碼,
{
eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength );//調(diào)用相應的功能函數(shù)
break;
}
}
/* If the request was not sent to the broadcast address we
* return a reply. */
if( ucRcvAddress != MB_ADDRESS_BROADCAST )
{
if( eException != MB_EX_NONE )//如果接收有問題
{
/* An exception occured. Build an error frame. */
usLength = 0;
ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR );//功能碼與0x80或之后的為 //異常碼
ucMBFrame[usLength++] = eException;//非法功能代碼
}
if( ( eMBCurrentMode == MB_ASCII ) && MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS )
{
vMBPortTimersDelay( MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS );
}
eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength );//發(fā)送數(shù)據(jù)
}
break;
case EV_FRAME_SENT:
break;
}
}
return MB_ENOERR;
}
2、peMBFrameReceiveCur() //數(shù)據(jù)幀接收函數(shù)指針
3、主要講一下xFuncHandlers[i],它是結(jié)構(gòu)體數(shù)組,存放的是功能碼以及對應的報文解析函數(shù)。
typedef struct { UCHAR ucFunctionCode; pxMBFunctionHandler pxHandler; } xMBFunctionHandler;
static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = {
#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0
{MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID},
#endif
#if MB_FUNC_READ_INPUT_ENABLED > 0
{MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister},
#endif
#if MB_FUNC_READ_HOLDING_ENABLED > 0
{MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister},
#endif
#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0
{MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister},
#endif
#if MB_FUNC_WRITE_HOLDING_ENABLED > 0
{MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister},
#endif
#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0
{MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister},
#endif
#if MB_FUNC_READ_COILS_ENABLED > 0
{MB_FUNC_READ_COILS, eMBFuncReadCoils},
#endif
#if MB_FUNC_WRITE_COIL_ENABLED > 0
{MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil},
#endif
#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0
{MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils},
#endif
#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0
{MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs},
#endif
};
以功能碼04為例,讀取輸入寄存器。
eMBException
eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen )
{
USHORT usRegAddress;
USHORT usRegCount;
UCHAR *pucFrameCur;
eMBException eStatus = MB_EX_NONE;
eMBErrorCode eRegStatus;
if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) )//計算幀長度,除了地址位和兩位的crc校驗位
{
usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 );//讀取寄存器的首地址
usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] );
usRegAddress++;
usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 );//計算讀取寄存器的長度
usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );
/* Check if the number of registers to read is valid. If not
* return Modbus illegal data value exception.
*/
if( ( usRegCount >= 1 )
&& ( usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX ) )//讀取寄存器的長度不越界
{
/* Set the current PDU data pointer to the beginning. */
pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF];//把數(shù)據(jù)幀賦值給pucFrameCur
*usLen = MB_PDU_FUNC_OFF;
/* First byte contains the function code. */
*pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER;//
*usLen += 1;
/* Second byte in the response contain the number of bytes. */
*pucFrameCur++ = ( UCHAR )( usRegCount * 2 );
*usLen += 1;
eRegStatus =
eMBRegInputCB( pucFrameCur, usRegAddress, usRegCount );
/* If an error occured convert it into a Modbus exception. */
if( eRegStatus != MB_ENOERR )
{
eStatus = prveMBError2Exception( eRegStatus );
}
else
{
*usLen += usRegCount * 2;
}
}
else
{
eStatus = MB_EX_ILLEGAL_DATA_VALUE;
}
}
else
{
/* Can't be a valid read input register request because the length
* is incorrect. */
eStatus = MB_EX_ILLEGAL_DATA_VALUE;
}
return eStatus;
}
eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
eMBErrorCode eStatus = MB_ENOERR;
int iRegIndex;
if( ( usAddress >= REG_INPUT_START )
&& ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
{
iRegIndex = ( int )( usAddress - REG_INPUT_START );
while( usNRegs > 0 )
{
*pucRegBuffer++ =
( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
*pucRegBuffer++ =
( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
iRegIndex++;
usNRegs--;
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
以上就是整個接收數(shù)據(jù)、解析數(shù)據(jù)的過程。
來源:csdn博客 蕭年已逝;在此特別鳴謝!
來源:csdn博客 蕭年已逝;在此特別鳴謝!
- 數(shù)據(jù)(87426)
- 定時器(111866)
- 串口(74285)
- 函數(shù)(61196)
- FreeModbus(4352)
相關(guān)推薦
開發(fā)一款支持主機模式的FreeModbus協(xié)議棧
FreeModbus 是一款開源的 Modbus 協(xié)議棧,但是只有從機開源,主機源碼是需要收費的。同時網(wǎng)上也沒有發(fā)現(xiàn)比較好的開源的 Modbus 主機協(xié)議棧,所以才開發(fā)這款支持主機模式的 FreeModbus 協(xié)議棧。
2022-07-27 16:18:442511
FreeRTOS串口中斷接收不定長的數(shù)據(jù)與二值信號量的使用
FreeRTOS例程,使用串口中斷接收不定長的數(shù)據(jù),以及二值信號量的使用
2022-09-26 09:02:263450
CW32L083串口中斷+定時器實現(xiàn)不定長數(shù)據(jù)接收
CW32L083 用串口中斷加定時器中斷實現(xiàn)串口的不定長數(shù)據(jù)的接收,特別適用于AT指令的接收。
2023-07-12 09:00:171011
FreeMODBUS庫移植到STM32單片機的基本流程分享
目錄特別說明FreeMODBUS簡介移植FreeMODBUS的幾個關(guān)鍵問題官方源碼移植流程特別說明由于本文是筆者關(guān)于modbus長期開發(fā)經(jīng)驗的總結(jié),因此分了幾個階段完成,中間可能摻雜了英文。由于時間
2022-02-22 08:23:44
FreeMODBUS是什么
通信協(xié)議棧包括兩層:定義了數(shù)據(jù)結(jié)構(gòu)和功能Modbus應用協(xié)議和網(wǎng)絡(luò)層。在FreeMODBUS的當前版本中,提供了Modbus Application Protocol v1.1a 的實現(xiàn)并且支持在Mo...
2022-01-26 08:22:57
FreeMODBUS簡介
1.簡介FreeMODBUS一個奧地利人寫的Modbus協(xié)議。它是一個針對嵌入式應用的一個免費(自由)的通用MODBUS協(xié)議的移植。Modbus是一個工業(yè)制造環(huán)境中應用的一個通用協(xié)議。Modbus
2021-08-05 07:49:30
FreeModbus移植的相關(guān)資料下載
FreeModbus移植參考鏈接原文參看原培棟Modbus總結(jié)一、新建工程#include #include #include #define DBG_TAG "main"
2022-01-11 07:09:54
FreeModbus從站的設(shè)計與測試
關(guān)鍵詞:Modbus FreeModbus STM32F103C8T6 CubeMX1.開發(fā)環(huán)境(1)STM32CubeMX,版本:4.27.0,截止寫稿時,最新版本已到6,但孔丙火(微信公眾號:孔
2022-02-16 06:59:58
FreeModbus是如何去實現(xiàn)Modbus協(xié)議全部功能的
Modbus是什么?FreeModbus是如何去實現(xiàn)Modbus協(xié)議全部功能的?
2021-12-10 07:34:08
FreeModbus采用中斷的方式接受和發(fā)送串口數(shù)據(jù)
比較簡單,不再贅述。注意要啟用串口中斷,FreeModbus采用中斷的方式接受和發(fā)送串口數(shù)據(jù)。2.定時器參數(shù)設(shè)置采用TIM2來作為FreeModbus的定時器,孔丙火(微信公眾號:孔丙火)這里主要實現(xiàn)工業(yè)控制中常用的Modbus-RTU功能,RTU協(xié)議中是靠時間間隔來判斷一個數(shù)據(jù)幀是否結(jié)束的,所以
2022-02-16 07:01:29
串口中斷接收問題
大家?guī)臀铱纯催@個串口中斷函數(shù)有沒有問題?。楷F(xiàn)在的問題是用串口調(diào)試助手可以接收單片機在main函數(shù)里發(fā)送的數(shù)據(jù),但是在中斷里無法接收數(shù)據(jù),在中斷里接收上位機的數(shù)據(jù)再發(fā)送到上位機結(jié)果都是00!就是說無法
2019-07-04 04:35:16
HAL庫的串口中斷接收
[STM32系列]一、HAL庫的串口中斷接收1、前言2、回調(diào)函數(shù)3、HAL庫中斷接收函數(shù)使用1、前言HAL即硬件抽象層(英語:Hardware Abstraction Layer),實現(xiàn)了不同硬件
2021-08-16 08:13:51
RT-Thread freemodbus協(xié)議的移植實現(xiàn)
前言繼續(xù)熟悉RT-Thread freemodbus的應用,熟悉modbus協(xié)議。平臺:Pandora STM32L475,Keil MDK5,RT-Thread 4.0.3有前幾次的移植,本次驗證
2022-04-29 14:40:29
STM32移植FreeModbus RTU教程
STM32移植FreeModbus RTU教程3(FreeModbus移植后的實際驗證)下載工程到開發(fā)板并通過USB轉(zhuǎn)485通訊線連接PC通過modbus調(diào)試助手進行通訊驗證03H 04H 06H
2021-08-03 06:21:45
STM32移植Freemodbus RTU的過程
STM32 裸機 標準庫 移植 Freemodbus RTU1、官網(wǎng)下載,解壓得到文件夾如下-rw-r--r-- 1 EDZ 1971211436 十二月82006
2022-02-21 07:01:39
STM32移植freemodbus后測試時設(shè)置奇偶校驗時無法與上位機通訊怎么解決?
STM32移植freemodbus后測試時設(shè)置奇偶校驗時無法與上位機通訊怎么解決?
2021-12-03 06:55:31
STM32F429 HAL庫是如何移植FreeModbus_RTU的
STM32F429 HAL庫移FreeModbus_RTU詳細步驟開發(fā)環(huán)境說明完整工程文件下載地址移植前提修改"RS485.c"文件修改"
2021-08-17 07:16:03
STM32使用CubeMAX配置的串口中斷接收方法是什么
STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發(fā)生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在main中第一次調(diào)用接收中斷函數(shù)(這個也是比較關(guān)鍵的)(3)重寫
2021-08-13 09:06:48
libmodbus與freemodbus相比有何不同
背景modbus有主機、從機之分libmodbus與freemodbus相比,是主從機一體的,freemodbus,官方的為從機。libmodbus感覺更適合rt-thread,因為,有了內(nèi)存的管理
2022-02-22 07:00:31
【HAL庫每天一例】第117例:freemodbus移植
*/SystemClock_Config();/* 初始化串口并配置串口中斷優(yōu)先級 */MX_DEBUG_USART_Init();printf("freemodbus 移植測試\n"
2016-09-09 10:07:51
【分享】STM32移植FreeModbus 經(jīng)驗
的MODBUS 協(xié)議整理..zip二freeemodbus中如何通過串口發(fā)送和接收數(shù)據(jù)freemodbus通過串口中斷的方式接收和發(fā)送數(shù)據(jù)。采用這種做法我想可以節(jié)省程序等待的時間,并且也短充分
2014-07-30 14:13:22
兩個串口的freemodbus組件是無法配置的對嗎
1.兩個串口的freemodbus組件是無法配置的對吧2.libmodbus問題求助libmodbus 用Modbus Slave測試 發(fā)送指令會斷開但是用串口調(diào)試工具是好的
2022-08-19 11:31:46
為什么需要修改串口中斷的回調(diào)函數(shù)
用兩張圖把FreeModbus在單片機串口上數(shù)據(jù)收發(fā)流程進行了梳理,脈絡(luò)更加清晰。有了這樣一個思路,可以更好地理解,移植FreeModbus的時候,為什么需要修改portserial.c
2022-02-16 07:26:54
介紹Modbus協(xié)議在STM32平臺上的移植
文章目錄1freemodbus移植1.1 freemodbus介紹1.2 freemodbus移植1.2.1 串口的移植1.2.2 定時器的移植1freemodbus移植??本文介紹Modbus協(xié)議
2022-01-14 06:57:23
關(guān)于STM32移值FreeModbus的心得
關(guān)于STM32移值FreeModbus的心得關(guān)于FreeModbus踩過的坑提供移值源碼僅供參考,不足之處請指正關(guān)于FreeModbusFreeMODBUS是一個奧地利人寫的Modbus-slave
2021-08-19 09:05:28
在freemodbus中配置uart5來實現(xiàn)RTU-slave功能,無法接收到數(shù)據(jù)是為什么?
rt_err_t uart_input(rt_device_t dev, rt_size_t size){ /* 串口接收到數(shù)據(jù)后產(chǎn)生中斷,調(diào)用此回調(diào)函數(shù),然后發(fā)送接收
2022-03-23 13:53:36
基于STM32HAL庫移植FreeModbus怎么實現(xiàn)?
如何利用STM32CubeMX新建工程?基于STM32HAL庫移植FreeModbus怎么實現(xiàn)?
2021-12-10 06:01:40
外部中斷和串口中斷問題
目標 :今天試著編寫了 兩個外部中斷 分別往串口發(fā)a和b一個串口接收中斷 接到什么數(shù)據(jù)就發(fā)什么數(shù)據(jù)問題:程序燒寫后 復位運行后 分別輪流觸發(fā) EINT0 EINT2 能夠發(fā)出相應的數(shù)據(jù) 正常串口接收
2019-04-28 09:59:17
如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機
本應用筆記介紹了如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機方法。本文檔提供的源代碼演示了使用Modbus的應用程序。單片機作為Modbus從機,可通過RS485或RS232與上位機相連,與Modbus Poll調(diào)試工具(Modbus主機)進行通訊。
2023-10-26 06:18:33
如何將FreeModbus移植到STM32F103上去
1.創(chuàng)建工程2.將FreeModbus源碼,拷貝到工程目錄3.將FreeModbus文件添加進工程添加好之后,編譯出現(xiàn)錯誤4.移植底層接口先看第一個錯誤,缺少port.h借鑒AVR架構(gòu)的程序,將demo里面AVR中的port文件夾,拷貝到工程中進入port文件夾,刪除重復文件,mbcrc.c...
2021-08-23 06:13:28
如何將freemodbus移植到stm32平臺
modbus是一個非常好的串口協(xié)議(當然也能用在網(wǎng)口上),它簡潔、規(guī)范、強大??梢詽M足大部分的工業(yè)、嵌入式需求。這里詳細說下如何將freemodbus移植到stm32平臺。我之前下載的版本是1.6
2021-08-16 06:59:43
嘗試一下在freemodbus里使用serialX
使用 serialX ,實現(xiàn)了中斷接收中斷發(fā)送模式打開串口設(shè)備,這次嘗試讓筆者堅信了即便使用 DMA 收發(fā)也能在 finsh 里應付自如。今天我們嘗試一下在 freemodbus 里使用 serialX 。注
2023-02-13 15:09:29
怎么縮短freemodbus組件作為從機的響應時間呢?
freemodbus組件設(shè)置為從機,波特率115200,接收用串口中斷方式,響應時間約500ms,主機發(fā)送命令間隔需在500ms以上通信才正常。請問想縮短這個時間,應該關(guān)注源代碼哪些部分?響應時間想控制在10ms內(nèi)。
2023-04-14 10:28:56
怎樣去獲取FreeMODBUS協(xié)議呢
FreeMODBUS是什么呢?FreeMODBUS協(xié)議有何功能呢?怎樣去獲取FreeMODBUS協(xié)議呢?
2022-01-24 07:45:49
求大佬指點一下FreeModbus從機模式接收中斷不能觸發(fā)
的初始化, 也沒有問題我試著使用串口發(fā)送一個”ok”, 串口發(fā)送正常的, 也成功初始化然后在 接收中斷函數(shù)打了斷點, 每次發(fā)送數(shù)據(jù)無法觸發(fā).我看了enable里的代碼,也沒有問題.我沒有辦法, 上次使用ST
2022-11-25 10:17:17
請教大神怎樣去解決FreeModbus丟包的問題呢?
1000a、freeModbus的定時器時間必須準確,接收串行數(shù)據(jù)是通過定時器觸發(fā)接收的,大于19200的波特率的定時器配置為1750us,定時器配置的時間為2.75ms,最終為2ms配置問題追蹤和解
2023-02-03 11:41:30
請問UCOS串口中斷高速接收數(shù)據(jù)怎么才能不被打斷?
就是用原子大大的UCOS3的模板上進行串口中斷數(shù)據(jù)處理,一般收發(fā)正常,串口數(shù)據(jù)接收完成是用了個超時檢測,時間在Tick那里計數(shù),中斷一接收數(shù)據(jù)就重新計數(shù),然后在另外的一個任務進行串口數(shù)據(jù)處理,檢測
2019-09-26 04:36:14
請問stm32串口中斷接收數(shù)據(jù)被持續(xù)的外部中斷會導致接收數(shù)據(jù)異常嗎?
情景是這樣的,stm32串口使用中斷接收數(shù)據(jù),但是外部中斷優(yōu)先級高于串口中斷,當串口正接收數(shù)據(jù)時(還沒接收完),被外部中斷所中斷,并且是持續(xù)的多次長時間的外部中斷,也就是說很長一段時間是會響應外部中斷而不會處理串口接收中斷,,這樣的情況會導致串口接收數(shù)據(jù)異常么,比如說接收數(shù)據(jù)不完整之類的問題?
2019-03-19 06:45:14
請問怎么讓MCU在串口接收數(shù)據(jù)時進入串口中斷
用cubemx生成的代碼,如果想讓MCU在串口接收數(shù)據(jù)時進入串口中斷, 只有在調(diào)用HAL_UART_Receive_IT的同時接收到數(shù)據(jù)才能進入中斷嗎??
2018-11-21 09:01:05
串口中斷丟失數(shù)據(jù)問題
關(guān)于51單片機,串口中斷發(fā)送與接收出現(xiàn)數(shù)據(jù)丟失問題串口中斷的接收器具有雙緩沖結(jié)構(gòu),即在從接收寄存器中讀出前一個已收到的字節(jié)之前,便能接收第2個字節(jié),如果第2個字節(jié)已經(jīng)接收完畢,第1個字節(jié)還沒有被讀出
2019-02-17 00:13:433075
單片機學習教程之外部中斷和定時器及串口中斷的資料和程序說明
本文檔的主要內(nèi)容詳細介紹的是單片機學習教程之外部中斷和定時器及串口中斷的資料和程序說明。CPU收到中斷請求,停下正在處理的工作A,去處理事件B,處理完后繼續(xù)回到中斷的地方繼續(xù)執(zhí)行事件A的過程,稱為中斷
51有5個中斷源 外部中斷0 定時計數(shù)中斷0 外部中斷1 定時繼續(xù)中斷1 串口中斷
2019-04-18 17:27:005
freeModbus代碼庫的代碼閱讀和移植的學習筆記說明
freeModbus的代碼庫還是很好用的,本人在wince和C8051F410下均移植成功(只用到RTU模式)。但freeModbus提供的文檔比較少,只能對照著Modbus協(xié)議一點點試著讀懂源代碼。下面是閱讀代碼期間的跟蹤筆記:
2019-04-17 17:28:0013
FreeModbus RTU如何在串行鏈路上實現(xiàn)
Modbus協(xié)議是連接至不同美型總線或網(wǎng)絡(luò)的設(shè)備之間提供主站/從站通信。在嵌入式系統(tǒng)中,FreeModbus使Mod-bus協(xié)議得以實現(xiàn)。采用FreeModbus支持的RTU傳輸模式,移植
2020-04-03 17:33:009
Freemodbus RTU在STM32上的移植分析
最近用到free modbus,需要在stm32上進行移植,以作modbus-RTU之用?,F(xiàn)成協(xié)議的東西用起來很方便,現(xiàn)成源碼很快就可以為設(shè)計者所用,也是當初制定標準的初哀吧。首先
2020-05-20 17:37:0326
基于STM32CubeMX+STM32F407ZGT6+FreeRTOS+freeMODBUS_RTU的移植
:基于CubeMX+STM32F405RGT6+freeMODBUS_RTU的移植在移植之前準備了一下材料:硬件:正點原子STM32F407探索者開發(fā)板下載器STlink數(shù)據(jù)線Minusb轉(zhuǎn)USB上位機調(diào)試助手:mbpoll(提取碼:ns74)軟件:STM32CubeMXFreeMod
2021-11-18 18:51:0148
IAP15F2K61S2串口中斷快速編程問題
在講串口中斷問題之前,需要明白串口中斷內(nèi)容包括哪些部分,我概括為主要3個部分:串口中斷的初始化,串口的中斷函數(shù)入口函數(shù)設(shè)置,串口中斷的發(fā)送函數(shù)設(shè)置。一.大意講解,例程為例我先以第十屆國賽的程序題為
2021-11-23 17:36:3610
STM32F407和ucosIII移植FreeMODBUS RTU
通信協(xié)議棧包括兩層:定義了數(shù)據(jù)結(jié)構(gòu)和功能Modbus應用協(xié)議和網(wǎng)絡(luò)層。在FreeMODBUS的當前版本中,提供了Modbus Application Protocol v1.1a 的實現(xiàn)并且支持在Mo...
2021-12-02 16:21:1310
STM32使用CubeMAX配置的串口中斷接收方法
STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發(fā)生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在main中第一次調(diào)用接收中斷函數(shù)(這個也是比較關(guān)鍵的)(3)重寫
2021-12-14 18:45:2027
用兩張圖,詳解FreeModbus在單片機串口上的數(shù)據(jù)收發(fā)過程-FreeModbus從站設(shè)計(9)
用兩張圖把FreeModbus在單片機串口上數(shù)據(jù)收發(fā)流程進行了梳理,脈絡(luò)更加清晰。有了這樣一個思路,可以更好地理解,移植FreeModbus的時候,為什么需要修改portserial.c
2021-12-20 18:49:1414
單片機程序中,Modbus功能碼的回調(diào)函數(shù)如何編寫--FreeModbus從站設(shè)計(10)
FreeModbus從站設(shè)計(10)-Modbus功能碼的回調(diào)函數(shù)如何編寫關(guān)鍵詞:FreeModbus CubeMX HAL庫 串口 功能碼此系列的前面幾篇文章,主要是闡述了用HAL庫生成keil
2021-12-20 18:49:249
STM32F103C8T6、FreeModbus從站的設(shè)計與測試(4)——定時器、中斷初始化(CubeMX配置)
比較簡單,不再贅述。注意要啟用串口中斷,FreeModbus采用中斷的方式接受和發(fā)送串口數(shù)據(jù)。2.定時器參數(shù)設(shè)置采用TIM2來作為FreeModbus的定時器,孔丙火(微信公眾號:孔丙火)這里主要實現(xiàn)工業(yè)控制中常用的Modbus-RTU功能,RTU協(xié)議中是靠時間間隔來判斷一個數(shù)據(jù)幀是否結(jié)束的,所以
2021-12-20 18:51:3716
STM32F103、FreeModbus從站設(shè)計(6)-讓串口和Modbus初始化的參數(shù)同步起來
FreeModbus從站設(shè)計(6)-讓串口和Modbus初始化的參數(shù)同步起來關(guān)鍵詞:Modbus FreeModbus STM32F103C8T6 CubeMX 移植1.基本原理在這
2021-12-20 18:54:4114
其實ST的HAL庫與FreeModbus移植很配哦--FreeModbus從站設(shè)計(8)
用HAL庫函數(shù)理清Modbus的數(shù)據(jù)收發(fā)流程。闡述了HAL庫與FreeModbus協(xié)議棧接口的基本框架。最初設(shè)想是能不能完全用HAL庫的函數(shù)來實現(xiàn)的FreeModbus移植。基于HAL庫實現(xiàn)vMBPortSerialEnable()這個函數(shù)。
2021-12-20 18:55:0115
STM32F407串口中斷配置
花費了很久,發(fā)現(xiàn)用庫函數(shù)去訪問發(fā)送完成和接收完成的標志位會出問題,改成了直接訪問寄存器對應的位,終于實現(xiàn)串口中斷的通信。至于為什么庫函數(shù)不行,lz還沒有發(fā)現(xiàn)原因。 串口中斷適合用于發(fā)送數(shù)據(jù)較少的情況
2021-12-24 18:48:181
STM32 裸機 標準庫 移植 Freemodbus RTU
STM32 裸機 標準庫 移植 Freemodbus RTU1、官網(wǎng)下載,解壓得到文件夾如下-rw-r--r-- 1 EDZ 197121 1436 十二月 8 2006
2021-12-24 19:16:1728
STM8S串口中斷卡死調(diào)試記錄
,斷點調(diào)試后發(fā)現(xiàn)是一直在響應UART1接收中斷。調(diào)試步驟如下:懷疑是串口中斷里做了數(shù)據(jù)解析工作,導致在解析途中又收到了第二個串口接收中斷,然后發(fā)生異常。解決辦法是在串口接收中斷中關(guān)閉串口接收中斷,數(shù)...
2021-12-27 18:51:443
STM32單片機串口空閑中斷+DMA接收不定長數(shù)據(jù)
在上一篇文章STM32單片機串口空閑中斷接收不定長數(shù)據(jù)中介紹了利用串口空閑中斷接收不定長數(shù)據(jù),這種方式有一個問題就是串口每接收到一個字節(jié)就會進入一次中斷,如果發(fā)送的數(shù)據(jù)比較頻繁,那么串口中斷就會不停
2021-12-27 19:24:0718
FreeMODBUS庫的擴展與增強(1)- 移植到STM32單片機的基本流程
目錄特別說明FreeMODBUS簡介移植FreeMODBUS的幾個關(guān)鍵問題官方源碼移植流程特別說明由于本文是筆者關(guān)于modbus長期開發(fā)經(jīng)驗的總結(jié),因此分了幾個階段完成,中間可能摻雜了英文。由于時間
2021-12-27 19:28:1113
串口中斷服務函數(shù)的觸發(fā)
串口中斷服務函數(shù)的觸發(fā)USART1_IRQHandler(void)1. 串口發(fā)送中斷下圖為狀態(tài)寄存器(USART_SR)中的位7、位6說明,發(fā)送完一幀并且發(fā)送數(shù)據(jù)寄存器為空時,位6置1。下圖為控制
2021-12-28 19:01:3519
單片機接收不定長的數(shù)據(jù),最優(yōu)解是DMA+串口空閑中斷
,就是當串口有數(shù)據(jù)接收的時候,不會促發(fā)串口中斷,等串口空閑后,(一幀數(shù)據(jù)包接收完成,硬件會自己保證)會促發(fā)一次串口中斷,此時可以對一個完整的數(shù)據(jù)包進行處理。只開串口接收中斷是每個字節(jié)都會促發(fā)一次串口中斷
2021-12-28 19:26:3419
FreeModbus 在 STM32F1 平臺的移植和解析
文章目錄1 freemodbus移植1.1 freemodbus介紹1.2 freemodbus移植1.2.1 串口的移植1.2.2 定時器的移植1 freemodbus移植??本文介紹
2022-01-14 13:57:3338
STM32G0開發(fā)筆記:FreeRTOS和FreeModbus庫使用
使用Platformio平臺的libopencm3開發(fā)框架來開發(fā)STM32G0,以下為FreeRTOS和FreeModbus庫使用。
2023-01-16 14:44:553625
STM32串口中斷應用實例
本文將介紹如何使用STM32F4的串口接收中斷,通過串口助手模擬上位機發(fā)送指令、STM32F4串口中斷接收到指令后根據(jù)指令選擇開關(guān)LED小燈。
2023-04-20 11:45:591503
HAL_UART_Transmit阻塞時會影響串口中斷接收嗎?
最近項目里使用了兩路串口透傳數(shù)據(jù),串口3中斷接收數(shù)據(jù),組包后通過串口1阻塞發(fā)送出去。
2023-10-26 14:24:32379
如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機方法
電子發(fā)燒友網(wǎng)站提供《如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機方法.pdf》資料免費下載
2023-12-18 11:15:140
評論
查看更多