硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1831|回复: 16
收起左侧

TCP服务器提示错误

[复制链接]

12

主题

36

回帖

72

积分

初级会员

积分
72
发表于 2018-1-26 11:25:06 | 显示全部楼层 |阅读模式
使用F429+RL-TCPnet+emwin做TCP服务器时,串口提示以下错误,请教下是什么意思吗? 微信图片_20180126112109.jpg

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-1-26 11:46:53 | 显示全部楼层
数据接收异常。

另外,以后楼主的所有F429相关问题,我们统一都在这个帖子里面讨论,无需再开新帖子。
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-1-26 15:30:26 | 显示全部楼层
本帖最后由 dandelion 于 2018-1-26 15:46 编辑
eric2013 发表于 2018-1-26 11:46
数据接收异常。

另外,以后楼主的所有F429相关问题,我们统一都在这个帖子里面讨论,无需再开新帖子。

根据教程,用BSD Socket编程客户端和服务器,
客户端会提示-4: SCK_EWOULDBLOCK   It would have blocked.。这个提示的意思是函数 recv 要进入阻塞态,而此函数是工作在非阻塞方式。我并没有设置工作在非阻塞。
服务器会在用recv接收时会提示-8: SCK_ETIMEOUT      Socket, Host Resolver timeout ,超时。还有TCP-ERR: Socket 1, No Retries left;没有实例?
单独每一个和电脑连接数据都行,但是两个板子连到路由器上通信就出现上面这个问题

有点没明白

回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-1-27 16:57:55 | 显示全部楼层
本帖最后由 dandelion 于 2018-1-27 17:21 编辑

RL-TCPnet设置本地IP都是通过NetConfig进行设置的,有没有函数可以设置IP地址?void init_ethernet (void) 什么时候调用呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-1-28 00:02:14 | 显示全部楼层
dandelion 发表于 2018-1-27 16:57
RL-TCPnet设置本地IP都是通过NetConfig进行设置的,有没有函数可以设置IP地址?void init_ethernet (void)  ...

可以的。看这里
QQ截图20180128000312.jpg
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-1-28 19:35:47 | 显示全部楼层
TCP-ERR Map_Socket, No Listen Socket found

没有可用监听口?我设置的listen口是1,而且没有连接上。按照教程说法,没有连接上的话accept是阻塞的,那应该是一直有口用的呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-1-29 00:38:08 | 显示全部楼层
dandelion 发表于 2018-1-28 19:35
TCP-ERR Map_Socket, No Listen Socket found

没有可用监听口?我设置的listen口是1,而且没有连接上。 ...

建议先调试配套的例子,能用了,在你现在的工程上面创建个任务,搞进去跑下,这样容易排查问题。
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-1-29 17:52:11 | 显示全部楼层
eric2013 发表于 2018-1-29 00:38
建议先调试配套的例子,能用了,在你现在的工程上面创建个任务,搞进去跑下,这样容易排查问题。

根据手册来看,ESP8266最多只支持5条连接吗?

有AD7606数据采集模块的资料吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-1-29 17:53:17 | 显示全部楼层
dandelion 发表于 2018-1-29 17:52
根据手册来看,ESP8266最多只支持5条连接吗?

有AD7606数据采集模块的资料吗?

8266没用过。
7606这里:http://www.armbbs.cn/forum.php?mod=viewthread&tid=37480
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-1-29 21:37:43 | 显示全部楼层
eric2013 发表于 2018-1-29 17:53
8266没用过。
7606这里:http://www.armbbs.cn/forum.php?mod=viewthread&tid=37480

QQ截图20180129213207.png
这个代码里的CPU ID检测,其中0x1FFF7A10是哪里的地址?根据注释在参考手册里找到的地址也不是这个啊 QQ截图20180129213233.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-1-30 00:35:04 | 显示全部楼层
dandelion 发表于 2018-1-29 21:37
这个代码里的CPU ID检测,其中0x1FFF7A10是哪里的地址?根据注释在参考手册里找到的地址也不是这个啊

QQ截图20180130003412.jpg
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-2-2 11:51:53 | 显示全部楼层
本帖最后由 dandelion 于 2018-2-2 11:53 编辑

管理员,你好!现在用RL-TCPnet在F429上用BSD Socekt 做了两个TCP客户端任务,一个TCP服务端任务。优先级都一样,用了时间片轮转,时间为5ms。
目前:
1.两个客户端都能连接上服务器,但是连接上之后,只有一个客户端能够发送数据,另一个客户端无法发送数据。
2.电脑上的客户端第一次连接上单片机的TCP服务器时,无法发送数据,第二次连接上时,两个单片机上的客户端任务都能够发送接收数据,服务器任务也正常了。
3.客户端在调用connect连接服务器时,工作在阻塞模式,等待通信建立,若服务器不存在则会立即返回。我的服务器IP存在,但是没开启,这时候connect应该是处于阻塞模式吧?会不断重连?重连次数和时间是否是Net_Config.c文件下TCP Sockets配置的Number of Retries和Retry Timeout in seconds?下面这个是我的客户端和服务端程序
void Client_TCPnet(uint8_t IP1, uint8_t IP2, uint8_t IP3, uint8_t IP4, uint16_t serverPort)
{
        int sock, result, recvlen;
        unsigned long sck_mode;
        SOCKADDR_IN remoteaddr;
        char DataBuffer[512];
        char ClientCmdBuffer[64];
        char ClientDataBuffer[512];
        OS_ERR                 err;
        CPU_TS                 ts;
        OS_FLAGS         xResult;
        const uint16_t usMaxBlockTime = 2; /* 延迟周期 */

        while(1)
        {
                sock = socket(AF_INET, SOCK_STREAM, 0);

                sck_mode = 1;

                result = ioctlsocket(sock, FIO_KEEP_ALIVE, &sck_mode);
                if(result == SCK_SUCCESS)
                {
                        printf_debug("KEEP_ALIVE 设置成功\r\n");
                }
                else
                {
                        printf_debug("KEEP_ALIVE 设置失败\r\n");
                }
                /* 端口号设置*/
                remoteaddr.sin_port = htons(serverPort);
               

                remoteaddr.sin_family = PF_INET;
               
                remoteaddr.sin_addr.s_b1 = IP1;
                remoteaddr.sin_addr.s_b2 = IP2;
                remoteaddr.sin_addr.s_b3 = IP3;
                remoteaddr.sin_addr.s_b4 = IP4;
                /* 客户端连接服务器,若远程服务器还未创建,此函数会立即返回 */
                result = connect (sock, (SOCKADDR *)&remoteaddr, sizeof (remoteaddr));
                printf_debug("客户端连接远程服务器,状态为%s\r\n", ReVal_Table[abs(result)]);
//                if(result == SCK_ECLOSED)
//                {
//                        closesocket(sock);
//                }
//                else
                {
                        while(1)
                        {
                                //上传的是数据,接收到的是命令
                                memset(ClientDataBuffer, '\0', sizeof(ClientDataBuffer));
                                OSMutexPend((OS_MUTEX  *)&BrokenDataMutex,
                                                                  (OS_TICK        )0u,
                                                                  (OS_OPT        )OS_OPT_PEND_BLOCKING,
                                                                  (CPU_TS  *)0,
                                                                  (OS_ERR  *)&err);
                                                               
                                BrokenData_to_String(ClientDataBuffer, s_BrokenData,1);
                                (void)OSMutexPost((OS_MUTEX  *)&BrokenDataMutex,
                                                                 (OS_OPT   )OS_OPT_POST_1,
                                                                 (OS_ERR  *)&err);
                                printf_debug(" 客户任务将上传数据:%s\r\n",ClientDataBuffer);                                                                 
                                result = send (sock, (char *)ClientDataBuffer, strlen(ClientDataBuffer), 0);
                                if (result < 0)
                                {
                                        printf_debug("客户端发送数据失败%s\r\n", ReVal_Table[abs(result)]);
                                        if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
                                        {
                                                break;        
                                        }
                                }
                                else
                                {
                                        printf_debug("客户端发送数据成功 = %d字节\r\n", result);                                                        
                                }
                                memset(ClientCmdBuffer, '\0', sizeof(ClientCmdBuffer));
                                result = recv (sock, ClientCmdBuffer, sizeof(ClientCmdBuffer), MSG_DONTWAIT);
                                if (result <= 0)
                                {
                                        printf_debug("客户端接收函数返回状态%s\r\n", ReVal_Table[abs(result)]);
        //                                break;        
                                        if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
                                        {
                                                break;        
                                        }

                                }
                                else
                                {
                                        printf_debug("客户端接受到数据,长度为 %d 字节\r\n", result);
                                        printf_debug("客户端接受到数据 %s\r\n", ClientCmdBuffer);
                                        OSMutexPend((OS_MUTEX  *)&CmdDataMutex,
                                                                          (OS_TICK        )0u,
                                                                          (OS_OPT        )OS_OPT_PEND_BLOCKING,
                                                                          (CPU_TS  *)0,
                                                                          (OS_ERR  *)&err);
                                        Cmdparse(ClientCmdBuffer, s_ControlCmd);
                                        (void)OSMutexPost((OS_MUTEX  *)&CmdDataMutex,
                                                                 (OS_OPT   )OS_OPT_POST_1,
                                                                 (OS_ERR  *)&err);        
                                        OSFlagPost ((OS_FLAG_GRP  *)&Sync_Data_Group,
                                                                        (OS_FLAGS           )CLOSEBALLASTSYNC,  
                                                                        (OS_OPT            )OS_OPT_POST_FLAG_SET,
                                                                        (OS_ERR           *)&err);

                                }                        
                                OSTimeDlyHMSM(0u, 0u, 1u, 0u ,OS_OPT_TIME_HMSM_STRICT,&err);
                        }        
                        closesocket (sock);
                }
                OSTimeDlyHMSM(0u, 0u, 1u, 0u ,OS_OPT_TIME_HMSM_STRICT,&err);
        }
}
/*
*********************************************************************************************************
*        函 数 名: Server_TCPnet
*        功能说明: 服务器时使用
*        形    参: localPort: 服务器端口号
*        返 回 值: 无
*********************************************************************************************************
*/
void Server_TCPnet(uint16_t localPort)
{
        char DataBuffer[512];
        char ServerDataBuffer[512];
        char ServerCmdBuffer[64];

        OS_ERR                 err;
        CPU_TS                 ts;
        OS_FLAGS         xResult;
        const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
        uint32_t recvlen;
        
        int len;
        int listensock, acceptsock, result;
        SOCKADDR_IN localaddr,remoteaddr;
        
        uint8_t recvMachineNum = MACHINENUMA;

        while(1)
        {
                listensock = socket(AF_INET, SOCK_STREAM, 0);

                localaddr.sin_port = htons(localPort);
                localaddr.sin_family = PF_INET;
                localaddr.sin_addr.s_addr = INADDR_ANY;

                bind(listensock, (SOCKADDR *)&localaddr, sizeof(localaddr));

                listen(listensock,1);

                len = sizeof(remoteaddr);

                acceptsock = accept(listensock, (SOCKADDR *)&remoteaddr, &len);
                printf_debug("acceptsock = %d\r\n",acceptsock);
                printf_debug ("远程客户端请求连接服务器,客户端IP: %d.%d.%d.%d\n", remoteaddr.sin_addr.s_b1,
                                                             remoteaddr.sin_addr.s_b2,
                                                                                                                         remoteaddr.sin_addr.s_b3,
                                                             remoteaddr.sin_addr.s_b4);
                printf_debug ("远程客户端端口号: %d\n", ntohs(remoteaddr.sin_port));
                recvMachineNum = (remoteaddr.sin_addr.s_b4) % 10;//当前是哪个机子的数据发送过来
                closesocket (listensock);
                //传给显示屏的是数据,收到的是命令
                while(1)
                {
                        memset(DataBuffer, '\0', strlen(DataBuffer));
                        result = recv(acceptsock, DataBuffer,sizeof(DataBuffer), MSG_DONTWAIT);
//                        if((result <= 0)&&(result != -4))
                        if((result <= 0))
                        {
//                                printf_debug("退出服务器接收函数,重新开始监听%s\r\n",ReVal_Table[abs(result)]);
                                if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
                                {
                                        break;        
                                }

                        }
                        else
                        {
                                memset(ServerDataBuffer, '\0', strlen(ServerDataBuffer));
                                printf_debug("服务器接收到数据,长度为 %d 字节\r\n",result);
//                                OSMutexPend((OS_MUTEX  *)&ServerRecvMutex,
//                                                                  (OS_TICK  )0u,
//                                                                  (OS_OPT   )OS_OPT_PEND_BLOCKING,
//                                                                  (CPU_TS  *)0,
//                                                                  (OS_ERR  *)&err);
                                recvlen = judge_buffer(DataBuffer, ServerDataBuffer);

//                                (void)OSMutexPost((OS_MUTEX  *)&ServerRecvMutex,
//                                                         (OS_OPT   )OS_OPT_POST_1,
//                                                         (OS_ERR  *)&err);                                                
                                if(recvlen != 0)
                                {
                                        printf_debug("服务器收到数据:%s\r\n",ServerDataBuffer);
                                        OSMutexPend((OS_MUTEX  *)&BrokenDataMutex,
                                                                  (OS_TICK        )0u,
                                                                  (OS_OPT        )OS_OPT_PEND_BLOCKING,
                                                                  (CPU_TS  *)0,
                                                                  (OS_ERR  *)&err);
                                        //将收到的数据转换为sBroType格式
                                        buffer_to_BrokenData(ServerDataBuffer, s_BrokenData, recvMachineNum);
                                        (void)OSMutexPost((OS_MUTEX  *)&BrokenDataMutex,
                                                                 (OS_OPT   )OS_OPT_POST_1,
                                                                 (OS_ERR  *)&err);                        
                                }                                                               
                        }

                        xResult = OSFlagPend ((OS_FLAG_GRP        *)&Sync_Data_Group,
                                                                  (OS_FLAGS          )CLOSEBALLASTSYNC,
                                                                  (OS_TICK                 )usMaxBlockTime,
                                                                  (OS_OPT                 )OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME,
                                                                  (CPU_TS                *)&ts,
                                                                  (OS_ERR                *)&err);
                        if((err == OS_ERR_NONE) )
                        {
                                memset(ServerCmdBuffer, '\0', strlen(ServerCmdBuffer));
                                OSMutexPend((OS_MUTEX  *)&CmdDataMutex,
                                                  (OS_TICK        )0u,
                                                  (OS_OPT        )OS_OPT_PEND_BLOCKING,
                                                  (CPU_TS  *)0,
                                                  (OS_ERR  *)&err);
                                Cmdencode(ServerCmdBuffer, s_ControlCmd);
                                (void)OSMutexPost((OS_MUTEX  *)&CmdDataMutex,
                                                         (OS_OPT   )OS_OPT_POST_1,
                                                         (OS_ERR  *)&err);        
                                printf_debug("服务器下发命令:%s\r\n",ServerCmdBuffer);

                                result = send (acceptsock, (char *)ServerCmdBuffer, strlen(ServerCmdBuffer), 0);
                                if (result < 0)
                                {
                                        printf_debug("服务器发送数据失败%s\r\n", ReVal_Table[abs(result)]);
                                        if((result == SCK_EINVALID) || (result == SCK_ECLOSED))
                                        {
                                                break;        
                                        }
                                }
                                else
                                {
                                        printf_debug("服务器发送数据成功 = %d字节\r\n", result);                                                        
                                }

                        }
                        OSTimeDlyHMSM(0u, 0u, 0u, 200u ,OS_OPT_TIME_HMSM_STRICT,&err);
                }
                closesocket (acceptsock);
                //OSTimeDlyHMSM(0u, 4u, 0u, 00u ,OS_OPT_TIME_HMSM_STRICT,&err);
        }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-2-2 11:56:27 | 显示全部楼层
dandelion 发表于 2018-2-2 11:51
管理员,你好!现在用RL-TCPnet在F429上用BSD Socekt 做了两个TCP客户端任务,一个TCP服务端任务。优先级都 ...

这个你自己多花点时间测试下吧,最近年底了手头事情太多,二代示波器要发布,忙的焦头烂额,非常抱歉
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-2-6 15:56:36 | 显示全部楼层
管理员,你好,我看了下DM9161的原理图,其中有PHY_1.8V的电源,但是我看了原理图,并没有这个电源,这个是HR911105A提供的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-2-7 01:24:52 | 显示全部楼层
dandelion 发表于 2018-2-6 15:56
管理员,你好,我看了下DM9161的原理图,其中有PHY_1.8V的电源,但是我看了原理图,并没有这个电源,这个是 ...

PHY芯片自己产生的。
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
 楼主| 发表于 2018-2-7 20:52:55 | 显示全部楼层
管理员,你好,我想请问下CAN总线部分内容。看到有些地方说CAN总线通信要加光耦隔离,F429的CAN芯片需要加光耦隔离吗?SN65HVD230,这个芯片。如果需要加隔离的话有没有什么推荐的芯片?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107144
QQ
发表于 2018-2-8 02:06:55 | 显示全部楼层
dandelion 发表于 2018-2-7 20:52
管理员,你好,我想请问下CAN总线部分内容。看到有些地方说CAN总线通信要加光耦隔离,F429的CAN芯片需要加 ...

这个是CNA的PHY芯片,没有带隔离。隔离的话,可以到TI的官网看看,比较多。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 11:02 , Processed in 0.370806 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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