Цитата:
Я тоже решил попробывать повторить ваш проект но уже столкнулся со трудностями, купил танчик такой же как и на примере Модели "Huan QI NO.516-10", собрал плату, и накоонец-то решил проверить будет ли он реагировать на нажатые клавиши вперёд-назад и так далее, запустил программу RobotController, начал подавать сигналы вперед-назад, а он вообще не реагирует.Я сначало подумал, что не правильно плату собрал, но потом оказалась, что проблема не в плате, проверил осциллографом импульсы которые выдает компорт, и те которые на танчике, они оказались разные . Полчается с компорта выходит сначала-пауза, потом десять импульсов и т.д., а у меня на танчике наоборот сначало шесть импульсов, потом пауза и т.д. Не подскажете, где в программе RobotController прописуются импульсы (я имиею ввиду 5 ms 4.7 ms).
Расставил побольше комментариев в тексте подпрограммы формирования импульсов COM порта, думаю теперь будет понятнее:
Код:
// Поток передачи команд роботу
void CmdTransmitting(void*)
{
timeBeginPeriod(1);
// Делитель счётчика времени
LARGE_INTEGER Count;
LARGE_INTEGER Frequency;
QueryPerformanceFrequency (&Frequency);
__int64 Tf = Frequency.QuadPart/1000000;
hCOMPort = CreateFile(_T("\\\\.\\COM1"),GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Устанавливаем сигнал COM порта DTR=0
EscapeCommFunction(hCOMPort, CLRDTR);
for(;;) {
if(!memchr(&gCmdArray, TRUE, sizeof(TCmdArray))) { Sleep(1); continue; }
for(int i=0; i<cCmdLoop; i++) {
#define csTime 670 // Время короткого импульса (670 mks ~= 0.7 ms)
#define cbTime 1990 // Время длинного импульса (1990 mks ~= 2.0 ms)
// Формируем пачку импульсов команды
for(int j=0; j<cCmdTotal+1; j++) {
// Запоминаем время начала формирования сигнала
QueryPerformanceCounter(&Count);
// Читаем кодовую последовательность импульсов из массива
BOOL s = (!j)?TRUE:gCmdArray.Cmd[j-1];
// Устанавливаем сигнал COM порта DTR=1 (начало импульса)
EscapeCommFunction(hCOMPort, SETDTR);
// Держим паузу 2.0 ms для единицы, и 0.7 ms для нуля
if(s && j < cCmdTotal) { Sleep(1); }
if(j) { Pause((s)?cbTime:csTime, Tf, Count.QuadPart); }
// Запоминаем время начала формирования сигнала
QueryPerformanceCounter(&Count);
// Устанавливаем сигнал COM порта DTR=0 (конец импульса)
EscapeCommFunction(hCOMPort, CLRDTR);
// Держим паузу 0.7 ms для единицы, и 2.0 ms для нуля
if(!s && j < cCmdTotal) { Sleep(1); }
Pause((s)?csTime:cbTime, Tf, Count.QuadPart);
}
// Пауза (4.3 ms) перед повторной выдачей пачки импульсов
QueryPerformanceCounter(&Count);
EscapeCommFunction(hCOMPort, SETDTR);
Sleep(4);
if(memchr(&gCmdArray, TRUE, sizeof(TCmdArray))) { i=0; }
Pause(4300, Tf, Count.QuadPart);
}
// Устанавливаем сигнал COM порта DTR=0
EscapeCommFunction(hCOMPort, CLRDTR);
}
}
Для снятия временных диаграмм использовал вместо осциллографа звуковой вход и программу звукового редактора “Cool edit“. Что бы приёмник радиоуправляемой модели «купился» на имитацию, которую генерирует программа – сигналы должны быть схожи. Я для подгонки записывал в начале оригинальные осциллограммы с помощью “Cool edit“, затем записывал имитацию, полученную программой, а затем в режиме “multi track” ставил одну диаграмму под другой и сравнивал их. Когда было уже более или менее схоже, приёмник модели начал воспринимать имитируемые команды.