1

問題: マイクロコントローラは、デバッガの制御下で for ループで 10 バイト (ASCII A、B、C、D、E、F、G、H、I、J) を送信しています。Windows アプリケーション (以下に抽象化された C++/CLI コード) は、これらのバイトを受け取ることになっています。

最初は while ループで、2 番目は for ループで、2 つの異なるFT_Read試行を参照してください。

ケース #1 : micro-controller-for-loop を一度に実行すると、While ループが終了し、RxMessage 配列が最初のバイトを正しく 'A' として保持し、残りの 9 バイトをジャンクとして保持します。ここで、fsuccess は FT_OK および TotalRxBytes=10 として返されます

ケース #2 : バイト単位で送信するためにマイクロコントローラー for ループにステップインすると、While ループは、'A',0xFF,'B',0xFF,'C',0xFF,'D',0xFF を保持する RxMessage 配列で終了します。 ,'E',0xFF. fsuccess は FT_OK および TotalRxBytes=10 として返されますが、

ケース #3 : バイトごとに送信するためにループ用マイクロコントローラーにステップインする。Windows アプリの For ループを一気に実行します。Windows アプリの For ループは、10 バイトすべてを 'A'、'B'、'C'、'D'、'E'、'F'、'G'、'H'、'I として正しく保持する RxMessage で終了します。 '、'J'。

注: 上記の 1 と 2 の場合、 Windows アプリの For ループが '?' のように終了するまでに、micro-controller-for-loop は 5 回の反復を必要とします。および 0xFF は、すべてのループ用マイクロコントローラー反復で送信されます。一方、ケース #3 では、FT_Read + FT_Purge が望ましくない 0xFF チャンクを削除するかのように、micro-controller-for-loop はWindows アプリの For-loopを終了するために正確に 10 回の反復を行います。

             private:
    /// Required designer variable.
        PVOID fth;
        BOOL fSuccess, fthsuccess;
        array<wchar_t> ^ TxMessage;
        array<unsigned char> ^ RxMessage;


    Form1(void) //Constructor
    {
        fthsuccess = false;
        InitializeComponent();
        TxMessage = gcnew array<wchar_t> (12);
        RxMessage = gcnew array<unsigned char> (12);
    }



    /*PS. All the FT_xxxx calls below are tested for fsuccess before proceeding ahead */
    FT_Open(0, ppfthandle);
    FT_SetBaudRate(*ppfthandle, 9600);
    unsigned char LatencyTimer;
    FT_SetLatencyTimer(*ppfthandle, 2);
    FT_GetLatencyTimer(*ppfthandle, &LatencyTimer);
    FT_SetDataCharacteristics(*ppfthandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
    FT_SetTimeouts(*ppfthandle, 10000/*read*/, 1000/*write*/);


    if(fthsuccess == true)
    {
        pin_ptr<FT_HANDLE> ppfthandle = &fth;

        pin_ptr<wchar_t> ppTx = &TxMessage[0];
        fSuccess = FT_Write(*ppfthandle,&ppTx[0],4,&dwhandled);

        /*in absence of Purge below, Tx chars echo as part of Rx chars
        ultimately workaround would be needed to avoid Purging of 
        real time RxData at runtime
        */
        FT_Purge(*ppfthandle, FT_PURGE_RX | FT_PURGE_TX);

        pin_ptr<unsigned char> ppRx = &RxMessage[0];
        DWORD RxBytes,TotalRxBytes;
        RxBytes=TotalRxBytes=0;
        while(TotalRxBytes<10){
        FT_GetQueueStatus(*ppfthandle,&RxBytes);
        fSuccess = FT_Read(*ppfthandle,ppRx,RxBytes,&dwhandled);//reading 10 bytes in one go
        if(fSuccess != FT_OK){
            break;
        }
        TotalRxBytes += dwhandled;
        ppRx = &RxMessage[TotalRxBytes];
        }

        fSuccess = FT_Purge(*ppfthandle, FT_PURGE_RX | FT_PURGE_TX);
        ppRx = &RxMessage[0];//reset ppRx and attempt read in for-loop, the same bytes from micro-controller
        for(int i=0;i<10;i++)//reading byte-by-byte in debug steps
        {
            fSuccess = FT_Read(*ppfthandle,&ppRx[i],1,&dwhandled);
            /*in absence of Purge below, alternate characters are read as 0xFF
            ultimately workaround would be needed to avoid Purging of 
            real time RxData at runtime
            */
            FT_Purge(*ppfthandle, FT_PURGE_RX | FT_PURGE_TX);
        }
    }// if (!fthsuccess)

以下のマイクロコントローラからのコード スニペット:

    uint8_t Series[10]={'A','B','C','D','E','F','G','H','I','J'};
    for(loopcount=0;loopcount<10;loopcount++)
    {
        UART1Send(Series+loopcount,1);
    }
4

1 に答える 1