來(lái)源:csdn博客 蕭年已逝;在此特別鳴謝!
freemodbus教程之freemodbus移植應(yīng)用串口中斷接收和數(shù)據(jù)解析
本篇主要講解從機(jī)數(shù)據(jù)的接收流程。接收流程分為兩個(gè)階段:串口中斷接收和數(shù)據(jù)解析。
第二階段:數(shù)據(jù)解析eMBPoll( )。
一、串口中斷接收
從機(jī)正常狀態(tài)下,串口設(shè)置為接收中斷模式,也不啟動(dòng)定時(shí)器。當(dāng)檢測(cè)到有數(shù)據(jù)時(shí),中斷函數(shù)調(diào)用xMBRTUReceiveFSM()函數(shù),通過(guò)該函數(shù)中的ucRTUBuf數(shù)組存儲(chǔ)接收幀,用usRcvBufferPos存儲(chǔ)數(shù)據(jù)幀長(zhǎng)度。具體函數(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ù)。只要進(jìn)人該函數(shù),就會(huì)啟動(dòng)定時(shí)器中斷。
從機(jī)的接收狀態(tài):
(1)STATE_RX_INIT(協(xié)議棧初始化);
(2)STATE_RX_ERROR(接收錯(cuò)誤);
(3)STATE_RX_IDLE(接收空閑,接收幀頭,常用);
(4)STATE_RX_RCV(接收所有數(shù)據(jù),常用)。
注意:接收數(shù)據(jù)時(shí),只要接收到數(shù)據(jù),定時(shí)器就會(huì)清零,重新計(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)用相應(yīng)的功能函數(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 )//如果接收有問(wèn)題
{
/* 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ù)組,存放的是功能碼以及對(duì)應(yīng)的報(bào)文解析函數(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 ) )//計(jì)算幀長(zhǎng)度,除了地址位和兩位的crc校驗(yàn)位
{
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 );//計(jì)算讀取寄存器的長(zhǎng)度
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 ) )//讀取寄存器的長(zhǎng)度不越界
{
/* 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;
}
以上就是整個(gè)接收數(shù)據(jù)、解析數(shù)據(jù)的過(guò)程。
來(lái)源:csdn博客 蕭年已逝;在此特別鳴謝!
來(lái)源:csdn博客 蕭年已逝;在此特別鳴謝!
- 數(shù)據(jù)(87426)
- 定時(shí)器(111866)
- 串口(74285)
- 函數(shù)(61196)
- FreeModbus(4352)
相關(guān)推薦
開(kāi)發(fā)一款支持主機(jī)模式的FreeModbus協(xié)議棧
FreeModbus 是一款開(kāi)源的 Modbus 協(xié)議棧,但是只有從機(jī)開(kāi)源,主機(jī)源碼是需要收費(fèi)的。同時(shí)網(wǎng)上也沒(méi)有發(fā)現(xiàn)比較好的開(kāi)源的 Modbus 主機(jī)協(xié)議棧,所以才開(kāi)發(fā)這款支持主機(jī)模式的 FreeModbus 協(xié)議棧。
2022-07-27 16:18:44
2511


FreeRTOS串口中斷接收不定長(zhǎng)的數(shù)據(jù)與二值信號(hào)量的使用
FreeRTOS例程,使用串口中斷接收不定長(zhǎng)的數(shù)據(jù),以及二值信號(hào)量的使用
2022-09-26 09:02:26
3450


CW32L083串口中斷+定時(shí)器實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收
CW32L083 用串口中斷加定時(shí)器中斷實(shí)現(xiàn)串口的不定長(zhǎng)數(shù)據(jù)的接收,特別適用于AT指令的接收。
2023-07-12 09:00:17
1011


FreeMODBUS庫(kù)移植到STM32單片機(jī)的基本流程分享
目錄特別說(shuō)明FreeMODBUS簡(jiǎn)介移植FreeMODBUS的幾個(gè)關(guān)鍵問(wèn)題官方源碼移植流程特別說(shuō)明由于本文是筆者關(guān)于modbus長(zhǎng)期開(kāi)發(fā)經(jīng)驗(yàn)的總結(jié),因此分了幾個(gè)階段完成,中間可能摻雜了英文。由于時(shí)間
2022-02-22 08:23:44
FreeMODBUS是什么
通信協(xié)議棧包括兩層:定義了數(shù)據(jù)結(jié)構(gòu)和功能Modbus應(yīng)用協(xié)議和網(wǎng)絡(luò)層。在FreeMODBUS的當(dāng)前版本中,提供了Modbus Application Protocol v1.1a 的實(shí)現(xiàn)并且支持在Mo...
2022-01-26 08:22:57
FreeMODBUS簡(jiǎn)介
1.簡(jiǎn)介FreeMODBUS一個(gè)奧地利人寫(xiě)的Modbus協(xié)議。它是一個(gè)針對(duì)嵌入式應(yīng)用的一個(gè)免費(fèi)(自由)的通用MODBUS協(xié)議的移植。Modbus是一個(gè)工業(yè)制造環(huán)境中應(yīng)用的一個(gè)通用協(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è)計(jì)與測(cè)試
關(guān)鍵詞:Modbus FreeModbus STM32F103C8T6 CubeMX1.開(kāi)發(fā)環(huán)境(1)STM32CubeMX,版本:4.27.0,截止寫(xiě)稿時(shí),最新版本已到6,但孔丙火(微信公眾號(hào):孔
2022-02-16 06:59:58
FreeModbus是如何去實(shí)現(xiàn)Modbus協(xié)議全部功能的
Modbus是什么?FreeModbus是如何去實(shí)現(xiàn)Modbus協(xié)議全部功能的?
2021-12-10 07:34:08
FreeModbus采用中斷的方式接受和發(fā)送串口數(shù)據(jù)
比較簡(jiǎn)單,不再贅述。注意要啟用串口中斷,FreeModbus采用中斷的方式接受和發(fā)送串口數(shù)據(jù)。2.定時(shí)器參數(shù)設(shè)置采用TIM2來(lái)作為FreeModbus的定時(shí)器,孔丙火(微信公眾號(hào):孔丙火)這里主要實(shí)現(xiàn)工業(yè)控制中常用的Modbus-RTU功能,RTU協(xié)議中是靠時(shí)間間隔來(lái)判斷一個(gè)數(shù)據(jù)幀是否結(jié)束的,所以
2022-02-16 07:01:29
串口中斷接收問(wèn)題
大家?guī)臀铱纯催@個(gè)串口中斷函數(shù)有沒(méi)有問(wèn)題啊?現(xiàn)在的問(wèn)題是用串口調(diào)試助手可以接收單片機(jī)在main函數(shù)里發(fā)送的數(shù)據(jù),但是在中斷里無(wú)法接收數(shù)據(jù),在中斷里接收上位機(jī)的數(shù)據(jù)再發(fā)送到上位機(jī)結(jié)果都是00!就是說(shuō)無(wú)法
2019-07-04 04:35:16
HAL庫(kù)的串口中斷接收
[STM32系列]一、HAL庫(kù)的串口中斷接收1、前言2、回調(diào)函數(shù)3、HAL庫(kù)中斷接收函數(shù)使用1、前言HAL即硬件抽象層(英語(yǔ):Hardware Abstraction Layer),實(shí)現(xiàn)了不同硬件
2021-08-16 08:13:51
RT-Thread freemodbus協(xié)議的移植實(shí)現(xiàn)
前言繼續(xù)熟悉RT-Thread freemodbus的應(yīng)用,熟悉modbus協(xié)議。平臺(tái):Pandora STM32L475,Keil MDK5,RT-Thread 4.0.3有前幾次的移植,本次驗(yàn)證
2022-04-29 14:40:29
STM32移植FreeModbus RTU教程
STM32移植FreeModbus RTU教程3(FreeModbus移植后的實(shí)際驗(yàn)證)下載工程到開(kāi)發(fā)板并通過(guò)USB轉(zhuǎn)485通訊線連接PC通過(guò)modbus調(diào)試助手進(jìn)行通訊驗(yàn)證03H 04H 06H
2021-08-03 06:21:45
STM32移植Freemodbus RTU的過(guò)程
STM32 裸機(jī) 標(biāo)準(zhǔn)庫(kù) 移植 Freemodbus RTU1、官網(wǎng)下載,解壓得到文件夾如下-rw-r--r-- 1 EDZ 1971211436 十二月82006
2022-02-21 07:01:39
STM32移植freemodbus 后測(cè)試時(shí),只能使用無(wú)校驗(yàn)是為什么?怎么解決?
STM32移植freemodbus 后測(cè)試時(shí),只能使用無(wú)校驗(yàn)是為什么?怎么解決?
2022-02-18 07:18:07
STM32移植freemodbus后測(cè)試時(shí)設(shè)置奇偶校驗(yàn)時(shí)無(wú)法與上位機(jī)通訊怎么解決?
STM32移植freemodbus后測(cè)試時(shí)設(shè)置奇偶校驗(yàn)時(shí)無(wú)法與上位機(jī)通訊怎么解決?
2021-12-03 06:55:31
STM32F429 HAL庫(kù)是如何移植FreeModbus_RTU的
STM32F429 HAL庫(kù)移FreeModbus_RTU詳細(xì)步驟開(kāi)發(fā)環(huán)境說(shuō)明完整工程文件下載地址移植前提修改"RS485.c"文件修改"
2021-08-17 07:16:03
STM32使用CubeMAX配置的串口中斷接收方法是什么
STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發(fā)生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在main中第一次調(diào)用接收中斷函數(shù)(這個(gè)也是比較關(guān)鍵的)(3)重寫(xiě)
2021-08-13 09:06:48
libmodbus與freemodbus相比有何不同
背景modbus有主機(jī)、從機(jī)之分libmodbus與freemodbus相比,是主從機(jī)一體的,freemodbus,官方的為從機(jī)。libmodbus感覺(jué)更適合rt-thread,因?yàn)椋辛藘?nèi)存的管理
2022-02-22 07:00:31
【HAL庫(kù)每天一例】第117例:freemodbus移植
*/SystemClock_Config();/* 初始化串口并配置串口中斷優(yōu)先級(jí) */MX_DEBUG_USART_Init();printf("freemodbus 移植測(cè)試\n"
2016-09-09 10:07:51
【分享】STM32移植FreeModbus 經(jīng)驗(yàn)
的MODBUS 協(xié)議整理..zip二freeemodbus中如何通過(guò)串口發(fā)送和接收數(shù)據(jù)freemodbus通過(guò)串口中斷的方式接收和發(fā)送數(shù)據(jù)。采用這種做法我想可以節(jié)省程序等待的時(shí)間,并且也短充分
2014-07-30 14:13:22
兩個(gè)串口的freemodbus組件是無(wú)法配置的對(duì)嗎
1.兩個(gè)串口的freemodbus組件是無(wú)法配置的對(duì)吧2.libmodbus問(wèn)題求助libmodbus 用Modbus Slave測(cè)試 發(fā)送指令會(huì)斷開(kāi)但是用串口調(diào)試工具是好的
2022-08-19 11:31:46
為什么需要修改串口中斷的回調(diào)函數(shù)
用兩張圖把FreeModbus在單片機(jī)串口上數(shù)據(jù)收發(fā)流程進(jìn)行了梳理,脈絡(luò)更加清晰。有了這樣一個(gè)思路,可以更好地理解,移植FreeModbus的時(shí)候,為什么需要修改portserial.c
2022-02-16 07:26:54
介紹Modbus協(xié)議在STM32平臺(tái)上的移植
文章目錄1freemodbus移植1.1 freemodbus介紹1.2 freemodbus移植1.2.1 串口的移植1.2.2 定時(shí)器的移植1freemodbus移植??本文介紹Modbus協(xié)議
2022-01-14 06:57:23
關(guān)于STM32移值FreeModbus的心得
關(guān)于STM32移值FreeModbus的心得關(guān)于FreeModbus踩過(guò)的坑提供移值源碼僅供參考,不足之處請(qǐng)指正關(guān)于FreeModbusFreeMODBUS是一個(gè)奧地利人寫(xiě)的Modbus-slave
2021-08-19 09:05:28
在freemodbus中配置uart5來(lái)實(shí)現(xiàn)RTU-slave功能,無(wú)法接收到數(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
在stm32上能用freemodbus的主機(jī)調(diào)用從機(jī)嗎
如果在stm32 上同時(shí)移植freemodbus的主機(jī)和從機(jī),能用主機(jī)調(diào)用從機(jī)嗎?
2022-07-18 10:59:33
基于STM32HAL庫(kù)移植FreeModbus怎么實(shí)現(xiàn)?
如何利用STM32CubeMX新建工程?基于STM32HAL庫(kù)移植FreeModbus怎么實(shí)現(xiàn)?
2021-12-10 06:01:40
外部中斷和串口中斷問(wèn)題
目標(biāo) :今天試著編寫(xiě)了 兩個(gè)外部中斷 分別往串口發(fā)a和b一個(gè)串口接收中斷 接到什么數(shù)據(jù)就發(fā)什么數(shù)據(jù)問(wèn)題:程序燒寫(xiě)后 復(fù)位運(yùn)行后 分別輪流觸發(fā) EINT0 EINT2 能夠發(fā)出相應(yīng)的數(shù)據(jù) 正常串口接收
2019-04-28 09:59:17
如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機(jī)
本應(yīng)用筆記介紹了如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機(jī)方法。本文檔提供的源代碼演示了使用Modbus的應(yīng)用程序。單片機(jī)作為Modbus從機(jī),可通過(guò)RS485或RS232與上位機(jī)相連,與Modbus Poll調(diào)試工具(Modbus主機(jī))進(jìn)行通訊。
2023-10-26 06:18:33
如何將FreeModbus移植到STM32F103上去
1.創(chuàng)建工程2.將FreeModbus源碼,拷貝到工程目錄3.將FreeModbus文件添加進(jìn)工程添加好之后,編譯出現(xiàn)錯(cuò)誤4.移植底層接口先看第一個(gè)錯(cuò)誤,缺少port.h借鑒AVR架構(gòu)的程序,將demo里面AVR中的port文件夾,拷貝到工程中進(jìn)入port文件夾,刪除重復(fù)文件,mbcrc.c...
2021-08-23 06:13:28
如何將freemodbus移植到stm32平臺(tái)
modbus是一個(gè)非常好的串口協(xié)議(當(dāng)然也能用在網(wǎng)口上),它簡(jiǎn)潔、規(guī)范、強(qiáng)大。可以滿足大部分的工業(yè)、嵌入式需求。這里詳細(xì)說(shuō)下如何將freemodbus移植到stm32平臺(tái)。我之前下載的版本是1.6
2021-08-16 06:59:43
嘗試一下在freemodbus里使用serialX
使用 serialX ,實(shí)現(xiàn)了中斷接收中斷發(fā)送模式打開(kāi)串口設(shè)備,這次嘗試讓筆者堅(jiān)信了即便使用 DMA 收發(fā)也能在 finsh 里應(yīng)付自如。今天我們嘗試一下在 freemodbus 里使用 serialX 。注
2023-02-13 15:09:29
怎么縮短freemodbus組件作為從機(jī)的響應(yīng)時(shí)間呢?
freemodbus組件設(shè)置為從機(jī),波特率115200,接收用串口中斷方式,響應(yīng)時(shí)間約500ms,主機(jī)發(fā)送命令間隔需在500ms以上通信才正常。請(qǐng)問(wèn)想縮短這個(gè)時(shí)間,應(yīng)該關(guān)注源代碼哪些部分?響應(yīng)時(shí)間想控制在10ms內(nèi)。
2023-04-14 10:28:56
怎樣去獲取FreeMODBUS協(xié)議呢
FreeMODBUS是什么呢?FreeMODBUS協(xié)議有何功能呢?怎樣去獲取FreeMODBUS協(xié)議呢?
2022-01-24 07:45:49
求大佬指點(diǎn)一下FreeModbus從機(jī)模式接收中斷不能觸發(fā)
的初始化, 也沒(méi)有問(wèn)題我試著使用串口發(fā)送一個(gè)”ok”, 串口發(fā)送正常的, 也成功初始化然后在 接收中斷函數(shù)打了斷點(diǎn), 每次發(fā)送數(shù)據(jù)無(wú)法觸發(fā).我看了enable里的代碼,也沒(méi)有問(wèn)題.我沒(méi)有辦法, 上次使用ST
2022-11-25 10:17:17
請(qǐng)教大神怎樣去解決FreeModbus丟包的問(wèn)題呢?
1000a、freeModbus的定時(shí)器時(shí)間必須準(zhǔn)確,接收串行數(shù)據(jù)是通過(guò)定時(shí)器觸發(fā)接收的,大于19200的波特率的定時(shí)器配置為1750us,定時(shí)器配置的時(shí)間為2.75ms,最終為2ms配置問(wèn)題追蹤和解
2023-02-03 11:41:30
請(qǐng)問(wèn)Freemodbus可以同時(shí)支持多路串口嗎?
請(qǐng)教大家個(gè)問(wèn)題,我這邊想同時(shí)開(kāi)啟多路串口同時(shí)使用freemodbus,有什么好的設(shè)計(jì)思路可以分享嗎
2023-02-13 14:51:30
請(qǐng)問(wèn)STM32F429 HAL庫(kù)如何移植FreeModbus_RTU?
請(qǐng)問(wèn)STM32F429 HAL庫(kù)如何移植FreeModbus_RTU?
2021-11-18 07:46:49
請(qǐng)問(wèn)UCOS串口中斷高速接收數(shù)據(jù)怎么才能不被打斷?
就是用原子大大的UCOS3的模板上進(jìn)行串口中斷數(shù)據(jù)處理,一般收發(fā)正常,串口數(shù)據(jù)接收完成是用了個(gè)超時(shí)檢測(cè),時(shí)間在Tick那里計(jì)數(shù),中斷一接收數(shù)據(jù)就重新計(jì)數(shù),然后在另外的一個(gè)任務(wù)進(jìn)行串口數(shù)據(jù)處理,檢測(cè)
2019-09-26 04:36:14
請(qǐng)問(wèn)stm32串口中斷接收數(shù)據(jù)被持續(xù)的外部中斷會(huì)導(dǎo)致接收數(shù)據(jù)異常嗎?
情景是這樣的,stm32串口使用中斷接收數(shù)據(jù),但是外部中斷優(yōu)先級(jí)高于串口中斷,當(dāng)串口正接收數(shù)據(jù)時(shí)(還沒(méi)接收完),被外部中斷所中斷,并且是持續(xù)的多次長(zhǎng)時(shí)間的外部中斷,也就是說(shuō)很長(zhǎng)一段時(shí)間是會(huì)響應(yīng)外部中斷而不會(huì)處理串口接收中斷,,這樣的情況會(huì)導(dǎo)致串口接收數(shù)據(jù)異常么,比如說(shuō)接收數(shù)據(jù)不完整之類的問(wèn)題?
2019-03-19 06:45:14
請(qǐng)問(wèn)怎么讓MCU在串口接收數(shù)據(jù)時(shí)進(jìn)入串口中斷
用cubemx生成的代碼,如果想讓MCU在串口接收數(shù)據(jù)時(shí)進(jìn)入串口中斷, 只有在調(diào)用HAL_UART_Receive_IT的同時(shí)接收到數(shù)據(jù)才能進(jìn)入中斷嗎??
2018-11-21 09:01:05
串口中斷丟失數(shù)據(jù)問(wèn)題
關(guān)于51單片機(jī),串口中斷發(fā)送與接收出現(xiàn)數(shù)據(jù)丟失問(wèn)題串口中斷的接收器具有雙緩沖結(jié)構(gòu),即在從接收寄存器中讀出前一個(gè)已收到的字節(jié)之前,便能接收第2個(gè)字節(jié),如果第2個(gè)字節(jié)已經(jīng)接收完畢,第1個(gè)字節(jié)還沒(méi)有被讀出
2019-02-17 00:13:43
3075

單片機(jī)學(xué)習(xí)教程之外部中斷和定時(shí)器及串口中斷的資料和程序說(shuō)明
本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)學(xué)習(xí)教程之外部中斷和定時(shí)器及串口中斷的資料和程序說(shuō)明。CPU收到中斷請(qǐng)求,停下正在處理的工作A,去處理事件B,處理完后繼續(xù)回到中斷的地方繼續(xù)執(zhí)行事件A的過(guò)程,稱為中斷
51有5個(gè)中斷源 外部中斷0 定時(shí)計(jì)數(shù)中斷0 外部中斷1 定時(shí)繼續(xù)中斷1 串口中斷
2019-04-18 17:27:00
5

freeModbus代碼庫(kù)的代碼閱讀和移植的學(xué)習(xí)筆記說(shuō)明
freeModbus的代碼庫(kù)還是很好用的,本人在wince和C8051F410下均移植成功(只用到RTU模式)。但freeModbus提供的文檔比較少,只能對(duì)照著Modbus協(xié)議一點(diǎn)點(diǎn)試著讀懂源代碼。下面是閱讀代碼期間的跟蹤筆記:
2019-04-17 17:28:00
13

FreeModbus RTU如何在串行鏈路上實(shí)現(xiàn)
Modbus協(xié)議是連接至不同美型總線或網(wǎng)絡(luò)的設(shè)備之間提供主站/從站通信。在嵌入式系統(tǒng)中,FreeModbus使Mod-bus協(xié)議得以實(shí)現(xiàn)。采用FreeModbus支持的RTU傳輸模式,移植
2020-04-03 17:33:00
9

Freemodbus RTU在STM32上的移植分析
最近用到free modbus,需要在stm32上進(jìn)行移植,以作modbus-RTU之用。現(xiàn)成協(xié)議的東西用起來(lái)很方便,現(xiàn)成源碼很快就可以為設(shè)計(jì)者所用,也是當(dāng)初制定標(biāo)準(zhǔn)的初哀吧。首先
2020-05-20 17:37:03
26

Arduino的實(shí)驗(yàn)例程之串口中斷的程序免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是Arduino的實(shí)驗(yàn)例程之串口中斷的程序免費(fèi)下載。
2021-02-25 17:39:08
13

基于STM32CubeMX+STM32F407ZGT6+FreeRTOS+freeMODBUS_RTU的移植
:基于CubeMX+STM32F405RGT6+freeMODBUS_RTU的移植在移植之前準(zhǔn)備了一下材料:硬件:正點(diǎn)原子STM32F407探索者開(kāi)發(fā)板下載器STlink數(shù)據(jù)線Minusb轉(zhuǎn)USB上位機(jī)調(diào)試助手:mbpoll(提取碼:ns74)軟件:STM32CubeMXFreeMod
2021-11-18 18:51:01
48

IAP15F2K61S2串口中斷快速編程問(wèn)題
在講串口中斷問(wèn)題之前,需要明白串口中斷內(nèi)容包括哪些部分,我概括為主要3個(gè)部分:串口中斷的初始化,串口的中斷函數(shù)入口函數(shù)設(shè)置,串口中斷的發(fā)送函數(shù)設(shè)置。一.大意講解,例程為例我先以第十屆國(guó)賽的程序題為
2021-11-23 17:36:36
10

STM32F407和ucosIII移植FreeMODBUS RTU
通信協(xié)議棧包括兩層:定義了數(shù)據(jù)結(jié)構(gòu)和功能Modbus應(yīng)用協(xié)議和網(wǎng)絡(luò)層。在FreeMODBUS的當(dāng)前版本中,提供了Modbus Application Protocol v1.1a 的實(shí)現(xiàn)并且支持在Mo...
2021-12-02 16:21:13
10

STM32使用CubeMAX配置的串口中斷接收方法
STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發(fā)生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在main中第一次調(diào)用接收中斷函數(shù)(這個(gè)也是比較關(guān)鍵的)(3)重寫(xiě)
2021-12-14 18:45:20
27

用兩張圖,詳解FreeModbus在單片機(jī)串口上的數(shù)據(jù)收發(fā)過(guò)程-FreeModbus從站設(shè)計(jì)(9)
用兩張圖把FreeModbus在單片機(jī)串口上數(shù)據(jù)收發(fā)流程進(jìn)行了梳理,脈絡(luò)更加清晰。有了這樣一個(gè)思路,可以更好地理解,移植FreeModbus的時(shí)候,為什么需要修改portserial.c
2021-12-20 18:49:14
14

單片機(jī)程序中,Modbus功能碼的回調(diào)函數(shù)如何編寫(xiě)--FreeModbus從站設(shè)計(jì)(10)
FreeModbus從站設(shè)計(jì)(10)-Modbus功能碼的回調(diào)函數(shù)如何編寫(xiě)關(guān)鍵詞:FreeModbus CubeMX HAL庫(kù) 串口 功能碼此系列的前面幾篇文章,主要是闡述了用HAL庫(kù)生成keil
2021-12-20 18:49:24
9

STM32F103C8T6、FreeModbus從站的設(shè)計(jì)與測(cè)試(4)——定時(shí)器、中斷初始化(CubeMX配置)
比較簡(jiǎn)單,不再贅述。注意要啟用串口中斷,FreeModbus采用中斷的方式接受和發(fā)送串口數(shù)據(jù)。2.定時(shí)器參數(shù)設(shè)置采用TIM2來(lái)作為FreeModbus的定時(shí)器,孔丙火(微信公眾號(hào):孔丙火)這里主要實(shí)現(xiàn)工業(yè)控制中常用的Modbus-RTU功能,RTU協(xié)議中是靠時(shí)間間隔來(lái)判斷一個(gè)數(shù)據(jù)幀是否結(jié)束的,所以
2021-12-20 18:51:37
16

STM32F103、FreeModbus從站設(shè)計(jì)(6)-讓串口和Modbus初始化的參數(shù)同步起來(lái)
FreeModbus從站設(shè)計(jì)(6)-讓串口和Modbus初始化的參數(shù)同步起來(lái)關(guān)鍵詞:Modbus FreeModbus STM32F103C8T6 CubeMX 移植1.基本原理在這
2021-12-20 18:54:41
14

其實(shí)ST的HAL庫(kù)與FreeModbus移植很配哦--FreeModbus從站設(shè)計(jì)(8)
用HAL庫(kù)函數(shù)理清Modbus的數(shù)據(jù)收發(fā)流程。闡述了HAL庫(kù)與FreeModbus協(xié)議棧接口的基本框架。最初設(shè)想是能不能完全用HAL庫(kù)的函數(shù)來(lái)實(shí)現(xiàn)的FreeModbus移植。基于HAL庫(kù)實(shí)現(xiàn)vMBPortSerialEnable()這個(gè)函數(shù)。
2021-12-20 18:55:01
15

STM32F407串口中斷配置
花費(fèi)了很久,發(fā)現(xiàn)用庫(kù)函數(shù)去訪問(wèn)發(fā)送完成和接收完成的標(biāo)志位會(huì)出問(wèn)題,改成了直接訪問(wèn)寄存器對(duì)應(yīng)的位,終于實(shí)現(xiàn)串口中斷的通信。至于為什么庫(kù)函數(shù)不行,lz還沒(méi)有發(fā)現(xiàn)原因。 串口中斷適合用于發(fā)送數(shù)據(jù)較少的情況
2021-12-24 18:48:18
1

STM32 裸機(jī) 標(biāo)準(zhǔn)庫(kù) 移植 Freemodbus RTU
STM32 裸機(jī) 標(biāo)準(zhǔn)庫(kù) 移植 Freemodbus RTU1、官網(wǎng)下載,解壓得到文件夾如下-rw-r--r-- 1 EDZ 197121 1436 十二月 8 2006
2021-12-24 19:16:17
28

STM8S串口中斷卡死調(diào)試記錄
,斷點(diǎn)調(diào)試后發(fā)現(xiàn)是一直在響應(yīng)UART1接收中斷。調(diào)試步驟如下:懷疑是串口中斷里做了數(shù)據(jù)解析工作,導(dǎo)致在解析途中又收到了第二個(gè)串口接收中斷,然后發(fā)生異常。解決辦法是在串口接收中斷中關(guān)閉串口接收中斷,數(shù)...
2021-12-27 18:51:44
3

STM32單片機(jī)串口空閑中斷+DMA接收不定長(zhǎng)數(shù)據(jù)
在上一篇文章STM32單片機(jī)串口空閑中斷接收不定長(zhǎng)數(shù)據(jù)中介紹了利用串口空閑中斷接收不定長(zhǎng)數(shù)據(jù),這種方式有一個(gè)問(wèn)題就是串口每接收到一個(gè)字節(jié)就會(huì)進(jìn)入一次中斷,如果發(fā)送的數(shù)據(jù)比較頻繁,那么串口中斷就會(huì)不停
2021-12-27 19:24:07
18

FreeMODBUS庫(kù)的擴(kuò)展與增強(qiáng)(1)- 移植到STM32單片機(jī)的基本流程
目錄特別說(shuō)明FreeMODBUS簡(jiǎn)介移植FreeMODBUS的幾個(gè)關(guān)鍵問(wèn)題官方源碼移植流程特別說(shuō)明由于本文是筆者關(guān)于modbus長(zhǎng)期開(kāi)發(fā)經(jīng)驗(yàn)的總結(jié),因此分了幾個(gè)階段完成,中間可能摻雜了英文。由于時(shí)間
2021-12-27 19:28:11
13

串口中斷服務(wù)函數(shù)的觸發(fā)
串口中斷服務(wù)函數(shù)的觸發(fā)USART1_IRQHandler(void)1. 串口發(fā)送中斷下圖為狀態(tài)寄存器(USART_SR)中的位7、位6說(shuō)明,發(fā)送完一幀并且發(fā)送數(shù)據(jù)寄存器為空時(shí),位6置1。下圖為控制
2021-12-28 19:01:35
19

單片機(jī)接收不定長(zhǎng)的數(shù)據(jù),最優(yōu)解是DMA+串口空閑中斷
,就是當(dāng)串口有數(shù)據(jù)接收的時(shí)候,不會(huì)促發(fā)串口中斷,等串口空閑后,(一幀數(shù)據(jù)包接收完成,硬件會(huì)自己保證)會(huì)促發(fā)一次串口中斷,此時(shí)可以對(duì)一個(gè)完整的數(shù)據(jù)包進(jìn)行處理。只開(kāi)串口接收中斷是每個(gè)字節(jié)都會(huì)促發(fā)一次串口中斷
2021-12-28 19:26:34
19

FreeModbus 在 STM32F1 平臺(tái)的移植和解析
文章目錄1 freemodbus移植1.1 freemodbus介紹1.2 freemodbus移植1.2.1 串口的移植1.2.2 定時(shí)器的移植1 freemodbus移植??本文介紹
2022-01-14 13:57:33
38

STM32G0開(kāi)發(fā)筆記:FreeRTOS和FreeModbus庫(kù)使用
使用Platformio平臺(tái)的libopencm3開(kāi)發(fā)框架來(lái)開(kāi)發(fā)STM32G0,以下為FreeRTOS和FreeModbus庫(kù)使用。
2023-01-16 14:44:55
3625


STM32串口中斷應(yīng)用實(shí)例
本文將介紹如何使用STM32F4的串口接收中斷,通過(guò)串口助手模擬上位機(jī)發(fā)送指令、STM32F4串口中斷接收到指令后根據(jù)指令選擇開(kāi)關(guān)LED小燈。
2023-04-20 11:45:59
1503


HAL_UART_Transmit阻塞時(shí)會(huì)影響串口中斷接收嗎?
最近項(xiàng)目里使用了兩路串口透?jìng)?b class="flag-6" style="color: red">數(shù)據(jù),串口3中斷接收數(shù)據(jù),組包后通過(guò)串口1阻塞發(fā)送出去。
2023-10-26 14:24:32
379


如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機(jī)方法
電子發(fā)燒友網(wǎng)站提供《如何將FreeMODBUS協(xié)議棧移植到AT32F43x單片機(jī)方法.pdf》資料免費(fèi)下載
2023-12-18 11:15:14
0

評(píng)論