2

Atコマンドを携帯電話(Nokia 5130)に送信しようとしています

電話はUSBポート(モデムモードで使用)を介して接続されているため、ドライバーをインストールすると、デバイスマネージャー(Nokia 5130 XPressMusic USBシリアルポート(COM17))にCOMポートとして表示されます。

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

            #include <iostream>
    #include <Windows.h>

    using namespace std;

    int main()
    {
        HANDLE hport = INVALID_HANDLE_VALUE;
        DCB portConfig;

        hport = CreateFile( TEXT("\\\\.\\COM17"),GENERIC_READ | GENERIC_WRITE,  
            0,NULL,OPEN_EXISTING,0,0); 

        if(hport == INVALID_HANDLE_VALUE)
        {
            cout<<GetLastError();
            system("pause");
            return 0;
        }

        if(GetCommState(hport,&portConfig)==0)
        {
            cout<<"Erreur de recuperation de la configuration :"<<GetLastError()<<endl;
            system("pause");
            return 0;
        }

        portConfig.BaudRate = CBR_9600;
        portConfig.Parity = NOPARITY ;
        portConfig.StopBits = ONESTOPBIT;
        portConfig.ByteSize = 8;
        portConfig.fBinary = TRUE;
        portConfig.fDtrControl = DTR_CONTROL_HANDSHAKE;
        portConfig.fOutX = true;
        portConfig.fRtsControl = RTS_CONTROL_HANDSHAKE;
        portConfig.fAbortOnError = TRUE;
        portConfig.fParity = TRUE;

        if(SetCommState(hport,&portConfig)==0)
        {
            cout<<"Erreur de configuration Setcommstate:"<<GetLastError()<<endl;
            system("pause");
            return 0;
        }

        COMMTIMEOUTS comTimeOut;                
        comTimeOut.ReadIntervalTimeout = 3000;
        comTimeOut.ReadTotalTimeoutMultiplier = 3000;
        comTimeOut.ReadTotalTimeoutConstant = 2000;
        comTimeOut.WriteTotalTimeoutMultiplier = 3000;
        comTimeOut.WriteTotalTimeoutConstant = 2000;
        SetCommTimeouts(hport,&comTimeOut);

        DWORD  dwNumberOfBytesWritten;
        unsigned char * buffer = new unsigned char[4];
        buffer[0] = 'A';
        buffer[1] = 'T';
        buffer[2] = '\r';
        buffer[3] = '\n';


        WriteFile(hport,buffer,4,&dwNumberOfBytesWritten,NULL);
        cout<<"erreur "<<dwNumberOfBytesWritten<<" d'ecriture :"<<GetLastError();

        delete [] buffer;

        system("pause");
        CloseHandle(hport);
        return 0;
    }

WriteFileがシリアルポートに何も書き込まない理由を誰かに教えてもらえますか?

comポートが実際のcomポート(usbからcom)ではないためですか?
(注:タイムアウトを指定しないと、WriteFileがハングします)

portMonダンプ:

        19  0.00002536  ConsoleApplica  IRP_MJ_CREATE   USBSER000   SUCCESS Options: Open   
        20  0.00047645  ConsoleApplica  IOCTL_SERIAL_GET_BAUD_RATE  USBSER000   SUCCESS     
        21  0.00035417  ConsoleApplica  IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS     
        22  0.00000045  ConsoleApplica  IOCTL_SERIAL_GET_CHARS  USBSER000   SUCCESS     
        23  0.00000045  ConsoleApplica  IOCTL_SERIAL_GET_HANDFLOW   USBSER000   SUCCESS     
        24  0.00032201  ConsoleApplica  IOCTL_SERIAL_GET_BAUD_RATE  USBSER000   SUCCESS     
        25  0.00022917  ConsoleApplica  IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS     
        26  0.00000091  ConsoleApplica  IOCTL_SERIAL_GET_CHARS  USBSER000   SUCCESS     
        27  0.00000000  ConsoleApplica  IOCTL_SERIAL_GET_HANDFLOW   USBSER000   SUCCESS     
        28  0.00071875  ConsoleApplica  IOCTL_SERIAL_SET_BAUD_RATE  USBSER000   SUCCESS Rate: 9600  
        29  0.00062953  ConsoleApplica  IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
        30  0.00000091  ConsoleApplica  IOCTL_SERIAL_SET_CHAR   USBSER000   SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:0 XOFF:0    
        31  0.00000045  ConsoleApplica  IOCTL_SERIAL_SET_HANDFLOW   USBSER000   SUCCESS Shake:80000042 Replace:81 XonLimit:0 XoffLimit:0    
        32  0.00000045  ConsoleApplica  IOCTL_SERIAL_SET_TIMEOUTS   USBSER000   SUCCESS RI:3000 RM:3000 RC:2000 WM:3000 WC:2000 
        33  14.00148370 ConsoleApplica  IRP_MJ_WRITE    USBSER000   TIMEOUT Length 4: ....  
        34  0.00000408  ConsoleApplica  IRP_MJ_CLEANUP  USBSER000   SUCCESS     
        35  0.00047464  ConsoleApplica  IRP_MJ_CLOSE    USBSER000   SUCCESS     
4

1 に答える 1

1

わかりました。COM17がデバイスマネージャーに表示されるものであっても、COMポート番号を変更することでこれを解決しました。これは正しいポートではありませんでした。これは、ポート構成とは関係ありません(デフォルト値は機能します)。みんな、ありがとう。

于 2012-12-23T22:09:00.360 に答える