首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在STM32F3中使用MODBUS?

如何在STM32F3中使用MODBUS?
EN

Stack Overflow用户
提问于 2018-12-06 07:03:58
回答 1查看 1.2K关注 0票数 2

由于进行了大量的研究,我找到了STM32f1 this l墨水的源代码,并将其更改为STM32f3。以及构建并安装到我的STM32上。我的以太网电缆连接在我的计算机和enc28j60模块之间。如果我在main.c和while循环中调试这段代码,代码堆栈:

代码语言:javascript
复制
  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在无符号int enc28j60_packet_receive(无符号字符*包,无符号int maxlen)函数中:

代码语言:javascript
复制
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?我什么都不了解。

EN

回答 1

Stack Overflow用户

发布于 2018-12-20 09:14:26

根据ENC28J60数据表的说法,RXSTAT标志应该在第12位:

我不太确定des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0)是否读得对,但我认为您应该有如下内容:

代码语言:javascript
复制
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
{
    ...
}

我还会将此寄存器的值转储到日志或串行端口,以确保您了解它的实际内容:

代码语言:javascript
复制
// I noticed serialprint in your other question, so I am presuming this is your log func
serialprint("PHSTAT2 = 0x%04x\n", PHSTAT2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53646174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档