Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2013, 21:12
ua3rad ua3rad вне форума
Прохожий
 
Регистрация: 21.12.2012
Сообщения: 17
Репутация: 10
По умолчанию COM порт

Добрый вечер! Вот такая проблема: Написал модуль для работы с com портом к своей программе.
Код:
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
125
126
127
unit ComPort;
 
                                              interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
const
    end_dannyh: ShortString = #90 + #3 + #85 + #90; // записываем в конец отправляемых данных
var
  freq: integer;
  Nomer_RPU: ShortString;
  Nomer_COM_Porta: string;
  port : THandle;
 
 
  function initComport (Nomer_COM_Porta: AnsiString):THandle;
  procedure CloseComPort(Port: Thandle);
  procedure WriteComPort(Port: Thandle; freq: integer; Nomer_RPU: ShortString; Nomer_COM_Porta: AnsiString); // Задаем частоту и номер РПУ
  function ReadComPort (Port: Thandle): shortstring;
 
 
                                            implementation
 
function initComport (Nomer_COM_Porta: AnsiString):THandle;
var
  DCB: TDCB;
  CommTimeouts:TCommTimeouts;
begin
  FillChar(dcb, SizeOf(dcb), 0);
  port := 0;
  port:= CreateFileA(PAnsiChar(Nomer_COM_Porta) ,GENERIC_READ or GENERIC_WRITE, 0, nil,
               OPEN_EXISTING, 0,0);
 
  if port = INVALID_HANDLE_VALUE then begin
   // Обнаружена ошибка, порт открыть не удалось
   exit;
  end;
 
  if Not GetCommState(port,dcb) then
    begin
      CloseHandle(port);
      // Ошибка при подключении параметров порта
      exit;
    end;
 
  GetCommState(port,DCB); {получаем текущее DCB}
  DCB.BaudRate:=CBR_9600;  {устанавливаем скорость работы}
  DCB.Parity:=NOPARITY; {устанавливаем отсутствие проверки на четность}
  DCB.ByteSize:=8; {8 бит в передаваемом байте}
  DCB.StopBits:=OneStopBit; {одиночный стоп-бит}
  DCB.EvtChar:=chr(13); {вот собственно задаем символ для SetCommMask. В данном случае - возврат каретки}
  SetCommState(port,DCB); {ну теперь собственно прописываем исправленное DCB}
 
  if Not SetCommState(port,dcb) then
    begin
      CloseHandle(port);
      // Ошибка при установке параметров порта
      exit;
    end;
 
  GetCommTimeouts(Port, CommTimeouts); //получаем структуру CommTimeouts что бы не заполнять все вручную
  CommTimeouts.ReadIntervalTimeout :=MAXDWORD;  //функция ReadFile возвращает
  CommTimeouts.ReadTotalTimeoutMultiplier := 0; //немедленно все имеющиеся
  CommTimeouts.ReadTotalTimeoutConstant := 0;   //байты в приемном буфере
  CommTimeouts.WriteTotalTimeoutMultiplier := 0;//общий тайм-аут для
  CommTimeouts.WriteTotalTimeoutConstant := 0//операции записи не используется.
  SetCommTimeouts(Port, CommTimeouts); //записываем измененную структуру
 
  result := port;
end;
 
procedure CloseComPort(Port: Thandle);
begin
  CloseHandle(Port); {закрытие порта после завершения работы с ним}
end;
 
procedure WriteComPort(Port: Thandle; freq: integer; Nomer_RPU: ShortString; Nomer_COM_Porta: AnsiString);  // Задаем частоту и номер РПУ
 
 
var
  buf: ShortString;
  written: Cardinal;
 // Nomer_COM_Porta1: PAnsiChar;
  //j: Integer; //переменная для вывода передаваемого кода на экран
 
 
 
begin
  if PAnsiChar(Nomer_COM_Porta) = 'COM1' then
    begin
      buf:= Nomer_RPU+format('F%0.7d',[freq])+end_dannyh;//получаем данные для отправки в виде F частота #3
    end
  else
    begin
      freq:= Round(freq/100);
      buf:= format('F%0.5d',[freq])+#3;//получаем данные для отправки в виде F частота #3
    end;
 
  WriteFile(Port,buf[1],Length(buf),Written,nil); //собственно отпавляем данные
 
 // Вывод передаваемого кода на экран-------------------------------------------
//  writeln(Nomer_COM_Porta);
//  for j := 1 to Length(buf) do
//      writeln( IntToStr(j) + '-' + IntToStr( ord(buf[j]) ) + ' ' + buf[j] );
//  writeln;
 //-----------------------------------------------------------------------------
 
end;
 
function ReadComPort (Port: Thandle): shortstring;
Var
  RCBuf:array [1..1024] of char; //Буфер данных для приема
  nToRead:Cardinal;   //Число байт для чтения
  nRead:Cardinal;     //Число прочитанных байт
  ComStat:TComStat;   //состояние порта
  Errs:Dword;
  str: shortstring;
begin
  FillChar( RCBuf, Sizeof(RCBuf), #0);  //Обнуляем буфер данных для приема
  ClearCommError(Port,Errs,@ComStat);       //считываем состояние порта
  nToRead:=ComStat.cbInQue;                 //считываем число байт для чтения из структуры
  ReadFile(Port,RCBuf,nToRead,nRead,nil);  //считываем данные
  str :=  shortstring(RCBuf);
  Result:= str;
end;
end.

В модуле есть такая строчка DCB.Parity:=NOPARITY;
Мне нужно DCB.Parity:=evenPARITY;
но тогда comport принимает не то что я посылаю в него. Comport все правильно принимает если стоит NOPARITY, но тогда не работает остальное железо. Что делать

Последний раз редактировалось lmikle, 02.04.2013 в 22:42.
Ответить с цитированием
  #2  
Старый 02.04.2013, 21:16
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Что делать
1) Оформить код тегами!
2) Почитать про COM-порт (RS232, протокол UART).
3) Разобраться, что значит это самое PARITY.
4) Понять, что формат посылки и приема должны совпадать, иначе данные будут другие или их не будет вовсе.
(Считай, один человек пишет на немецком, а другой читает этот текст на английском. Буквы одинаковые, но данные будут совсем другие, или их не будет вовсе).
5) Переделать железо так, чтобы оно отправляло в нужном формате, или забить и использовать текущий формат приема на компе.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.04.2013 в 21:21.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025