Форум - Ответы     (  К темам )
 ?  Роман: Проблема с работой 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.
В принципе код уже работает более менее, но не всегда стабильно и как то "рывками", главный модуль "притормаживает" информация отображается кусками. В чем дело???


support@cbuilder.ru