Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Daemon писал(а):
Почему ASCII символ 8 байт? ПОЧЕМУ?
Да нет. Один символ - один байт. Но этих символов у меня получается аж 8 штук (11001000 - три единицы и пять нулей). Понимаю, что я глупость сделал, ну вот и хотелось бы всё сделать по-человечески. А то у меня посылка из 15-ти байт получилась аж на все 120 байт (15 байт х 8 бит = 120 бит, где каждый бит - есть символ). А микроконтроллер, "сидящий" по другую сторону СОМ-порта, ждёт от меня посылки в 15 байт, в которой должны содержаться все необходимые ему данные. Прогу для микроконтроллера пишет другой человек.
_SGK спасибо, но это немного не то, что мне нужно. Пойду веселить народ своей проблемой на спец форумах.
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Shader 3.0 писал(а):
_SGK спасибо, но это немного не то, что мне нужно
Это то, но требует немного дополнительных телодвижений. Видимо для вас они сложные . Я вижу такую функцию:
Код:
function bin2byte( str : string ) : byte; var len,i: integer; begin len := length(str); bin2byte := 0 if ( len <= 8 ) then begin i := len; while ( i > 0 ) do begin bin2byte := bin2byte + (Ord(str[i]) - 48) shl (len - i); dec(i) end end end;
эх, как бы она на си красиво выглядела.... Передаём строчку и получаем ровно один байт. _SGK а если бы нужно было 4-рёх байтный integer получить? .
_SGK спасибо, но это немного не то, что мне нужно. Пойду веселить народ своей проблемой на спец форумах.
Ну да, согласен - бухаем, резвимся, веселим народ... Но 1 символ, если он не в Unicode занимает всего 1 байт. И ты просто можешь передать его как байт. Можешь преобразовать к двоичному представлению – это ничего не меняет. Надо еще функция, преобразующая байт? На -
Код:
function GetData(const Value: Byte): String; var i: Integer; begin Result:= ''; for i:= 0 to 7 do begin if Value and (1 shl (i)) <> 0 then Result:= Result + '1' else Result:= Result + '0'; end; end;
Байт занимает 8 бит и может содержать значения от 0 до 255. Если Ты в него пытаешься всунуть значение типа Integer, занимающее 32 бита, то это равносильно тому, что в латок для 10-ти яиц ты пытаешься уложить 40. Добавлено спустя 26 минут, 21 секунду mein
mein писал(а):
Это то, но требует немного дополнительных телодвижений. Видимо для вас они сложные .
Признаюсь честно – да сейчас для меня очень многое сложно. Добавлено спустя 13 минут, 53 секунды mein И ваще! От уж не ждал от Вас... Это типа эа бат-файлы расплата? Вот ща хлопну ишо 50 грамм, глядишь еще какое виденье откроется. Так и будете наезжать?
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Ещё раз всем низкий поклон за столь бурное обсуждение моей проблемы. Но наверно я неправильно растолковал суть проблемы и сам ввёл участников конференции в заблуждение. Но я кажется придумал как решить проблему. В общем, я решил что данные в СОМ-порт буду передавать всё-таки ввиде символов. Один байт (число в интервале 0-255) я буду передавать ввиде символа, код которого равен тому числу, которое я хочу передать. Допутсим мне нужно передать число 200. А я передам в порт символ "И". Таким образом в передающий буфер СОМ-порта поступит двоичное число, кодирующее этот символ, т. е. 11001000 (число 200 в двоичном виде). Как вам такая идея? Или опять чушь написал? Добавлено спустя 47 секунд З. Ы. Что-то ветка сегодня отжигает.
Member
Статус: Не в сети Регистрация: 23.12.2004 Откуда: Беларусь, Минск
Народ, а кто что скажет о Delphi 10 lite v3.0? Читал, что вырезан дотнет полностью, а удобство оставлено как у 2006. Работать предполагаю в основном над редкими и простыми лабами в универе и с GLScene.
И что на счёт лицензии - где-то видел, что компиллер делфей свободным стал - разъясните пожалуйста
_________________ ASUS A4M88T-M, Athlon II X3 425, 2GB NCP, video - internal ATI 4250, 200GB Samsung HDD, Win7 x64
x:=Length(A);//здесь все хорошо y:=Length(A[Length(A)]);//а в этой строке ошибка
Ведь А это динамический двумерный массив, следовательно можно обратиться к любой его строке, где строка тоже представляет собой одномерный массив.
Как можно узнать в процедуре размерность двумерного динамического массива(количество строк и столбцов), если явно не передать в функцию/процедуру количество строк и стобцов?
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Rius спасибо тебе большое друг, но у меня в понимании реализации данного проекта в Делфи большие проблемы, а уж в интерпретации С++ мне не эту простую истину не уяснить ещё многие годы (т. к. с С++ вообще никогда не имел дела). Пойду со своей проблемой спрашивать в Королевстве, там вроде много программистов, работавших на Делфи с СОМ-портами. Авось что-нибудь да подскажут.
Member
Статус: Не в сети Регистрация: 30.07.2006 Откуда: Москва-Ярик
ExplodeR писал(а):
y:=Length(A[Length(A)])
Явный выход за границы массива A - ты обращаешся к элементу следующему за последним элементом массива (индексация динамических массивов ведь с нуля идет).
Вот работоспособный пример:
Код:
{$APPTYPE CONSOLE} type TDynamicMatrix = array of array of Integer;
var da: TDynamicMatrix; x, y: Integer; begin SetLength (da, 5); for y := 0 to Length (da) - 1 do begin SetLength (da [y], y + 5); for x := 0 to Length (da [y]) - 1 do da [y][x] := x; end; // Output and release for y := 0 to Length (da) - 1 do begin for x := 0 to Length (da [y]) - 1 do Write (da [y][x], ' '); WriteLn; SetLength (da [y], 0); end; SetLength (da, 0); Readln; end.
_________________ Плавайте поездами Аэрофлота! И синий BSOD нам заменяет небосвод...
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Вторую неделю воюю с СОМ-портами. Корректно открывать/зарывать/настраивать + писать в СОМ-порты научился (ещё раз спасибо Rius за наводку). А вот с чтением - беда, - никак не хотят порты читаться. Мужики, если кто разбирается, подскажите плиз, где у меня косяк. Читаю из портов так:
Код:
//Указываем стандартному драйверу следить за появлением данных в приёмном буфере SetCommMask(hCommFile, EV_RXCHAR); for k:=0 to (StrToInt(Edit2.Text)+StrToInt(Edit4.Text)-1) do begin if WaitCommEvent(hCommFile, TMask, nil) = True then begin ReadFile(hCommFile,InBuffer,1,BytesRead,nil); Memo1.Lines.Add(IntToStr(InBuffer[k])+' считано '+IntToStr(BytesRead)+' байт'); end; end;
Пояснения: количество данных, которые надо прочесть, мне известно заранее. Оно равно сумме чисел из Edit2 и Edit4. Суть проблемы: при данном способе чтения из порта программа почемуто считывает лишь 2 первых байта (хотя в порт передаётся аж целых 15 байт). Никак не могу понять, почему так происходит.
Member
Статус: Не в сети Регистрация: 11.11.2004 Откуда: Челябинск
3 параметр ReadFile - число байт для считывания, надо ставить сразу 15, а уже потом разбирать сколько нужно из них.
но если ничего вообще не придёт, прога повиснет.
_________________ пишу я программу... и вдруг на клавиатуру выползает bug, буквально
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Rius Да, Вы правы. Оказалось, что нужно считывать все байты что есть в данный момент в приёмном буфере. Сейчас кое-чего подправил - вроде работает. Но я сейчас могу проверить работу программы только в "режиме симуляции". Я у разъёма СОМ-порта замкнул перемычкой 2-ой и 3-ий контакт. Теперь в буфер приёмника поступают те данные, что я отправляю в буфер передатчика (т. е. читаю из порта то, что туда сам записал). Сейчас вроде работает, однако как всё будет работать в реальности сказать трудно. Сейчас записываю/читаю так:
Код:
//////////////////////////////////////// // Отправка в порт пакета с настройками измерений // //////////////////////////////////////// NumberWritten:=0; //Число фактически записанных байт BytesRead:=0; //Число фактически считанных байт WriteFile(hCommFile,OutBuffer,15,NumberWritten,nil); //Записал for i:=0 to 14 do begin //Смотрим, что отправляли в порт Memo2.Lines.Add(IntToStr(OutBuffer[i])+' всего записано '+IntToStr(NumberWritten)+' байт'); end;{for i}
//////////////////////////////////////// // Чтение данных из порта // //////////////////////////////////////// if WaitCommEvent(hCommFile, TMask, nil) = True then begin ClearCommError(hCommFile,Errors,@Stat); //Сбрасываем флаг (так и не понял зачем это нужно, но без этого - не работает) InBytes := Stat.cbInQue; //Число байт во входном буфере ReadFile(hCommFile,InBuffer,InBytes,BytesRead,nil); //Прочитал for k:=0 to InBytes-1 do begin //Смотрим, что прочли из порта Memo1.Lines.Add(IntToStr(InBuffer[k])+' всего считано '+IntToStr(BytesRead)+' байт'); end;{for k} end;{if WaitCommEvent}
Больше всего смущает, что чтение данных вроде как не в цикле. Боюсь что в порт поступит одна порция данных (скорее всего результат первого измерения), а программа её прочтёт и успокоится. А надо бы читать около 2000 данных (каждое данное - 3-ёхбайтное число), поступающих от устройства измерения в порт с интервалом порядка 100-150 мс.
Member
Статус: Не в сети Регистрация: 11.11.2004 Откуда: Челябинск
Цитата:
Больше всего смущает, что чтение данных вроде как не в цикле. Боюсь что в порт поступит одна порция данных (скорее всего результат первого измерения), а программа её прочтёт и успокоится. А надо бы читать около 2000 данных (каждое данное - 3-ёхбайтное число), поступающих от устройства измерения в порт с интервалом порядка 100-150 мс.
на этот случай есть аинхронное считывание с порта, в компонентах для работы с портами это делают как событие, event, на приём и отправку.
_________________ пишу я программу... и вдруг на клавиатуру выползает bug, буквально
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
Да, я нашёл неплохой компонентик с подробной русской справкой для работы с СОМ-портами (BComPort). Но пока в нём не разбирался. Хочу попробовать сам на API-функциях что-нибудь написать (пускай и очень криво ).
Но чтение с порта я всё-таки зациклил. Однако, если вдруг прочту 5999 байт вместо ожидаемых 6000 байт (число байт, которые надо будет прочесть, я знаю заранее), то прога просто повиснет (зациклится). Нужна защита от зацикливания. Пока никак не придумаю таковую. Сейчас читаю в цикле следующим образом:
Код:
while b<WaitBytes do begin //Пока не прочли столько байт, сколько ожидаем //Будем ждать появления данных во входном буфере if WaitCommEvent(hCommFile, TMask, nil) = True then begin ClearCommError(hCommFile,Errors,@Stat); //Сбрасываем флаг и получаем статус порта InBytes := Stat.cbInQue; //Число байт во входном буфере ReadFile(hCommFile,InBuffer,InBytes,BytesRead,nil); b:=b+BytesRead; //Обновляем информацию о общем кол-ве прочитанных байт for k:=0 to InBytes-1 do begin //Смотрим, что прочли из порта Memo1.Lines.Add(IntToStr(InBuffer[k])+' всего считано '+IntToStr(BytesRead)+' байт'); end;{for k} end;{if WaitCommEvent} FlushFileBuffers(hCommFile); //Очищаем буферы, чтобы 2-ой раз не прочесть то, что уже прочли end;{while b<WaitBytes}
Сейчас этот форум просматривают: Bing [Bot] и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения