реклама на сайте
подробности

 
 
> COM порт в win98 и winXP
Freeze Anti
сообщение Jun 20 2007, 04:56
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Здравствуйте.

Я написал программу в СиБилдере 6-ом, передающую на ком-порт некоторую информацию. Программа довольно сносно работает в win98... Но в winXP почему-то принимает только последние фразы сообщений (я передаю просто текст)...

Так вот вопрос... Чем отличается работа с RS-232 в 98 и ХР?..

P.S. порт работает в асинхронном режиме, так как микроконтроллер, с которого передаются сообщения, не работает в синхронном режиме...


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Freeze Anti
сообщение Jun 20 2007, 11:53
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Попробовал эту библиотеку.

Уже гораздо лучше.

Спасибо огромное.

Принимаю почти то, что и хотел, правда есть еще два вопроса.

1. Почему-то проглатывается несколько последних строчек.

2. Не очень понял, как программно выбрать порт. Когда я пытаюсь набрать

Код
cPort->Port = "COM1"


мне выдается ошибка линковщика.

На всякий случай код апишной программы. Если получится лучше и быстрей - оставлю этот вариант.

Код
    if (RadioButton_Com1->Checked)
    {
            COMString = "COM1";
    }
    if (RadioButton_Com2->Checked)
    {
            COMString = "COM2";
    }

    HANDLE port;
    int buf_out;
    char buf_in[255] = "";
    AnsiString LogString;
    int i = 0;
    OVERLAPPED ovr;
    DWORD bc;
    DCB *dcb;
    COMMTIMEOUTS ct;
    dcb = (DCB*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB));
    dcb->DCBlength = sizeof(DCB);
    BuildCommDCB("baud=2400 parity=N data=8 stop=1", dcb);
    dcb->fNull = TRUE;
    ct.ReadIntervalTimeout = 10;
    ct.ReadTotalTimeoutMultiplier = ct.ReadTotalTimeoutConstant = 100;
    ct.WriteTotalTimeoutMultiplier = ct.WriteTotalTimeoutConstant = 0;
    memset(&ovr, 0, sizeof(ovr));
    ovr.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    port = CreateFile(COMString, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    if (port == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "Невозможно открыть порт для записи", "Ошибка", MB_OK);
        return;
    }
    SetCommState(port, dcb);
    SetCommTimeouts(port, &ct);
    buf_out = 0x5A;
    WriteFile(port, &buf_out, 1, &bc, &ovr);
    DWORD ReopenTime = GetTickCount();
    CloseHandle(port);
    port = CreateFile(COMString, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    if (port == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "Невозможно открыть порт для чтения", "Ошибка", MB_OK);
        return;
    }
    SetCommState(port, dcb);
    HeapFree(GetProcessHeap(), 0, dcb);
    SetCommTimeouts(port, &ct);
    DWORD StartTime = GetTickCount();
    bc = 1;
    bool StartRead = false;
    while ((GetTickCount() - StartTime) < 10000)
    {
        Application->ProcessMessages();
        buf_in[i] = 0;
        ReadFile(port, &buf_in[i], 1, &bc, &ovr);
        PurgeComm(port, PURGE_RXCLEAR|PURGE_TXCLEAR);
        Sleep(1);
        i++;
        if (buf_in[i] == buf_in[i - 1] == ' ')
            buf_in[i] = 0;
        if (buf_in[i] != 0)
           LogString += Recode(buf_in[i]);
       if (i == 246)
       {
              Log->Lines->Add(LogString);
              i = 0;
              LogString = "";
       }
}


Здесь Log - TMemo

В 98-ой принимает более-менее нормально (Начальство довольно), а в ХР - только несколько несвязных фраз, почти все проглатывает.

Сообщение отредактировал Freeze Anti - Jun 20 2007, 11:54


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 21:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016