Задать вопрос
@OnlyFirster

Странный ответ с COM порта, почему?

Здравствуйте, уважаемые!

Есть код:
#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

int main ()
{

    HANDLE port = CreateFileA("\\\\.\\COM24", GENERIC_READ | GENERIC_WRITE, 0,
                              NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(port == INVALID_HANDLE_VALUE)				{ MessageBoxA(NULL, "Порт не открыт", "", MB_OK); return 0; }
    if( ! SetCommMask(port, EV_RXCHAR | EV_ERR) )   { MessageBoxA(NULL, "маска не установлена", "", MB_OK); return 0; }

    DCB dcb;
    if( ! GetCommState(port, &dcb) )   { MessageBoxA(NULL, "GCS error", "", MB_OK);; return 0; }
    dcb.DCBlength = sizeof(DCB);
    dcb.BaudRate = CBR_9600;
    dcb.fBinary = TRUE;
    dcb.fParity = FALSE;
    dcb.fOutxCtsFlow = FALSE;				// hardware flow control //
    dcb.fOutxDsrFlow = FALSE;				// hardware flow control //
    dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;	// hardware flow control
    dcb.fDsrSensitivity = FALSE;				// software flow control
    //dcb.fTXContinueOnXoff = ;				// software flow control
    dcb.fOutX = FALSE;					// software flow control  //
    dcb.fInX = FALSE;					// software flow control
    //dcb.fErrorChar = ;
    dcb.fNull = TRUE;
    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;	// hardware flow control
    dcb.fAbortOnError = FALSE;  //
    //dcb.fDummy2 = ;
    dcb.wReserved = 0;
    //dcb.XonLim = ;						// software flow control
    //dcb.XoffLim = ;						// software flow control
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    //dcb.XonChar = ;					// software flow control
    //dcb.XoffChar = ;					// software flow control
    //dcb.ErrorChar = ;
    //dcb.EofChar = ;
    //dcb.EvtChar = ;
    //dcb.wReserved1 = ;
    if( ! SetCommState(port, &dcb) )   { MessageBoxA(NULL, "SCS error", "", MB_OK); return 0; }

    COMMTIMEOUTS timeouts;
    timeouts.ReadIntervalTimeout = MAXDWORD;
    timeouts.ReadTotalTimeoutMultiplier = 100;
    timeouts.ReadTotalTimeoutConstant = 100;
    timeouts.WriteTotalTimeoutMultiplier = 100;
    timeouts.WriteTotalTimeoutConstant = 100;
    if (!SetCommTimeouts(port, &timeouts))	{ MessageBoxA(NULL, "Не удалось задать timout", "", MB_OK); return 0; }

    DWORD error;
    COMSTAT status;
    if( ! ClearCommError(port, &error, &status) )	{ MessageBoxA(NULL, "CME error", "", MB_OK); return 0; }

#define my_LEN(str)		strlen(str)
    DWORD written;
    char str[50] = "at\r";
    char str1[50];
    WriteFile(port, str, my_LEN(str), &written, NULL);
    if( ! WriteFile(port, str, my_LEN(str),		// Отсылаем AT команду модему
                    &written, NULL) )
    { MessageBoxA(NULL, "WriteFile error", "", MB_OK); return 0; }


    DWORD event;
    if( WaitCommEvent(port, &event, NULL) )   // Ждем события порта и не получаем его. Программа виснет тут.
    {
        ReadFile(port, &str1, my_LEN(str), &written, NULL);
        cout << str1  << endl;
        switch(event)
        {
            case EV_RXCHAR:
                break;
            case EV_ERR:
                break;
            default:
                MessageBoxA(NULL, "WCE error default", "", MB_OK); return 0;
        }
    }
    else   { MessageBoxA(NULL, "WCE error", "", MB_OK); return 0; }

    cout <<"End programm\n";	// До этой точки мы не доходим

    return 0;
}


Отправляется АТ команда модему мегафон е352, в ответ возвращает сообщения вот такого вида:
Mв–ЂNв™ЈРґв– (
End programm


Не понимаю, почему, пробовал локаль настроить для консоли русскую например - все равно такие кракозябры, не подскажите в чем может быть дело?

Настройки выставлены согласно модему.

Спасибо заранее за ответы.!
  • Вопрос задан
  • 613 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Параметры порта: скорость, число бит данных, четность и стопбиты проверяйте. Наверняка где-то там проблема.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
char str[50] = "at\r";

Я бы заменил на "at\r\n".

ReadFile(port, &str1, my_LEN(str), &written, NULL);

Здесь кое-что перепутано. Но если это исправить, работать всё равно будет неправильно, потому что my_LEN будет удивлён.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы