6673|15

9720

帖子

24

TA的资源

版主

楼主
 

STM32F746G-DISCO 使用SOCKET客户端与电脑通信 [复制链接]

 

STM32F746G-DISCO 使用SOCKET客户端通过网络与电脑通信实验


MDK5提供了BSD Client for STM32F746G-Discovery的例程

打开MDK5Pack Installer

在右边选STM32F746

左边选择BSD Client STM32F746G-Discovery

Copy选择一个项目的保存路径点OK

我的MDK版本在创建项目后Network是红色的

编译提示Error #540: 'Keil.MDK-Pro::Network:CORE:Release:6.5.0' component is not available for target 'STM32F746 Flash', pack 'Keil.MDK-Middleware.6.5.0' is not selected

遇到这个问题打开”Select Software Packs for Target’STM32F746 Flash’窗口

在弹出的窗口里去掉”Use latest versions of all installed Software Packs”的勾选

展开Keil::MDK-Middleware去掉7.0.0-beta选择6.5.0

打开BSD_Client.c选择Configuration Wizard配置目标Socket服务器的IP和端口号

我的服务器IP设置了192.168.1.19端口1001

在官方的代码里有一个处理Socket的函数

/*----------------------------------------------------------------------------

  Thread 'Client': BSD Client socket process

 *---------------------------------------------------------------------------*/

static void Client (void const *arg) {

  SOCKADDR_IN addr;

  int sock, res;

  char dbuf[4];

  uint8_t p2val,lshf;

 

  while (1) {

    sock = socket (AF_INET, SOCKTYPE, 0);

 

    addr.sin_port      = htons(PORT_NUM);

    addr.sin_family    = PF_INET;

    addr.sin_addr.s_b1 = IP1;

    addr.sin_addr.s_b2 = IP2;

    addr.sin_addr.s_b3 = IP3;

    addr.sin_addr.s_b4 = IP4;

 

    connect (sock, (SOCKADDR *)&addr, sizeof (addr));

 

    lshf  = 1;

    p2val = 0x01;

    while (1) {

      // Shift the LEDs

      LED_SetOut (p2val);

      p2val = lshf ? (p2val << 1) : (p2val >> 1);

      if (p2val == 0x80) lshf = 0;

      if (p2val == 0x01) lshf = 1;

   

      // Send the data to LED Server.

      dbuf[0] = BLINKLED;

      dbuf[1] = p2val;

      res = send (sock, (char *)&dbuf, 2, 0);

      if (res < 0) {

        break;

      }

      osDelay (100 * SPEED);

    }

    closesocket (sock);

  }

}

原来的函数里没有实现Socket接收函数

为了不影响通信我建了两个线程,一个用于接收,一个用于发送

 

SOCKADDR_IN addr;

int sock, res = 0;

int startFlag = 0;

static void PrintResult(int result)

{          

    char * str = "                                                         ";

    char printStr[60];

    switch(res)

    {

        case BSD_ERROR:

            str =     "General Error";

            break;

        case BSD_ERROR_SOCKET:

            str =    "Invalid socket descriptor";

            break;

        case BSD_ERROR_PARAMETER:

            str =    "Invalid parameter";

            break;

        case BSD_ERROR_WOULDBLOCK:

            str =    "It would have blocked";

            break;

        case BSD_ERROR_NOMEMORY:

            str =    "Not enough memory in memory pool";

            break;

        case BSD_ERROR_CLOSED:

            str =    "Connection is closed or aborted";

            break;

        case BSD_ERROR_LOCKED:

            str =    "Socket is locked by another thread";

            break;

        case BSD_ERROR_TIMEOUT:

            str =    "Socket, Host Resolver timeout";

            break;

        case BSD_ERROR_INPROGRESS:

            str =    "Host Name resolving in progress";

            break;

        case BSD_ERROR_NONAME:

            str =    "Host Name not existing";

            break;

    }  

    strncpy(printStr,str,20);

    printStr[20] = '\0';

    GLCD_DrawString         (5*16, 6*24, (char*)printStr);

    strncpy(printStr,str+20,20);

    GLCD_DrawString         (5*16, 7*24, (char*)printStr);

   

}

//HOSTENT *gethostbyname (const char *name, int *err);

static void Recevice(void const *arg)

{

        char dbuf[50];

   

        while(1)

        {

                res = recv (sock, (char *)&dbuf, 50, 0);               

                GLCD_DrawString         (5*16, 5*24, (char*)dbuf);

                osDelay (100 * SPEED);

                PrintResult(res);

        }

}

static void Send(void const *arg)

{  

        char dbuf[50];

        uint16_t i;

   

        while (1) {

            sock = socket (AF_INET, SOCKTYPE, 0);

 

            addr.sin_port      = htons(PORT_NUM);

            addr.sin_family    = PF_INET;

            addr.sin_addr.s_b1 = IP1;

            addr.sin_addr.s_b2 = IP2;

            addr.sin_addr.s_b3 = IP3;

            addr.sin_addr.s_b4 = IP4;

 

            connect (sock, (SOCKADDR *)&addr, sizeof (addr));

            while(1)

            {

                    sprintf(dbuf,"STM32F746G-DISCO Send %d",i++);

                    res = send (sock, dbuf, strlen(dbuf), 0);

                    osDelay (100 * SPEED);

                    PrintResult(res);

                    if(res < 0)

                    {

                        break;

                    }

            }          

            closesocket (sock);

        }

}

/*----------------------------------------------------------------------------

  Thread 'Client': BSD Client socket process

 *---------------------------------------------------------------------------*/

static void Client (void const *arg) {

    {

    sock = socket (AF_INET, SOCKTYPE, 0);

 

    addr.sin_port      = htons(PORT_NUM);

    addr.sin_family    = PF_INET;

    addr.sin_addr.s_b1 = IP1;

    addr.sin_addr.s_b2 = IP2;

    addr.sin_addr.s_b3 = IP3;

    addr.sin_addr.s_b4 = IP4;

        osThreadCreate (osThread(Send), NULL);

        osThreadCreate (osThread(Recevice), NULL);

 

  }

}

 

代码写好后下载到开发板

然后编写C#上位机程序

using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading;

namespace SocketServer

{

    class Program

    {

        private static byte[] result = new byte[1024];

        private static int myProt = 1001;   //端口 

        static Socket serverSocket;

        static void Main(string[] args)

        {

            //服务器IP地址 

            IPAddress ip = IPAddress.Parse("192.168.1.19");

            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口 

            serverSocket.Listen(10);    //设定最多10个排队连接请求 

            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());

            //收发数据 

            int i = 0;

            Socket clientSocket = serverSocket.Accept();

            new Thread((ThreadStart)delegate

            {

                while (true)

                {

                    try

                    {

                        clientSocket.Send(Encoding.ASCII.GetBytes(String.Format("Server Send {0}\0", i++)));

                        //通过clientSocket接收数据 

                        int receiveNumber = clientSocket.Receive(result);

                        Console.WriteLine("接收客户端{0}消息:{1}", clientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));

                        Thread.Sleep(100);

                    }

                    catch (Exception ex)

                    {

                        Console.WriteLine(ex.Message);

                        clientSocket.Shutdown(SocketShutdown.Both);

                        clientSocket.Close();

                    }

                }

            }).Start();

            Console.ReadLine();

        }

    }

}

运行后的效果

上位机

 

此帖出自stm32/stm8论坛

最新回复

看懂了一点流层是一样的,LPC里的SOCKET通信用的RTL实时库  详情 回复 发表于 2017-8-13 11:06
点赞 关注(4)
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复
举报

293

帖子

1

TA的资源

纯净的硅(高级)

沙发
 
支持版主,多多分享F7应用哦。
网络相关的应用都不懂啊,看看
此帖出自stm32/stm8论坛
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
虾哥,f7的这个板子是不是有以太网的接口的呀。
此帖出自stm32/stm8论坛

点评

有啊,socket就是通过以太网接口和电脑通信的。  详情 回复 发表于 2016-3-18 08:57
 
 

回复

9720

帖子

24

TA的资源

版主

4
 
huaiqiao 发表于 2016-3-17 21:03
虾哥,f7的这个板子是不是有以太网的接口的呀。

有啊,socket就是通过以太网接口和电脑通信的。
此帖出自stm32/stm8论坛

点评

明白了哈。谢谢啦。  详情 回复 发表于 2016-3-18 09:03
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

5
 
littleshrimp 发表于 2016-3-18 08:57
有啊,socket就是通过以太网接口和电脑通信的。

明白了哈。谢谢啦。
此帖出自stm32/stm8论坛
 
 
 

回复

1228

帖子

0

TA的资源

纯净的硅(高级)

6
 
请问一下,我这例程怎么没法复制,老出现这个
此帖出自stm32/stm8论坛

点评

你在复制项目的时候 目标路径选择的哪儿?  详情 回复 发表于 2016-3-24 11:27
 
个人签名

喝最烈的酒,..DIY最实用的东西

 
 

回复

9720

帖子

24

TA的资源

版主

7
 
lidonglei1 发表于 2016-3-24 11:01
请问一下,我这例程怎么没法复制,老出现这个

你在复制项目的时候 目标路径选择的哪儿?
此帖出自stm32/stm8论坛

点评

e盘的根目录下,还试了一个e盘下的一个文件夹  详情 回复 发表于 2016-3-24 12:53
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

1228

帖子

0

TA的资源

纯净的硅(高级)

8
 
littleshrimp 发表于 2016-3-24 11:27
你在复制项目的时候 目标路径选择的哪儿?

e盘的根目录下,还试了一个e盘下的一个文件夹
此帖出自stm32/stm8论坛

点评

确定你的E盘是可写的硬盘 试着用管理员身份打开MDK试试 还是不行可以到MDK的安装目录下把工程复制出来 我的目录是D:\Keil5\ARM\Pack\Keil\STM32F7xx_DFP\2.2.0\MDK\Boards\ST\STM32F746G_Discovery\Middleware\Ne  详情 回复 发表于 2016-3-24 13:49
 
个人签名

喝最烈的酒,..DIY最实用的东西

 
 

回复

9720

帖子

24

TA的资源

版主

9
 
lidonglei1 发表于 2016-3-24 12:53
e盘的根目录下,还试了一个e盘下的一个文件夹

确定你的E盘是可写的硬盘
试着用管理员身份打开MDK试试
还是不行可以到MDK的安装目录下把工程复制出来
我的目录是D:\Keil5\ARM\Pack\Keil\STM32F7xx_DFP\2.2.0\MDK\Boards\ST\STM32F746G_Discovery\Middleware\Network\BSD_Client
记得复制好的工程要把只读属性去掉
此帖出自stm32/stm8论坛

点评

哦 明白了 谢谢  详情 回复 发表于 2016-3-24 13:51
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

1228

帖子

0

TA的资源

纯净的硅(高级)

10
 
littleshrimp 发表于 2016-3-24 13:49
确定你的E盘是可写的硬盘
试着用管理员身份打开MDK试试
还是不行可以到MDK的安装目录下把工程复制出来
...

哦 明白了 谢谢
此帖出自stm32/stm8论坛
 
个人签名

喝最烈的酒,..DIY最实用的东西

 
 

回复

542

帖子

71

TA的资源

纯净的硅(中级)

11
 
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

12
 
littleshrimp 发表于 2016-3-18 08:57
有啊,socket就是通过以太网接口和电脑通信的。

能教教我吗
此帖出自stm32/stm8论坛

点评

按照提示跑一下例程试试  详情 回复 发表于 2017-7-21 12:00
 
 
 

回复

9720

帖子

24

TA的资源

版主

13
 
江海度余生 发表于 2017-7-21 11:20
能教教我吗

按照提示跑一下例程试试
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

14
 
littleshrimp 发表于 2017-7-21 12:00
按照提示跑一下例程试试

我搞好了,不过是JAVA上位机和LPC的板子,STM32 还不会
此帖出自stm32/stm8论坛

点评

例程的代码很精简 你可以读一下 原理和lpc差不多的  详情 回复 发表于 2017-8-13 04:30
 
 
 

回复

9720

帖子

24

TA的资源

版主

15
 
江海度余生 发表于 2017-8-12 21:29
我搞好了,不过是JAVA上位机和LPC的板子,STM32 还不会

例程的代码很精简 你可以读一下 原理和lpc差不多的
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

16
 
littleshrimp 发表于 2017-8-13 04:30
例程的代码很精简 你可以读一下 原理和lpc差不多的

看懂了一点流层是一样的,LPC里的SOCKET通信用的RTL实时库
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表