Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2009, 09:32   #1
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию Как работать с компонентом CPort

Необходимо работать с Com портом компа.
Поставил компонент CPort --очень неплохо облегчает работу,но есть некоторые сложности которые никак не могу понять--может кто подскажет???
1)Надо передавать и принимать данные размером от 12 до 23 байт--так вот данные принимаются только до 8 байт--если данных больше 8 байт то принимаются байты с 9 по 16---я так понимаю проблемы с буфером--но какой бы размер входного и выходного буфера я не ставил--все равно тоже самое--как победить???????
Кстати передача идет так же по 8 байт--соединил два порта кабелем на один посылаю данные а на другом ловлю--так вот программа что следит за приемом отображает что приходит посылка 8 байт , а потом еще одна остальные
2)Никак не могу изменить программно скорость--как выставил изначально в свойствах скорость так и стоит
Yrok вне форума Ответить с цитированием
Старый 05.03.2009, 12:23   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

1 Если хотите считать строку
то
Код:
var s:string;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
 comport1.ReadStr(s,count); 
end;
если массив байт то
Код:
var buffer: array[1..3000] of byte;//размер буфера
.........
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
 comport1.Read(buffer,3000);//разрешаем буферу считать 3000 байт
//или
comport1.Read(buffer,count);
end;
все данные записаны в массив buffer и далее обрабатываем данные
2. Можно так попробовать
Код:
 with form1.ComPort1 do
       begin
        timeouts.ReadInterval:=50;
        timeouts.ReadTotalMultiplier:=70;
        timeouts.ReadTotalConstant:=100;
        timeouts.WriteTotalMultiplier:=60;
        timeouts.WriteTotalConstant:=100;
        form1.ComPort1. BaudRate:=br9600;
       end;
Ещё не все данные могут считываться из за неправильной настройки св-в порта TimeOuts (см ответ №2)

Последний раз редактировалось SERG1980; 05.03.2009 в 12:27.
SERG1980 вне форума Ответить с цитированием
Старый 05.03.2009, 13:28   #3
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию

Цитата:
var s:string;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
comport1.ReadStr(s,count);
end;
--вот именно при таком написании если данные <=8 байт --все ОК,
если данные >8 то s=9-16 байт

Цитата:
var buffer: array[1..3000] of byte;//размер буфера
.........
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
comport1.Read(buffer,3000);//разрешаем буферу считать 3000 байт
//или
comport1.Read(buffer,count);
end;
--вот так массив содержит последние 8 байт , а остальные 3000-8=2992 ячейки пусты

SERG1980---огромное спасибо дружище!!!!!!!!!
Цитата:
timeouts.ReadInterval:=50;
timeouts.ReadTotalMultiplier:=70;
timeouts.ReadTotalConstant:=100;
timeouts.WriteTotalMultiplier:=60;
timeouts.WriteTotalConstant:=100;
--работает!!!!!--принимаю все байты что приходят.
Еще раз огромное спасибо--очень выручил!!!!!!

Цитата:
form1.ComPort1. BaudRate:=br9600;
--а если я выбираю скорость через ComboBox--как назначить скорость --у меня вечно несовпадение типов выдает

Не плодите посты - есть кнопка "Правка".
Избегайте ненужного цитирования.
И то, и другое - нарушения.
Рекомендую почитать правила раздела.

Последний раз редактировалось mihali4; 06.03.2009 в 14:59. Причина: Объединение постов
Yrok вне форума Ответить с цитированием
Старый 05.03.2009, 15:11   #4
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Цитата:
Сообщение от Yrok Посмотреть сообщение
--а если я выбираю скорость через ComboBox--как назначить скорость --у меня вечно несовпадение типов выдает
Так оно и будет ведь в сомбобоксе можно записать в строках ну и потом перевести в integer а скорость сом порта тип TBaudRate
можно сделать так
1Вариант
Код:
const BdRt:array[1..15]of TBaudRate=            (br110,br300,br600,br1200,br2400,br4800,br9600,
                                     br14400,br19200,br38400,br56000,br57600,
                                     br115200,br128000,br256000);
.....
form1.ComPort1. BaudRate:=BdRt[combobox1.ItemIndex];
2Вариант
Код:
form1.ComPort1.ShowSetupDialog
Вызываем диалог настройки порта

3 Вариант (самый простой)
Кидаем компонент ComComboBox (входит в состав CportLib) в св-ве ComPort указываем порт которым будем управлять, а в св-ве ComProperty указываем, что будем менять в вашем случае это изменение скорости cpBaudRate
SERG1980 вне форума Ответить с цитированием
Старый 05.03.2009, 16:47   #5
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию

Цитата:
3 Вариант (самый простой)
Кидаем компонент ComComboBox (входит в состав CportLib) в св-ве ComPort указываем порт которым будем управлять, а в св-ве ComProperty указываем, что будем менять в вашем случае это изменение скорости cpBaudRate
--использую такой метод--меняю порт , открываю порт и.. оказывается что открыт порт который указан по умолчанию в CPort.
Со скоростью тоже самое
Сначало забыл указать в св-ве ComPort каким портом управлять--сейчас поставил--тоже самое --не меняет--может потому что ComboBox находиться на другой форме???

Кстати щас проверил--принимаются все байты , а вот отправляются все равно посылками по 8 байт --может на
timeouts.WriteTotalMultiplier:=60;
timeouts.WriteTotalConstant:=100; --другие параметры поставить нужно.
Отправляю на скорости 19200 , 12 байт--уходят две посылки--8 байт + 4 байта
Yrok вне форума Ответить с цитированием
Старый 06.03.2009, 08:16   #6
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Не знаю что у вас за посылки как вы изменяете скорость порта, а потому
если не секрет, то выложите код, где у вас не получается и не мешало бы посмотреть на данные, которые вы отправляете
Да и попробуйте ещё следущее
Код:
procedure TForm1.ComComboBox1Change(Sender: TObject);
begin
comcombobox1.ApplySettings;
end;

Последний раз редактировалось SERG1980; 06.03.2009 в 08:36.
SERG1980 вне форума Ответить с цитированием
Старый 06.03.2009, 10:19   #7
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию

SERG1980 , вот это помогло))))--спасибо!!!
Код:
comcombobox1.ApplySettings;
принимаю вот так
Код:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Buff:String;
begin
   Timer1.Enabled:=False;
   if ComPort1.ReadStr(Buff,13)>6 Then
     begin
       Label2.Caption:=Buff;
       Memo1.Lines.Add(DateToStr(Date)+'     '+Buff);
       
         Label7.Visible:=False;
     end;
     Timer2.Enabled:=True;
end;
--все принимается

отправляю вот так
Код:
procedure TForm1.Timer2Timer(Sender: TObject);
const
  FBuf: array [1..12] of Byte = (1, 2, 3, 4, 5, 6, $FF, $FF, $00, $01, $00, $33);

begin
   if ComPort1.Connected then
     begin
       ComPort1.Write(FBuf,12);
     end;
   Timer2.Enabled:=False;
   Timer1.Enabled:=True;
end;
проверяю програмулиной следящей за Com портом и получаю вот такие данные
Цитата:
Received: 0x01 0x02 0x03 0x04 0x05 0x06 0xFF 0xFF
Received: 0x00 0x01 0x00 0x33
Yrok вне форума Ответить с цитированием
Старый 06.03.2009, 13:31   #8
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Я в порт всегда строкой передавал т.е переводил каждый байт в символ
(например в цикле s:= s+chr(FBuf[i]), где s:string) и эту s передавал
SERG1980 вне форума Ответить с цитированием
Старый 06.03.2009, 13:50   #9
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию

Попробовал --все равно бьет по 8 байт--блин даже не знаю что и делать то?????
Пробовал разные варианты
timeouts.WriteTotalMultiplier
timeouts.WriteTotalConstant--не помогает

Обратите внимание на свой пост №3

Последний раз редактировалось mihali4; 06.03.2009 в 15:00.
Yrok вне форума Ответить с цитированием
Старый 06.03.2009, 15:45   #10
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

А может это просто программа, которой вы смотрите, так выдаёт?
SERG1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работать с Rave? Araver БД в Delphi 2 16.02.2009 22:07
Как работать с диалогами Arassir Помощь студентам 1 11.11.2008 20:51
Как пользоваться компонентом PrintDialog? Bill Gates Общие вопросы Delphi 1 30.12.2007 20:15
Как работать c USB? Araver Общие вопросы Delphi 4 05.11.2007 18:41
Как работать с графикой? Yogurt Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 29.04.2007 07:12