簡體   English   中英

STM32F3如何使用MODBUS TCP?

[英]How to use the MODBUS TCP with STM32F3?

作為大型研究的結果,我發現這個STM32f1 L此源代碼油墨和我改變它STM32f3。 以及構建並安裝到我的 STM32。 我的以太網電纜連接在我的電腦和 enc28j60 模塊之間。 如果我在main.c和 while 循環中調試此代碼我的代碼堆棧:

  while (1)
    {


        eMBPoll();
        led_poll();

        /* 從網絡設備讀取一個IP包,返回數據長度 */
        uip_len = tapdev_read();
        /* 收到數據 */
        **if (uip_len > 0)**
        {
            /* 處理IP數據包 */
            if (BUF->type == htons(UIP_ETHTYPE_IP))
            {
                uip_arp_ipin();
                uip_input();

                if (uip_len > 0)
                {
                    uip_arp_out();
                    tapdev_send();
                }
            }
            /* 處理ARP報文 */
            else if (BUF->type == htons(UIP_ETHTYPE_ARP))
            {
                uip_arp_arpin();
                if (uip_len > 0)
                {
                    tapdev_send();
                }
            }
        }

我卡住if (uip_len > 0)行,因為 uip_len 為該行返回 0:

(我的代碼與下面的 github 鏈接相同,所以我不共享所有代碼)

enc28j_60.c 中的 unsigned int enc28j60_packet_receive(unsigned char *packet, unsigned int maxlen) 函數:

unsigned int enc28j60_packet_receive(unsigned char *packet, unsigned int maxlen)
{

    unsigned int rxstat;
    unsigned int len;

    if (enc28_read(EPKTCNT) == 0)
    {
        return (0);
    }

    enc28_write(ERDPTL, (next_pack_ptr));
    enc28_write(ERDPTH, (next_pack_ptr) >> 8);

    next_pack_ptr = enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
    next_pack_ptr |= enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;

    len = enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
    len |= enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;

    len -= 4;

    rxstat = enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
    rxstat |= enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;

    if (len > maxlen - 1)
    {
        len = maxlen - 1;
    }

    **if ((rxstat & 0x80) == 0)
    {
        GPIO_SetBits(GPIOE, GPIO_Pin_9);

        len = 0;
    }**
    else
    {

        des_enc28_readBuffer(packet, len);
    }

    enc28_write(ERXRDPTL, (next_pack_ptr));
    enc28_write(ERXRDPTH, (next_pack_ptr) >> 8);

    enc28_writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);

    return (len);
}

為什么rxstat & 0x80) == 0 我不明白。

根據ENC28J60 數據表,似乎RXSTAT標志應該在位 12:

ENC28J60 物理寄存器

我不確定des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0)是否正在閱讀正確的東西,但我相信你應該有類似的東西:

unsigned PHSTAT2 = des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
PHSTAT2 |= des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;

unsigned RXSTAT = (PHSTAT2 & 0x1000) != 0;
if (RXSTAT)
{
    // RXSTAT flag is set
    des_enc28_readBuffer(packet, len);
}
else
{
    ...
}

我還會將此寄存器的值轉儲到日志或串行端口,以確保您了解其實際內容:

// I noticed serialprint in your other question, so I am presuming this is your log func
serialprint("PHSTAT2 = 0x%04x\n", PHSTAT2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM