powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с мобильным телефоном через виртуальный COM порт.
4 сообщений из 4, страница 1 из 1
Работа с мобильным телефоном через виртуальный COM порт.
    #35938150
anubys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть мобильный телефон. При подключении к компьютеру через 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
Работа с мобильным телефоном через виртуальный COM порт.
    #35939201
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anubys,

Нет тут никакой проблемы. )) Просто работает по принцыпу терминала. т.е. ты ему один байт послал - он тебе его возвернул.
Т.е. по мере записи надо просто считывать столько же байт, сколько записали, и только потом читать ответ.
...
Рейтинг: 0 / 0
Работа с мобильным телефоном через виртуальный COM порт.
    #35940122
anubys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Работа с мобильным телефоном через виртуальный COM порт.
    #35940123
anubys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.P.S.Только читается там естественно не в dwRead, а в var.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с мобильным телефоном через виртуальный COM порт.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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