質問

私の組込みデバイスを私のシステムに接続するときは、私の埋め込みポートに書き込むプログラムを実行していて、コンソールへの返信を印刷します。

私のデバイスを接続してこのプログラムを実行すると、出力はありません。

しかし私のデバイスを接続してPuttyを最初に送信してから、プログラムを実行するためにPuttyを使用してから動作しています。

コミュニケーションを開始している方法で問題がある?

私のソースコードは次のとおりです。

#include "stdafx.h"
#include <iostream>
//#include <windows.h>
#include <afx.h>

int main()
{
    using namespace std;
    int i=0;
//  cout << "Hello world!" << endl;



    HANDLE hSerial;

    hSerial = CreateFile("COM5",
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_WRITE | FILE_SHARE_READ,
    0,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

    if(hSerial==INVALID_HANDLE_VALUE)
    {
        if(GetLastError()==ERROR_FILE_NOT_FOUND)
        {
//          TRACE("serial port does not exist for reading\n");
        //serial port does not exist. Inform user.
        }
//          TRACE("some other error,serial port does not exist for reading\n");
        //some other error occurred. Inform user.
    }

    DCB dcbSerialParams = {0};

    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);

    if (!GetCommState(hSerial, &dcbSerialParams)) 
    {
//                  TRACE("error getting state for reading\n");
    //error getting state
    }

    dcbSerialParams.BaudRate=9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;

    if(!SetCommState(hSerial, &dcbSerialParams))
    {
    //TRACE("error setting state for reading\n");
    //error setting serial port state
    }
    COMMTIMEOUTS timeouts={0};

    timeouts.ReadIntervalTimeout=50;
    timeouts.ReadTotalTimeoutConstant=50;
    timeouts.ReadTotalTimeoutMultiplier=10;

    timeouts.WriteTotalTimeoutConstant=50;
    timeouts.WriteTotalTimeoutMultiplier=10;

    if(!SetCommTimeouts(hSerial, &timeouts))
    {
//                  TRACE("some error occured for reading\n");
        //error occureed. Inform user
    }       
    int n=100,n1=100;
    char szBuff[100];
    DWORD dwBytesRead = 0;
    char szBuff1[100];
    DWORD dwByteswrote = 0;
    memset(szBuff1,0,100);
    memcpy(szBuff1,"LIST\r",5);
    if(!WriteFile(hSerial, szBuff1,5, &dwByteswrote, NULL))
    {
                    cout << "error writing" ;
    }
    cout << szBuff1 << endl;
    cout << dwByteswrote << endl;
    while(1)
    {
        if(!ReadFile(hSerial, szBuff, n1, &dwBytesRead, NULL))
        {
            cout << "error reading";
            break;
        }
        else
        {
            cout << dwBytesRead << endl;
            szBuff[dwBytesRead]='\0';
            if(dwBytesRead>0)
            {
                cout << (szBuff);

                break;
            }
        }
    }

    cin >> i;
}
.

役に立ちましたか?

解決

Try this... you will probably need to do the code for exceptions (ex: if the response is bigger than 2024)

bool SendModemATCommand(const string &strCommand, int iModemPort, string &strRetValue)
{
    bool bRetValue = false;

    strRetValue = "";
    char cBuffer[2024];

    HANDLE hCom = NULL;   
    char cComPort[64];
    sprintf_s(cComPort,"\\\\.\\COM%d", iModemPort);


    hCom = CreateFile( cComPort,
                    GENERIC_READ | GENERIC_WRITE,
                    0,    // must be opened with exclusive-access
                    NULL, // no security attributes
                    OPEN_EXISTING, // must use OPEN_EXISTING
                    0,    // not overlapped I/O
                    NULL  // hTemplate must be NULL for comm devices
                    );

    if (hCom != INVALID_HANDLE_VALUE) 
    {
        COMMTIMEOUTS comTimeOuts;
        comTimeOuts.ReadIntervalTimeout = MAXDWORD;
        comTimeOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
        comTimeOuts.ReadTotalTimeoutConstant = 0;//MAXDWORD;
        comTimeOuts.WriteTotalTimeoutMultiplier = 0;
        comTimeOuts.WriteTotalTimeoutConstant = 0;
        if(SetCommTimeouts(hCom, &comTimeOuts))
        {
            DCB dcb;
            dcb.DCBlength = sizeof(DCB);
            if(GetCommState(hCom, &dcb))
            {
                DWORD dwBytesWritten = 0;                  
                DWORD dwBytesRead = 0;
                DWORD dwBytesTotal = 0;

                if( WriteFile(hCom, strCommand.c_str(), (int)strCommand.size(), &dwBytesWritten, NULL) )
                {
                    if(dwBytesWritten == strCommand.size())
                    {
                        dwBytesRead = 0;
                        DWORD tickStart = GetTickCount();
                        bool bTimeOut = false;                      
                        while(true)
                        {
                            while(ReadFile(hCom, cBuffer + dwBytesTotal, 1, &dwBytesRead, NULL))
                            {       
                                if(dwBytesRead == 0 && dwBytesTotal != dwBytesWritten)
                                    break;
                                dwBytesTotal += dwBytesRead;                                
                            }
                            if ( dwBytesTotal == 0 )
                            {
                                // timeout
                                if ( GetTickCount() - tickStart > 10000) // 10 Seconds
                                {
                                    bTimeOut = true;
                                    break;                              
                                }
                            }
                            else
                                break;
                        }                   

                        cBuffer[dwBytesTotal] = '\0';
                        strRetValue = cBuffer;

                        if(bTimeOut)
                            strRetValue = "Timed out:" + strCommand;
                        else
                            bRetValue = true;
                    }
                }
            }
        }
        CloseHandle(hCom);
    }

    return bRetValue;
}

他のヒント

Most likely the problem is with your initialization.

I recall having this type of trouble before and Com Timeouts structure was particularly troublesome.

I suggest you get a null modem cable from COM5 to another port on the machine (if you have one), or to another computer. Then use a terminal program to open up the other port and see you can see the "List" command coming through when you run the program. If not then it's very likely to be related to the way you are initializing & opening the com port.

This link may prove useful. Just strip out the Afx stuff and look particularly at the initialization. http://www.codeproject.com/KB/system/chaiyasit_t.aspx

One other suggestion, you only send List once. If the device is not already plugged in and ready, nothing will happen. Maybe it should keep sending the list command until it gets a Response.

Also, do you need "List\r\n" or just "List\r"? What is the other ends expecting?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top