Форум — Ответы ( К темам )
? | Роман: Проблема с работой COM порта в потоке... (30-11-2002 04:02:30) |
Помогите начинающему! Инициализирую и работаю с COM портом в потоке — теряются байты информации (три из десяти доходят, а вместо остальных нули). Если все тоже самое делаю в основной программе, то все в порядке. Почему? Может что-то не учел? (Синхронизацию использую) И еще вопрос — можно ли в компоненте StringGrid выровнять текст (например по центру)? | |
Николай (30-11-2002 15:16:26) | |
Все таки по-видимому что-то не так с синхронизацией, если в основном потоке все нормально, попробуй отловить (как-то там можно использовать и отладчик в потоках в C++Builder 6 ) | |
Павел (30-11-2002 18:34:57) | |
Через что работаешь с com-портом ? Скинь код, посмотрим, так тяжело сказать Угадывать не умеем | |
Роман (07-12-2002 03:05:23) | |
Вот выдержки из программы касающиеся работы с портом bool __fastcall PortThead::OpenF() { //открытие порта cFILE = CreateFile(Port.c_str(), GENERIC_WRITE | GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL); } //--------------------------------------------------------------------------- //конфигурирование порта void __fastcall PortThead::Loop() { if(cFILE != NULL) { //если порт открыт COMMTIMEOUTS CommTime; //установка временных параметров порта GetCommTimeouts(cFILE, &CommTime); //получение текущих параметров порта CommTime.ReadIntervalTimeout = 1; //время ожидания байта CommTime.ReadTotalTimeoutConstant = 1; //время отведенное на чтение SetCommTimeouts(cFILE, &CommTime); //сообщения 1*на кол — во байт DCB dCB; GetCommState(cFILE, &dCB); //получаем текущую конфигурацию порта dCB.BaudRate = CBR_9600; //скорость передачи данных dCB.Parity = NOPARITY; //без паритета dCB.StopBits = ONESTOPBIT; //один бит стоповый dCB.ByteSize = 8; //байт = 8 битам SetupComm(cFILE, 1200, 1200); //отведение памяти под буфера SetCommState(cFILE, &dCB); //установка новых параметров } //--------------------------------------------------------------------------- //закрытие порта void __fastcall PortThead::CloseF() { CloseHandle(cFILE); //закрытие порта } //--------------------------------------------------------------------------- //запись в порт int __fastcall PortThead::Zapros() { const v=8; nByteOfWrite = v; //количество байт в посылке nByteWrite = 0; //количество отправленных байт Byte P[v]; while (nByteWrite != v) //цикл пока не отправим все байты WriteFile(cFILE, &P, nByteOfWrite, &nByteWrite, NULL); return nByteWrite; //количество отправленных байт } //--------------------------------------------------------------------------- //чтения порта void __fastcall PortThead::ReadPort() { nByteFoRead = 2; nByteRead = 0; //обнуление начальных значений while (nByteRead != 2) ReadFile(cFILE, &Buf, nByteFoRead, &nByteRead, NULL); //чтение } Алгоритм такой запрос устройству->ответ и информацию (ответ) скидываем в циклический буфер, который находится в главном модуле, где происходит дальнейшая обработка. Порт работает в параллельном потоке с преоритетом на пункт выше нормального. Работаю с BCB 5. В принципе код уже работает более менее, но не всегда стабильно и как то "рывками", главный модуль "притормаживает" информация отображается кусками. В чем дело??? |