通過(guò)自己的理解,將modbus工作的全過(guò)程歸納為以下幾個(gè)圖。
希望你能更形象地從整體的角度理解整體的原理。
由于篇幅有限,圖中的字體很小,省略了一些程序的語(yǔ)句。 請(qǐng)結(jié)合freemodbus的源代碼進(jìn)行確認(rèn)。
串行端口相應(yīng)地設(shè)置有基于STM32的USART2。
另外,應(yīng)該有三個(gè)枚舉概率,有識(shí)別和區(qū)別。
1 ) emb事件類(lèi)型、emb角色) )中,判斷事件。 事件是對(duì)完整幀(消息)的操作。
類(lèi)型編號(hào)
{
EV_READY,//事件準(zhǔn)備階段,即還沒(méi)有接收到1幀的數(shù)據(jù)
EV_FRAME_RECEIVED,//1幀的數(shù)據(jù)接收結(jié)束
EV_EXECUTE,//此幀數(shù)據(jù)的具體執(zhí)行
發(fā)送EV_FRAME_SENT //幀
} emb事件類(lèi)型;
2 ) eRcvState和eSndState,這兩個(gè)枚舉變量表示接收狀態(tài)、發(fā)送狀態(tài),每字節(jié)。
如果存在正在接收的字節(jié),則eRcvState=STATE_RX_RCV; 所有字節(jié)接收后,將再次進(jìn)入空閑狀態(tài)。
如果沒(méi)有正在接收的字節(jié),則eRcvState=STATE_RX_IDLE; 只有在接收空閑狀態(tài)下才能發(fā)送。 反之亦然。
他們的關(guān)系:當(dāng)一幀的所有的字節(jié)被接收、或者被發(fā)送完成之后, 就觸發(fā)了一個(gè)事件。從而,進(jìn)入了對(duì)事件的操作中。
有了大致的理解,下圖會(huì)更容易理解。