[STM32F7]

子网掩码的问题

[复制链接]
975|13
手机看帖
扫描二维码
随时随地手机跟帖
Cjy_JDxy|  楼主 | 2019-4-12 17:22 | 显示全部楼层 |阅读模式
我用STM32F767做试验机,用到网口。
买了一个开发板,例程里的网口例子是需要知道电脑的IP地址。
老板说不行,最好是直接连。我搞不了,折中了一下,只要知道
在哪个网段就可以了。我试了一下,搞好了。
我是这样搞的:
//lwip 默认IP设置
//lwipx:lwip控制结构体指针
void lwip_comm_default_ip_set(__lwip_dev *lwipx)
{
        u32 sn0;
        sn0=*(vu32*)(0x1FF0F420);//获取STM32的唯一ID的前24位作为MAC地址后三字节
        //默认远端IP为:192.168.1.100

        lwipx->remoteip[0]=169;       
        lwipx->remoteip[1]=254;
        lwipx->remoteip[2]=255;
        lwipx->remoteip[3]=255;
       
        //MAC地址设置(高三字节固定为:2.0.0,低三字节用STM32唯一ID)
        lwipx->mac[0]=2;//高三字节(IEEE称之为组织唯一ID,OUI)地址固定为:2.0.0
        lwipx->mac[1]=0;
        lwipx->mac[2]=0;
        lwipx->mac[3]=(sn0>>16)&0XFF;//低三字节用STM32的唯一ID
        lwipx->mac[4]=(sn0>>8)&0XFFF;
        lwipx->mac[5]=sn0&0XFF;

        lwipx->ip[0]=169;       
        lwipx->ip[1]=254;
        lwipx->ip[2]=62;
        lwipx->ip[3]=30;

        //默认子网掩码:255.255.255.0
        lwipx->netmask[0]=255;       
        lwipx->netmask[1]=255;
        lwipx->netmask[2]=0;
        lwipx->netmask[3]=0;
        //默认网关:192.168.1.1

        lwipx->gateway[0]=169;       
        lwipx->gateway[1]=254;
        lwipx->gateway[2]=62;

        lwipx->gateway[3]=1;
        lwipx->dhcpstatus=0;//没有DHCP       
}

以上是下位机IP地址设置代码。
SckServer.Protocol = sckUDPProtocol


With SckServer
.RemoteHost = "169.254.255.255"
.RemotePort = 50000
.LocalPort = 50000
.Bind 50000

End With

这是上位机用VB编写的网口初始化代码。
1.jpg

这是电脑IP地址设置。这样的话,可以不需要知道电脑IP地址。
可是需要把电脑的子网掩码设成255.255.0.0。
老板说不行,我觉得也不妥。
那如果把电脑的子网掩码改成255.255.255.0,
就意味着下位机的子网掩码也要改成255.255.255.0.
可是这样网口连接不上。
请问高手,还应该怎么设置才能让网口通讯正常呢?谢谢!



使用特权

评论回复
Cjy_JDxy|  楼主 | 2019-4-14 11:29 | 显示全部楼层
自己顶一个

使用特权

评论回复
嵌磨| | 2019-4-15 16:42 | 显示全部楼层
你的板子带网口,直接直连,使你的电脑和你写的程序的Ip地址处于同一个网段,直接ping程序里面的Ip

使用特权

评论回复
评论
li880wert 2019-4-15 17:07 回复TA
你根本没看到人家意思 
li880wert| | 2019-4-15 17:09 | 显示全部楼层
UDP 可以不用知道电脑端地址,可以根据电脑端发送过来的数据包,找到对方的IP 和端口,

使用特权

评论回复
Cjy_JDxy|  楼主 | 2019-4-15 18:53 | 显示全部楼层
li880wert 发表于 2019-4-15 17:09
UDP 可以不用知道电脑端地址,可以根据电脑端发送过来的数据包,找到对方的IP 和端口, ...

谢谢!有没有具体的代码呢?我对这块不熟。

使用特权

评论回复
characteristic| | 2019-4-15 21:39 | 显示全部楼层
没做过这方面的应用,一起学习下

使用特权

评论回复
huangcunxiake| | 2019-4-15 21:59 | 显示全部楼层
还要懂这个吗,官方的例子里有没有这么搞的,不是都在一个网段就行了吗

使用特权

评论回复
21mengnan| | 2019-4-16 11:46 | 显示全部楼层
、子网掩码的作用

在设置电脑IP时,会碰到两个重要的参数,一个是IP地址,一个是子网掩码。IP地址是互联网上每个子网或每个主机在网络上的唯一身份标签,那子网掩码是干什么用的呢?

随着互联网的发展,越来越多的网络产生,有的网络多则几百台主机,少则区区几台,这样就浪费了大量的IP地址,所以要划分子网。为了有序地区分和管理不同的子网,就需要使用子网掩码。

子网掩码是一种用来指明一个IP地址所标示的主机处于哪个子网中。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

2、子网掩码的用法

子网掩码是一个32位地址,对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。

子网掩码通常有十进制和二级制两种表现形式,255.255.0.0用二进制表示则为1111111.11111111.00000000.00000000,其中,前面2个字节的16位“1”表示网络号,后面2个字节的16位“0”表示主机号。

当配合IP地址172.20.0.4使用时,则表示该IP地址是B类地址,172.20是网络标识,0.4是主机标识。也即子网掩码AND IP地址的部分是网络标识,子网掩码取反后AND IP地址的部分即为主机标识。

子网掩码有两个特殊地址,当子网掩码的主机地址全为0时,表示该网络地址,当子网掩码的主机地址全为1时,表示该网络的广播地址。

 

例1 不同子网下的主机能否直接通信

假设两个IP地址分别是172.20.0.18和172.20.1.16,子网掩码都是255.255.255.0。

我们可以知道两者的网络标识分别是172.20.0和172.20.1,无法直接通信,也就无法PING通。要想能相互通信,需要将子网掩码改成255.255.0.0。

 

例2 如何确定子网掩码

1)将主机数目转化为二进制来表示,总位数是N;

2)将掩码地址全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。

如欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台:

1)700=1010111100,该二进制为十位数,N = 10

2)将子网掩码255.255.255.255从后向前的10位全部置0,即为: 11111111.11111111.11111100.00000000,也即255.255.252.0。

255.255.252.0就是168.195.0.0的700台主机的子网掩码了。



例3 如何理解172.20.1.0/26

上文中的26代表主机ID的掩码地址长度,从前往后有26位,即子网掩码的地址是255.255.255.192。

使用特权

评论回复
heimaojingzhang| | 2019-5-6 10:32 | 显示全部楼层
路过 学习了

使用特权

评论回复
keaibukelian| | 2019-5-6 10:36 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
labasi| | 2019-5-6 10:42 | 显示全部楼层
感谢楼主分享经验

使用特权

评论回复
paotangsan| | 2019-5-6 10:46 | 显示全部楼层
对网络这块一窍不通啊

使用特权

评论回复
renzheshengui| | 2019-5-6 10:52 | 显示全部楼层
有所学习 呵呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3520

帖子

19

粉丝