Увеличьте скорость чтения / записи последовательного порта, используя таймеры - PullRequest
3 голосов
/ 31 октября 2011

У меня есть код, который читает и записывает в последовательный порт, написанный на MFC.Программы работают хорошо, но немного медленно, так как происходит много операций (чтение и запись).У меня есть таймер, который выполняет операции на последовательном порту.Таймер указан ниже:

Loop_Timer = SetTimer(1,50,0);

Информация о передаче по последовательному порту следующая:

BaudRate = 57600;
ByteSize = 8;
Parity = NOPARITY;
StopBits = ONESTOPBIT;
fAbortOnError = false;

Следующая операция записи и чтения происходит при запуске таймера:

Write(command);
Read(returned_message);
returned_message.Trim();
...   
//finds a value from the returned string
...

Таким образом, эта операция чтения и записи может выполняться 1,2,3 или 4 раза для данной выбранной опции.

Например: для варианта 1 требуется, чтобы вышеуказанная функция выполнялась 4 раза в даннойтаймер.Вариант 2 требует, чтобы вышеуказанная функция выполнялась 2 раза.(поскольку он имеет только две переменные с возвращаемыми значениями).и т. д.

Теперь я попытался повысить скорость этой общей операции, сделать ее надежной и быстро реагирующей.Я попытался изменить таймер, но он все еще довольно медленный.Есть предложения по улучшению?

1 Ответ

5 голосов
/ 31 октября 2011

Вы бы гораздо лучше запустили фактическую обработку последовательного порта в отдельном потоке и использовали бы WaitCommEvent вместо таймера для приема входящих данных. Добавить вновь полученные данные в локальный для этого потока буфер хранения.

Извлеките данные из вашего последовательного порта, используя таймер, если хотите, или попросите поток последовательного порта связаться с вашим основным приложением. когда получено полное сообщение.

При отправке данных в поток последовательного порта требуется механизм, в соответствии с которым данные хранятся локально в коде последовательного порта и передаются туда.

Следует иметь в виду, что по сравнению со всеми другими средствами связи передача и прием через последовательный порт является МЕДЛЕННЫМ, а доступ к последовательному порту в главном потоке приложения значительно замедляет его, особенно при передаче данных.

Если вы находите прямое кодирование с использованием Win32 API и последовательных портов болезненным, тогда этот класс здесь Я нашел очень полезным.

...