Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/39: Рейтинг темы: голосов - 39, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 14

Работа с последовательным портом

16.10.2012, 11:36. Показов 7530. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! В работе с железом я новичок, поэтому прошу объяснения и помощи. Заранее спасибо =)
На просторах инэта нашёл статейку и исходник к ней: http://www.delphimaster.ru/articles/comport2/
Подобная статейка есть на этом форуме, но изменения сделанные в ней, мне ничем не помогают.
Попробовал сам:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 procedure ReadComm;
  var
   outfile:textfile;
   mybyte:string;
   i:integer;
   Resive:array [0..255] of byte;
  begin
     assignfile(outfile,'C:\1.asd');
     rewrite(outfile);
     while true do
   begin
    TransMask:=0;
    WaitCommEvent(CommHandle,TransMask,@Ovr);
    if (TransMask and EV_RXFLAG)=EV_RXFLAG then
     begin
      ClearCommError(CommHandle,Errs,@Stat);
      Kols := Stat.cbInQue;
      ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);
 
      for i:=0 to 255 do
      begin
      mybyte:=IntToStr(Resive[i]);
      write(OutFile,mybyte+' ');
      end;
      closefile(outfile);
      sleep(10000);
     end;//mask
    end;//while
 
  end;
 
 procedure PortInit;
  var
   ThreadID:dword;
  begin
  //создание и иницализация порта
  KolByte:=0;
  CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
 
  //ставим маску - "по пришествии определенного символа"
  SetCommMask(CommHandle,EV_RXFLAG);
 
  //построение DCB
   GetCommState(CommHandle,DCB);
   DCB.BaudRate:=CBR_19200;
   DCB.Parity:=NOPARITY;
   DCB.ByteSize:=8;
   DCB.StopBits:=OneStopBit;
   DCB.EvtChar:=chr(13);
   //устанавливаем DCB
   SetCommState(CommHandle,DCB);
   CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
  end;
end.
Вот собственно как я понял, но толку нет, программа в бесконечном цикле и записи в файл никакой нет.
Работаю в Embarcadero Delphi XE2.
Требуется следующее, почему описал массив типом byte, как понял, заместо символов данные будут приниматься в байтах, а не в ANSI. Надеюсь это верно. Вопрос в чём ошибка и как можно реализовать запись в файл побайтно, известны 2 начальных байта и 2 конечных, как принять пакет от нач. до конечных используя данную маску, как можно использовать в EvtChar не символ а байт(hex). Цикличность думаю возникает из-за устройства, потому как оно ежесекундно посылает новый пакет.
Заранее благодарю за ответы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2012, 11:36
Ответы с готовыми решениями:

Работа с COM портом
Добрый день, уважаемые знатоки! Помогите пожалуйста выработать логику работы программы. Имеется электродвигатель, с одним магнитом на...

Работа с COM портом реальным и виртуальным
Добрый день. Есть программа обмена с устройствами ввода-вывода через преобразователь интерфейса RS485 -> RS232 или RS485 -> USB (с...

Работа с COM портом
Cразу к делу ) Нужна программа где достаточно будет 1 кнопки Start которая по клику начнет чтение с com порта и запишет данные в лог...

20
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 14
11.01.2013, 13:36  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от raxp Посмотреть сообщение

nubdelphi, вот кусок чтения в потоке у меня:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  h:integer;
  Ovr : TOverlapped;
  CommThread:thandle;
  DCB:TDCB;
implementation
 
{$R *.dfm}
 
function HexToBin(Hexadecimal: string): string;
 const
   BCD: array [0..15] of string =
     ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
     '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
 var
   i: integer;
 begin
   for i := Length(Hexadecimal) downto 1 do
     Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
 end;
 
 
 
procedure DoEvent;
var Resive :array [0..255] of byte;
    comstat: TComStat;
    mask, signal: dword;
    temp, btr:cardinal;
    binar:array[0..676,0..8]of string[2];
    RCBuf:Array [0..1024]of Byte;
    nToRead:Cardinal;
    nRead:Cardinal;
    str: string;
    I,j,ln,k,l: Integer;
    f,hb,hb2:string;
    bajt:string[2];
    b0:string[1];
begin
 ovr.hEvent:= CreateEvent(nil, true, true, nil);
 while true do begin
  WaitCommEvent(h, mask, @ovr);
  signal:= WaitForSingleObject(ovr.hEvent, INFINITE);
  if (signal = WAIT_OBJECT_0) then
 
   if (GetOverlappedResult(h, ovr, temp, true)) then begin
 
    if ((mask and EV_RXCHAR)<>0) then begin
      ClearCommError(h, temp, @comstat);
      btr:= comstat.cbInQue;
 ///////////////////////////////////////////////////////////
       ReadFile(h,rcbuf,btr,temp,@ovr);
        For I := 0 To temp - 1 Do
         begin
         if (rcbuf[i]=$30) and (rcbuf[i+1]=$34) then
          for j := 0 to 676 do
           begin
            if (rcbuf[i]=$C8) and (rcbuf[i+1]=$49) then
             break else
              begin
 
              f:=f+' '+Inttohex(rcbuf[j],2);
             end;
 
        end;
 
      end;
       if length(f)>0 then
 
             showmessage(f);
///////////////////////////////////////////////////////////
        end;
 
      end;
 
  end;
 
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
  var
   ThreadID:dword;
  begin
 h:= CreateFile('COM1',
                 GENERIC_READ or GENERIC_WRITE,
                 0,
                 nil,
                 OPEN_EXISTING,
                 FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
                 0);
 
 // задаем маску отслеживания сигналов RS-232
 setCommMask(h, EV_RXCHAR or EV_RXFLAG or EV_CTS or EV_DSR or EV_RING or EV_RLSD);
 // задаем настройки RS-232 (стоп-бит, четность, скорость)
  GetCommState(h, DCB);
  DCB.BaudRate:=19200;
  DCB.Parity:=NoParity;
  DCB.ByteSize:=8;
  DCB.StopBits:=ONESTOPBIT;
  SetCommState(h, DCB);
 //setdcb;
 //создаем параллельный поток
 CommThread:= CreateThread(nil, 0, @DoEvent, nil, 0, ThreadID);
end;
end.
Доброго времени суток, изменил код... проблема в следующем, не получается вытащить нужную часть пакета. Каждый раз вытаскивает неправильно: 1 проход, всего несколько байт, нужных, после 2го вытаскивает 2 нужных куска..... в чём проблема? хочу сделать разделение между пакетами и каждый после приёма обрабатывать.....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2013, 13:36

Работа с COM Портом
Привет Всем! У меня тут такая проблема. Для работы с одним внешним устройством, которое заведомо неопределенным образом выдает сигналы...

работа с COM портом
помогите, пожалуйста, наладить правильную работу с COM- портом. У меня есть аналогово-цифровой преобразователь, который преобразует...

Работа с LPT портом
Добрый день форумчане, столкнулся с проблемой. Печатающее устройство получает информацию через линии данных интерфейса. Печать полной...

Работа с LPT портом
Доброго времени суток. Имеется матричный принтер. Для вывода текста использую рулонную бумагу. При разработке программки возник вопрос:...

работа в delphi с СОМ-портом
Здравствуйте,пишу программу на пипломник, суть программы: через COM-порт отправляет и принимает определенные команды (программа для работы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru