Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с мобильным телефоном через виртуальный COM порт. / 4 сообщений из 4, страница 1 из 1
17.04.2009, 11:40:30
    #35938150
anubys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с мобильным телефоном через виртуальный COM порт.
Есть мобильный телефон. При подключении к компьютеру через usb-кабель в списке устройств появляется как com порт. С помощью функции CreateFile подключаюсь к нему, с помощью команды WriteFile передаю команду и потом с помощью ReadFile пытаюсь считать. Проблема в том, что при считывании я получаю не ответ, а посланную ранее команду :( в чем может быть проблема? Ниже приведен код потока, в котором непосредственно все происходит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
DWORD WINAPI Thread (PVOID pParam)
{
    int t;

    HANDLE hVirtualCOM;
    MSG msg;
    AnsiString SendCommand;

    COMMTIMEOUTS CommTimeOuts;
    DCB dcb;

    PeekMessage(&msg, INVALID_HANDLE_VALUE,  0 ,  0 , PM_REMOVE);

    hVirtualCOM=CreateFile("\\\\.\\COM4",
                GENERIC_READ|GENERIC_WRITE,
                 0 ,
                NULL,
                OPEN_EXISTING,
                 0 ,//FILE_FLAG_OVERLAPPED,
                NULL);
    if (GetLastError())
    {
        MessageBox(NULL, FloatToStr(GetLastError()).c_str(), "Can't open port", MB_OK);
        return 1;
    }
    if (hVirtualCOM==INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "Invalid handle value", "Can't open port", MB_OK);
        return  1 ;
    }
    GetCommState(hVirtualCOM, &dcb);
    dcb.BaudRate = CBR_256000;
    dcb.fBinary = TRUE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fNull = FALSE;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = FALSE;
    dcb.ByteSize =  8 ;
    dcb.Parity = NOPARITY;
    dcb.StopBits =  1 ;
    SetCommState(hVirtualCOM, &dcb);

    GetCommTimeouts(hVirtualCOM, &CommTimeOuts);

    CommTimeOuts.ReadIntervalTimeout=  0 ;
    CommTimeOuts.ReadTotalTimeoutMultiplier =  11 ;
    CommTimeOuts.ReadTotalTimeoutConstant = 11 ;
    CommTimeOuts.WriteTotalTimeoutMultiplier =  11 ;
    CommTimeOuts.WriteTotalTimeoutConstant =  11 ;

    SetCommTimeouts(hVirtualCOM, &CommTimeOuts);

    PurgeComm(hVirtualCOM, PURGE_RXCLEAR);
    PurgeComm(hVirtualCOM, PURGE_TXCLEAR);

    DWORD numbytes, numbytes_ok, temp;
    COMSTAT ComState;
    OVERLAPPED Overlap;
    char buf_in[ 255 ];
    char buf_out[ 255 ];
    numbytes =  255 ;
    memset(buf_in, '\0', numbytes);
    memset(buf_out, '\0', numbytes);

    ClearCommError(hVirtualCOM, &temp, &ComState);
    t=GetLastError();

//    "AT+CPBS=SM";
    t=WriteFile(hVirtualCOM, "AT",  2 , &numbytes_ok,  0 /*&Overlap*/);
    if (!t)
    {
        t=GetLastError();
        MessageBox(NULL, "Îøèáêà çàïèñè â COM ïîðò", "Îøèáêà", MB_OK);

//        MessageBox(NULL, FloatToStr(t).c_str(), "Îøèáêà", MB_OK);
    }

//    Sleep( 5000 );

    ClearCommError(hVirtualCOM, &temp, &ComState);

    WriteFile(hVirtualCOM, "AT+CPBR=1\n",  9 , &numbytes_ok,  0 /*&Overlap*/);
//    Sleep( 5000 );

    ClearCommError(hVirtualCOM, &temp, &ComState);

    if(!temp) ReadFile(hVirtualCOM, buf_in, numbytes, &numbytes_ok,  0 /*&Overlap*/);
    t=GetLastError();
//    Sleep( 5000 );
//    Sleep( 5000 );
    Form1->Memo1->Lines->Add(buf_in);
    CloseHandle(hVirtualCOM);
    CloseHandle(hThread);
В результате выполнения получаю строчку, состояющую из двух посланных команд: ATAT+CPBR=1
...
Рейтинг: 0 / 0
17.04.2009, 16:37:03
    #35939201
clihlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с мобильным телефоном через виртуальный COM порт.
anubys,

Нет тут никакой проблемы. )) Просто работает по принцыпу терминала. т.е. ты ему один байт послал - он тебе его возвернул.
Т.е. по мере записи надо просто считывать столько же байт, сколько записали, и только потом читать ответ.
...
Рейтинг: 0 / 0
18.04.2009, 09:39:21
    #35940122
anubys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с мобильным телефоном через виртуальный COM порт.
clihlt
Спасибо, с этой проблемой я уже вроде как разобрался :)
А вот возникла другая - читаю данные из телефонной книги, и если контакт записан киррилицей, то я в программе получаю "?????????". Я понимаю, что это проблема кодировки, и не совсем сюда, но все таки может кто подскажет, как с этим бороться (пишу в builder 6). Я так понял, данные я читаю в Unicode?
P.S. Еще один вопросик, вот кусок кода, как я считываю ответ от телефона:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ClearCommError(hVirtualCOM, &temp, &ComState);
    while( 1 )
    {
        ReadFile(hVirtualCOM, &dwRead,  1 , &numbytes_ok,  0 /*&Overlap*/);
        Sleep( [b]30 );[/b]

        ClearCommError(hVirtualCOM, &temp, &ComState);
        if (in==false)
        {
            Form1->ProgressBar1->Max=ComState.cbInQue;
            in=true;
        }
        if (ComState.cbInQue== 0 ) break;
        buf_in[z]=var;
        z++;
        k++;
        Form1->ProgressBar1->Position=k;
    }
Вот вопрос по выделенному Sleep(30); если я его не ставлю ,то у меня не правильное количество символов в структуре ComState, которые еще не считаны. Почему так?
...
Рейтинг: 0 / 0
18.04.2009, 09:41:21
    #35940123
anubys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с мобильным телефоном через виртуальный COM порт.
P.P.S.Только читается там естественно не в dwRead, а в var.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с мобильным телефоном через виртуальный COM порт. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]