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
由於這不是一個答案,它必須是一個評論。但你有沒有嘗試用終端程序連接到該串行端口(TeraTerm是更好的 - 谷歌它)?如果你無法通過TeraTerm進行連接,那麼你也不會使用你的代碼。如果你是,那麼你知道你的代碼已損壞。 –
您可能還想檢查portConfig中的流量控制設置 - 我不確定當您獲得狀態時它們的值是什麼,但關閉DTR,DSR,RTS等可能會改善問題。 我知道肯定Windows可以對這種普通類型的諾基亞手機進行串口通話,因爲我今年花了大約4個月的時間完全做到了這一點(使用Python,但我敢肯定這是不相關的) –
Hi Mat,i'am able通過超級終端連接並使用它發送消息,我也試過你說的 \t portConfig.fDtrControl = FALSE; \t portConfig.fDsrSensitivity = FALSE; \t portConfig.fRtsControl = FALSE; 但沒有區別 – you