2012-12-22 119 views
2

我試圖發送AT命令到我的手機(諾基亞5130)的WriteFile到串行端口總是超時和寫入的字節數爲零

手機通過USB端口連接(在使用調制解調器模式),所以之後我安裝了驅動程序 我把它列爲設備管理器的COM端口(諾基亞5130 XpressMusic的USB串行端口(COM17))

下面是代碼:

  #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  
+0

由於這不是一個答案,它必須是一個評論。但你有沒有嘗試用終端程序連接到該串行端口(TeraTerm是更好的 - 谷歌它)?如果你無法通過TeraTerm進行連接,那麼你也不會使用你的代碼。如果你是,那麼你知道你的代碼已損壞。 –

+1

您可能還想檢查portConfig中的流量控制設置 - 我不確定當您獲得狀態時它們的值是什麼,但關閉DTR,DSR,RTS等可能會改善問題。 我知道肯定Windows可以對這種普通類型的諾基亞手機進行串口通話,因爲我今年花了大約4個月的時間完全做到了這一點(使用Python,但我敢肯定這是不相關的) –

+0

Hi Mat,i'am able通過超級終端連接並使用它發送消息,我也試過你說的 \t portConfig.fDtrControl = FALSE; \t portConfig.fDsrSensitivity = FALSE; \t portConfig.fRtsControl = FALSE; 但沒有區別 – you

回答

1

好,我解決了這個改變的COM端口號 即使COM17就是在示設備管理器它不是正確的端口 這與端口配置無關(默認值工作) 就是這樣! 謝謝大家。