This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28379D: 跑emif_w5300_tcp例程的时候,tcp调试工具显示收发数据都是正常的,但ccs上的expression中的变量值有问题。

Part Number: TMS320F28379D


tcp socket工具中连接成功,显示发送接收数据都是对的

ccs里的expression的值就是

串口打印出来的数据长度也是对的

  • 您好,

         图片看不清楚,如果收发正常,data_buf[]是否还存储其他数据,建议通过发送有规律的数据长度来检测data_buf[]显示。

          请参考CCS用户手册“7.4.3.2. Expressions View'

         7.1. Debug Overview — Code Composer Studio 12.8.0 Documentation

  • data_buf[]不存储其他数据,Expressions的显示别的例程的变量是没有问题的,但我跑这个w5300例程的时候,如果我在sockettool发送的数据是’1234‘,那expressions中显示data_buf的值就是2,0,4,0,0,...,0

  • 您好,

       理论上不应该。

      您在watch expression下的变量名type中右键选择number format下选择hex模式,看看数据是对的吗。

  • 还是不对

  • 您好,

         如果expression窗口下其他变量都正确, 建议您查一下data_buf[]的处理代码。

  • 代码中除了前面声明了全局变量:unsigned char data_buf[1500] = {0};,然后就只在main函数中一个while(1)循环里调用tcp_server函数把data_buf作为参数传进去了:tcp_server(1, TCP_SERVER_PORT, data_buf, 0);
    tcp_server函数:

    void tcp_server(SOCKET s, uint16_t port, \
        unsigned char *buf, uint16_t mode)
    {
        uint16_t len;
        char printf_buf[64] = {0};
    
        /* check the socket status */
        switch(getSn_SSR(s)) {
            case SOCK_ESTABLISHED://建立套接字
                /* establish a connection */
                if(getSn_IR(s) & Sn_IR_CON) {
                    memset(printf_buf, 0, sizeof(printf_buf));
                    sprintf(printf_buf, "%d : Connect OK\r\n", s);
                    SCI_writeCharArray(SCIA_BASE, (uint16_t *)printf_buf, sizeof(printf_buf));
    
                    setSn_IR(s, Sn_IR_CON);//设置与套接字s相关的中断请求状态寄存器(Sn_IR)的值
                }
                /* receive the data and send back */
                if((len = getSn_RX_RSR(s)) > 0) {//获取套接字s的接收缓冲区中当前(剩余)可读取数据的字节数
                    len = recv(s, buf, len);//从套接字s接收数据到缓冲区buf中,返回实际接收到的数据长度
    
                    memset(printf_buf, 0, sizeof(printf_buf));
                    sprintf(printf_buf, "%d : Received %uBytes\r\n", s, len);
                    SCI_writeCharArray(SCIA_BASE, (uint16_t *)printf_buf, sizeof(printf_buf));
    
                    if(len !=send(s, buf, len)) {
                        memset(printf_buf, 0, sizeof(printf_buf));
                        sprintf(printf_buf, "%d : Send Fail.len=%d\r\n", s, len);
                        SCI_writeCharArray(SCIA_BASE, (uint16_t *)printf_buf, sizeof(printf_buf));
                    }
                }
                break;
    
            case SOCK_CLOSE_WAIT:
                /* disconnect */
                disconnect(s);
                break;
    
            case SOCK_CLOSED:
                /* close the socket and open it again */
                close(s);
                socket(s, Sn_MR_TCP, port, mode);
                break;
    
            case SOCK_INIT:
                /* listen the tcp client connection requests */
                listen(s);
    
                memset(printf_buf, 0, sizeof(printf_buf));
                sprintf(printf_buf, "%d : LOOPBACK_TCPS(%d) Started.\r\n", s, port);
                SCI_writeCharArray(SCIA_BASE, (uint16_t *)printf_buf, sizeof(printf_buf));
                break;
    
            default:
                break;
        }
    }

  • 您好,

          不好意思,串口输出printf_buf内容,printf_buf和buf在哪儿进行数据交互了?

          

  • 这个print_buf只是一个打印提示,跟buf没有关系。

    我觉得问题可能出在w5300.c文件中的wiz_read_buf函数中,读取数据的for循环里面是十六位的,但参数显示buf是8位的,而且为什么每次要+2

  • 您好,

    这个print_buf只是一个打印提示,跟buf没有关系。

          所以是无法证明buf接收的就是正确的数据。

          关于代码问题,已经和本贴最初讨论的expression窗口显示问题无关了。

          代码中,(uint16 *) 强制进行了类型转换,我猜想IINCHIP_READ()函数返回的是2字节数。

          如有更多关于代码调试问题,请重新发帖,专题讨论。