芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 7529|回复: 1

【设计实例】基于SoC FPGA的Linux UDP图像发送。

[复制链接]
  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 419

    主题

    771

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    15810
    QQ
    发表于 2019-4-20 20:54:38 | 显示全部楼层 |阅读模式
    如果您还没有注册本论坛,将无法下载论坛中附件,但是注册论坛非常简单,使用微   信 扫码即可注册。
    也可以在小梅哥任意一个Q群内直接索取邀请码使用邀请码注册,小梅哥创建的任意一个群都可以。


    以下代码为基本的Linux 使用UDP发送两个文件的图像数据到远端(192.168.0.106:6000)的程序,使用时,在DS-5或GCC下交叉编译得到可执行文件,然后拷贝到SoC 开发板中,同时,需要把附件的两bin格式图像二进制文件也拷贝到程序所在目录,然后执行,开发板就能不断的发送这两幅图像的数据到远端了。
    图像源文件.rar (336.53 KB, 下载次数: 418)
    需要注意的是,为了保证发送成功:
    开发板的IP也需要设置为192.168.0.网段,比如设置为192.168.0.2
    电脑的IP地址需要设置为192.168.0.168
    图像接收软件的几个参数要与实际网络参数匹配(图像软件见下述附件)
    图像软件.jpg
    小梅哥UDP摄像头V2.rar (25.96 KB, 下载次数: 395)
    如果图像软件运行失败,提示找不到mfcxxx.dll,请安装运行环境,百度下载 vcredist_x86安装就可以了
    图像.jpg

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <unistd.h>
    4. #include <fcntl.h>
    5. #include <sys/mman.h>
    6. #include <sys/types.h>
    7. #include <dirent.h>
    8. #include <inttypes.h>
    9. #include <sys/time.h>
    10. #include <stdbool.h>
    11. #include <pthread.h>
    12. #include <sys/ioctl.h>
    13. #include "math.h"
    14. #include <string.h>

    15. #include <linux/fb.h>

    16. #include <sys/socket.h>
    17. #include <netinet/in.h>
    18. #include <arpa/inet.h>
    19. #include <netdb.h>

    20. #include <signal.h>

    21. char* ReadBmpFile(const char* szFile)
    22. {
    23.         FILE* fTmp = fopen(szFile, "rb");
    24.         if (fTmp == NULL) return NULL;

    25.         fseek(fTmp, 0, SEEK_END);
    26.         int nLen = ftell(fTmp);
    27.         if (nLen <= 0)
    28.         {
    29.                 fclose(fTmp);
    30.                 return NULL;
    31.         }

    32.         char* szContent = (char*)malloc(nLen + 1);
    33.         memset(szContent, 0, nLen + 1);
    34.         fseek(fTmp, 0, SEEK_SET);
    35.         char szTmp[1024] = { 0 };
    36.         int nHaveRead = 0;
    37.         while (!feof(fTmp))
    38.         {
    39.                 int nRead = fread(szTmp, 1, 1024, fTmp);
    40.                 if (nRead <= 0) break;

    41.                 memcpy(szContent + nHaveRead, szTmp, nRead);
    42.                 nHaveRead += nRead;
    43.         }
    44.         fclose(fTmp);

    45.         return szContent;
    46. }

    47. unsigned char STOP = 0;

    48. void signalFunc(int _signal)
    49. {
    50.         STOP = 1;
    51. }

    52. int main(int argc, char ** argv) {

    53.         signal(SIGINT, signalFunc);
    54.         signal(SIGTERM, signalFunc);

    55.         int nX = 640;
    56.         int nY = 480;
    57.         char* szBmp1 = ReadBmpFile("640_480_01.bin");
    58.         if (NULL == szBmp1)
    59.         {
    60.                 printf("read bmp file 1 error!");
    61.                 return 0;
    62.         }
    63.         char* szBmp2 = ReadBmpFile("640_480_02.bin");
    64.         if (NULL == szBmp2)
    65.         {
    66.                 printf("read bmp file 2 error!");
    67.                 return 0;
    68.         }

    69.         int retval;

    70.     char buf[2048];
    71.     int socket_descriptor; //套接口描述字
    72.         struct sockaddr_in address;//处理网络通信的地址
    73.         int port=6000;
    74.         bzero(&address,sizeof(address));
    75.         address.sin_family=AF_INET;
    76.         address.sin_addr.s_addr=inet_addr("192.168.0.106");//这里不一样
    77.         address.sin_port=htons(port);
    78.     unsigned char *p;
    79.         //创建一个 UDP socket

    80.         socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);//IPV4  SOCK_DGRAM 数据报套接字(UDP协议)

    81.         int rbufsz = 5 * 1024 * 1024; //5M
    82.         setsockopt(socket_descriptor, SOL_SOCKET, SO_RCVBUF, &rbufsz, sizeof(rbufsz));
    83.         int wbufsz = 5 * 1024 * 1024; //5M
    84.         setsockopt(socket_descriptor, SOL_SOCKET, SO_SNDBUF, &wbufsz, sizeof(wbufsz));

    85.         int maxfdp;
    86.         fd_set fds;
    87.         fd_set fdsErr;
    88.     struct timeval timeout = {1, 0};//设置select等待3秒,3秒轮询,非阻塞就置0
    89.         int nSendFile = 0;
    90.         long iter = 0;

    91.     connect(socket_descriptor, (struct sockaddr *)&address,sizeof(address));

    92.         while (!STOP)
    93.         {

    94.             FD_ZERO(&fds);//每次循环都要清空集合,否则不能检测描述符变化
    95.                 FD_SET(socket_descriptor, &fds);//添加描述符
    96.                 //FD_ZERO(&fdsErr);//每次循环都要清空集合,否则不能检测描述符变化
    97.                 //FD_SET(socket_descriptor, &fdsErr);//添加描述符
    98.             maxfdp = socket_descriptor + 1;//描述符最大值加1
    99.            // printf("1\n");
    100.             retval = select(maxfdp, NULL, &fds, NULL, &timeout);
    101.                 if (retval <= 0)
    102.                 {
    103.                         //usleep(1000);
    104.                         continue;
    105.                 }
    106.                 p = (unsigned char *)((nSendFile == 0) ? szBmp1 : szBmp2);

    107.                 buf[1]=iter >> 8;
    108.                 buf[0]=iter & 0xff;
    109.                 //memcpy(&buf[2],p,1280);
    110.                 memcpy(&buf[2], p + iter * 1280, 1280);

    111.             if(FD_ISSET(socket_descriptor,&fds))//测试skt是否可写,即网络上是否有数据
    112.             {
    113.                 retval = write(socket_descriptor, buf, 1282);
    114.                 if(retval < 0){
    115.                     perror("sendto error: ");
    116.                     exit(1);
    117.                 }
    118.             }

    119.                 iter++;

    120.                 if (iter > nY - 1)
    121.                 {
    122.                         iter = 0;
    123.                         nSendFile = (nSendFile + 1) % 2;
    124.                         //usleep(1000);
    125.                 }
    126.         }
    127.         free(szBmp1);
    128.         free(szBmp2);
    129.         printf("app exit\n");

    130. }


    复制代码

    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    30

    积分

    新手上路

    Rank: 2

    积分
    30
    发表于 2020-4-30 18:24:55 | 显示全部楼层
    请问小梅哥有完整的工程吗,我不知道怎么在qsys中配置以太网,能发一份原工程吗
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-3-29 18:17 , Processed in 0.150893 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表