jagr, SAA, Спасибо.
Посмотрю сейчас.
Просто у меня проблема - МК передает на скорости 115200 почти непрерывно поток данных пакетами по килобайту и его надо оперативно принимать и по этим данным строить график.
Я помнится такое делал. Тут только один подводный камень, кварц и коэффициенты на МК нужно подобрать тщательнее, что бы не выпадало ничего из UART-ского потока. Коэффициенты ошибок в зависимости от делителя Alghoritm Builder показывает, если я ничего не путаю. В билдере я делал так:
//---------------------------------------------------------------------------
// Инициализация
//---------------------------------------------------------------------------
void __fastcall TForm1::InitCommunication(void)
{
if(hCom >= 0) CloseHandle(hCom);
hCom = CreateFile(PORT.c_str(),GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,
NULL);
if (hCom == INVALID_HANDLE_VALUE) MessageBox(0,"Error","com1",0);
DCB dcb = {0};
if (!GetCommState(hCom, &dcb)) MessageBox(0,"Error","BCB get",0);
else{
// структура DCB инициализирована
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
// dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT;
}
if(!SetCommState(hCom, &dcb)) MessageBox(0,"Error","BCB set",0);
}
//---------------------------------------------------------------------------
// Процедура снятия отсчетов с COM2
//---------------------------------------------------------------------------
void __fastcall CyclRead(void)
{
DWORD dwRead, dwWait;
OVERLAPPED Sync = {0};
// Создаём событие для контроля за асинхронным чтением
Sync.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(Sync.hEvent==NULL)
MessageBox(0,"Ошибка создания события для осчета","SyncEvent",0);
else{
// Пока кнопка старт нажата снимаем отсчеты
while(MCU_ACTIVE)
{
if(GET_DATA_FROM_MCU){
if(TRY_CONNECT){
TRY_CONNECT = false;
Form1->ClientGRP->Open();
}
if(Form1->ClientGRP->Active) Form1->Caption = "Client: SERVER START CONNECTING";
// Начинаем чтение…
if(!ReadFile(hCom, &Mes.Value, 2, &dwRead, &Sync)){
if(GetLastError() != ERROR_IO_PENDING)
MessageBox(0,"Ошибка чтения устройства","ReadFile",0);
else{
// Ошибок чтения нет, ожидаем завершение операции чтения
dwWait = WaitForSingleObject(Sync.hEvent, TIMEOUT);
switch (dwWait)
{
case WAIT_OBJECT_0: // Операция чтения закончена
if(!GetOverlappedResult(hCom, &Sync, &dwRead, FALSE))
MessageBox(0,"Ошибка при чтении устройства","ReadFile",0);
else
GetValue();
break;
case WAIT_TIMEOUT:
// Операция чтения данных ещё не закончилась можно занятся чем-нибудь полезным
break;
default:
MessageBox(0,"Ошибка выполнения операции","WaitForSingleObject",0);
}
}
}
else{
// Операция чтения уже завершилась, можно обрабатывать полученные данные
GetValue();
}
}
Application->ProcessMessages();
}
CloseHandle(Sync.hEvent);
}
}
Всякие косяки вылазят. APRO смотрел, но чет когда смотрел, не понял, как юзать (в силу нелинейности своих рук). Придумал вроде решение, но сдругим компонентом(я их 3 штуки нашел, плюс пару классов, но не знаю, что с ними делать))) сейчас реализовываю.
Но за архивы по любому пасиб)))
Не используй компонентов вообще, на уровне WinApi куда проще, устанавливаешь синхронное/асинхронное чтение с порта, открываешь его как файл и Read, в соответствии с синхро/асинхрон либо тут же читаешь, либо читаешь когда придет байт. И главное! Не забывай отдавать системе время
Application->ProcessMessages();