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

 
 
> 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
ALexx
сообщение Jun 20 2007, 12:54
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(Freeze Anti @ Jun 20 2007, 14:53) *
Попробовал эту библиотеку.

Уже гораздо лучше.
Спасибо огромное.
Принимаю почти то, что и хотел, правда есть еще два вопроса.

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

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

Код
cPort->Port = "COM1"


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


1.1 Поиграйте с таймаутам
1.2 Управление потоком какое? Аппаратное, программное, или вообще его нет? Не попадаются ли среди смволов XON или XOFF

2. СОМ1 не русским буквами случаем набрано 07.gif Ну и точка с запятой отсутствует :-)
А вообще, если надо менять только номер порта (оставляя все настройки) можно использовать
ComComboBox. На прилагаемом рисунке пояснение как его использовать.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post



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

 


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


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