Суть такая: в диалоге есть несколько кнопок, по нажатию которых данные отправляются на COM-порт. Также данные принимаются с COM-порта по таймеру (запускается в OnInitDialog). Для обмена с COM-портом использую библиотеку SerialGate.dll. Так вот, первый цикл таймера выполняется только через несколько секунд после запуска, хотя должен через 500 мс по SetTimer. Аналогично себя ведут функции-обработчики кнопок; первые несколько секунд на нажатие кнопок нет реакции. OnInitDialog нигде не стопорится.
С MFC знаком не так давно, самому решить проблемы пока не получается...
Код | BOOL CCameraControlDlg::OnInitDialog() { CDialog::OnInitDialog(); ... iris = 0; // открыть диафрагму на 24 char buffIR[5]; buffIR[0] = 0x02; buffIR[1] = 0x3A; buffIR[2] = 0x00; buffIR[3] = 0x18; buffIR[4] = 0x03; sg.Send(buffIrisDown, sizeof(buffIrisDown)); iris = 256*(int)(unsigned char)buffIR[i+2] + (int)(unsigned char)buffIR[i+3]; CString str str.Format(_T("%d"), iris); SetDlgItemText(IDC_IRIS_VALUE, str); // запуск таймера для приема команд SetTimer(1, 500, NULL); // запрос текущего состояния char buffZF[5]; buffZF[0] = 0x02; buffZF[1] = 0x50; buffZF[2] = 0x00; buffZF[3] = 0x00; buffZF[4] = 0x03; sg.Send(buffZF, sizeof(buffZF)); TRACE("OnInit Ends\n"); } void CCameraControlDlg::OnTimer(UINT_PTR nIDEvent) { TRACE("Timer starts\n"); char buff[255]; int rcv = sg.Recv(buff, sizeof(buff)); if (rcv > 0) { for (int i = 0; i < rcv; i++) { // запрос зума if ((buff[i]==0x02) & (buff[i+4]==0x03)) { if (buff[i+1] == 0x40) { currentzoom = 256*(int)(unsigned char)buff[i+2] + (int)(unsigned char)buff[i+3]; TRACE("Current Zoom 1 - %d\n", currentzoom); zoom = currentzoom; CString str; str.Format(_T("%d"), currentzoom); SetDlgItemText(IDC_ZOOM_VALUE, str); } ... } } } } // обработчик одной из кнопок void CCameraControlDlg::OnBnClickedIrisUp() { TRACE("Button IrisUp Clicked\n"); char buffIrisUp[5]; if (iris < 32){iris++;} buffIrisUp[0] = 0x02; buffIrisUp[1] = 0x3A; buffIrisUp[2] = (char)(iris / 256); buffIrisUp[3] = (char)(iris % 256); buffIrisUp[4] = 0x03; sg.Send(buffIrisUp, sizeof(buffIrisUp)); CString str; str.Format(_T("%d"), iris); SetDlgItemText(IDC_IRIS_VALUE, str); TRACE("Iris - %d\n", iris); }
|
|