Microchip,通用TCP服务器



我是Microchip系列的新手,我目前正在使用PIC32以太网启动器套件2与Harmony的通用TCPIP伺服演示合作。我可以将应用程序加载到芯片上,并使用telnet登录。如果我输入" H",我也可以看到它可以正常工作。因为在此演示中,它在上面延伸了一条touper线。我想尝试的是在telnet中键入" Hello",然后将其发送回" World",只是让我滚动的一些简单的东西。以下是读取传入数据的当前代码部分,将其转换为upper并将其发送回去。

case APP_TCPIP_SERVING_CONNECTION:
    {
        if (!TCPIP_TCP_IsConnected(appData.socket))
        {
            appData.state = APP_TCPIP_CLOSING_CONNECTION;
            SYS_CONSOLE_MESSAGE("Connection was closedrn");
            break;
        }
        int16_t wMaxGet, wMaxPut, wCurrentChunk;
        uint16_t w, w2;
        uint8_t AppBuffer[32];
        //uint8_t AppBuffer2[] = "This is a Test";
        // Figure out how many bytes have been received and how many we can transmit.
        wMaxGet = TCPIP_TCP_GetIsReady(appData.socket); // Get TCP RX FIFO byte count
        wMaxPut = TCPIP_TCP_PutIsReady(appData.socket); // Get TCP TX FIFO free space
        // Make sure we don't take more bytes out of the RX FIFO than we can put into the TX FIFO
        if(wMaxPut < wMaxGet)
                wMaxGet = wMaxPut;
        // Process all bytes that we can
        // This is implemented as a loop, processing up to sizeof(AppBuffer) bytes at a time.
        // This limits memory usage while maximizing performance.  Single byte Gets and Puts are a lot slower than multibyte GetArrays and PutArrays.
        wCurrentChunk = sizeof(AppBuffer);
        for(w = 0; w < wMaxGet; w += sizeof(AppBuffer))
        {
            // Make sure the last chunk, which will likely be smaller than sizeof(AppBuffer), is treated correctly.
            if(w + sizeof(AppBuffer) > wMaxGet)
                wCurrentChunk = wMaxGet - w;
            // Transfer the data out of the TCP RX FIFO and into our local processing buffer.
            TCPIP_TCP_ArrayGet(appData.socket, AppBuffer, wCurrentChunk);
            // Perform the "ToUpper" operation on each data byte
            for(w2 = 0; w2 < wCurrentChunk; w2++)
            {
                i = AppBuffer[w2];
                if(i >= 'a' && i <= 'z')
                {
                        i -= ('a' - 'A');
                        AppBuffer[w2] = i;
                }
                else if(i == 'e')   //escape
                {
                    appData.state = APP_TCPIP_CLOSING_CONNECTION;
                    SYS_CONSOLE_MESSAGE("Connection was closedrn");
                }
            }
            // Transfer the data out of our local processing buffer and into the TCP TX FIFO.
            SYS_CONSOLE_PRINT("Server Sending %srn", AppBuffer);
            TCPIP_TCP_ArrayPut(appData.socket, AppBuffer, wCurrentChunk);

            // No need to perform any flush.  TCP data in TX FIFO will automatically transmit itself after it accumulates for a while.  If you want to decrease latency (at the expense of wasting network bandwidth on TCP overhead), perform and explicit flush via the TCPFlush() API.
        }
    }
    break;

预先感谢。pbsnake

case APP_TCPIP_SERVING_CONNECTION:
{
    static uint8_t message[] = "Hello";
    static uint16_t pos = 0;
    if (!TCPIP_TCP_IsConnected(appData.socket))
    {
        pos = 0;
        appData.state = APP_TCPIP_CLOSING_CONNECTION;
        SYS_CONSOLE_MESSAGE("Connection was closedrn");
        break;
    }
    int16_t wMaxGet, wMaxPut, wCurrentChunk;
    uint16_t w, w2;
    uint8_t AppBuffer[32];
    //uint8_t AppBuffer2[] = "This is a Test";
    // Figure out how many bytes have been received and how many we can transmit.
    wMaxGet = TCPIP_TCP_GetIsReady(appData.socket); // Get TCP RX FIFO byte count
    wMaxPut = TCPIP_TCP_PutIsReady(appData.socket); // Get TCP TX FIFO free space
    // Make sure we don't take more bytes out of the RX FIFO than we can put into the TX FIFO
    if(wMaxPut < wMaxGet)
            wMaxGet = wMaxPut;
    // Process all bytes that we can
    // This is implemented as a loop, processing up to sizeof(AppBuffer) bytes at a time.
    // This limits memory usage while maximizing performance.  Single byte Gets and Puts are a lot slower than multibyte GetArrays and PutArrays.
    wCurrentChunk = sizeof(AppBuffer);
    for(w2 = 0; w2 < wCurrentChunk; w2++)
    {
        i = AppBuffer[w2];
        if (i == message[pos]) 
        {
            pos++;
            if (pos == strlen(message))
            {
                pos = 0;
                strcpy(AppBuffer, "World");
                SYS_CONSOLE_PRINT("Server Sending %srn", AppBuffer);
                TCPPutArray(MySocket, AppBuffer, strlen(AppBuffer));
            }
        } 
        else 
        {
            pos = 0;
        }
        if(i == 'e')   //escape
        {
            TCPServerState = SM_CLOSING;
        }
    }
}
break;

最新更新