В рамках останньої сесії довелося робити программу для передачі двох сигналів від передавача до приймача через послідовний порт. Генерацію сигналів і графіків робив Буділовський Сергій, а я робив приймач/передавач. В процесі роботи перерив купу форумів і так як тема актуальна вирішив викласти результат в маси.
Завдання до розрахункової виглядало приблизно так:
На стороні приладу вимірюється два шумових сигнали. Один з рівномірним інший з нормальним законом розподілу. Використовуючи АЦП з частотою дискретизації 1 кГц. Період вимірювання 1с. Дискретизовані дані за період вимірювання передаються до комп’ютера. На стороні ПК розраховуємо автокореляційну функцію по кожному каналу та кореляційну, коваріаційну функцію між двома сигналами. Результати розрахунку виводяться на екран монітора у графічному режимі.
А це скріншот вікна програми передавача (в приймача все майже те саме):
Робив в Borland C++Builder 6. Для передачі даних використовувався клас TCommPort (copyright: Harold Howe, bcbdev.com 1996-1999). Для емуляції COM портів – програму Virtual Serial Port Driver 6.9.
В принципі нічого складного. При передачі сигналів int розбиваємо на 2ва байти, float на 4ри. На стороні приймача збираємо їх назад. Для перевірки готовності прийому/передачі і в якості роздільника двох сигналів я використав байти 232 і 233. Підозрюю, що це не правильно і потрібно використовувати SetCommMask:
Value Meaning
EV_BREAK A break was detected on input.
EV_CTS The CTS (clear-to-send) signal changed state.
EV_DSR The DSR (data-set-ready) signal changed state.
EV_ERR A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
EV_RING A ring indicator was detected.
EV_RLSD The RLSD (receive-line-signal-detect) signal changed state.
EV_RXCHAR A character was received and placed in the input buffer.
EV_RXFLAG The event character was received and placed in the input buffer. The event character is specified in the device’s DCB structure, which is applied to a serial port by using the SetCommState function.
EV_TXEMPTY The last character in the output buffer was sent.
Але о 5й ранку в мене не було вже ані часу, ані бажання з тим гратися.
Ітак ось архів з сирцями. Може кому й згодиться ;-).
Прикольно! Одначе навряд чи АЦП вміє дискретизувати сигнал у float, з плаваючою точною – певно, все одно тільки цілі числа – звідки ж тоді ці float-и взялися? А що за предмет такий? Щось таємне? 😉
Не знаю, як називається предмет… Тільки прізвище викладача. Я ж тільки на сесію приїжджав :).