Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Программирование —› COM1 иже с ним
Посл.ответ Сообщение

Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 16 октября 2007 09:29
· Личное сообщение · #1

Очень нужен пример пересылки сообщения через COM1 средствами API.
Асм, си, неважно. Сообственное есть, но:
Данные не посылает (WriteFile возвращает 0)
Данные не принимает (Не реагирует на событие)
Или может кто найдёт косяк в моём сорце? Вроде всё правильно, но них*** не работает...
.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
GetMsg PROTO
SendMsg PROTO

.data
dlgname db "MAIN",0
szTitle db "Window Sizer",0
szerr db "Error",0
texst db "Text",0
errmes db "Error open COM1",0
lineErr db "Line now bisy", 0
com db "COM1",0
over OVERLAPPED <>
dcb DCB <>
endprog db 0
data db 300 dup (0)
buffer db 300 dup (0)
.data?
hInstance dd ?
hWnd dd ?
flag db ?
dwSignal dd ?
hList dd ?
hBox dd ?
hCom dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
invoke ExitProcess,eax


WndProc proc hWin:DWORD,
uMsg:DWORD,
wParam:DWORD,
lParam:DWORD

pusha
.if uMsg == WM_INITDIALOG
mov eax, hWin
mov hWnd, eax
invoke LoadIcon,hInstance,100
invoke SendMessage,hWin,WM_SETICON,1,eax
invoke GetDlgItem,hWin,1000
mov hList,eax
invoke GetDlgItem,hWin,2000
mov hBox,eax
invoke SetFocus, hBox
call InitCom
invoke CreateThread,0,0,GetMsg, 0, 0, 0
.elseif uMsg == WM_COMMAND
mov eax, wParam
.if wParam == 100 ; кнопка Send
invoke GetDlgItemText, hWin, 2000, ADDR buffer, 300
call SendMsg
.endif
and eax,0FFFFh
.if eax == 1000 ; Listbox
mov eax,wParam
shr eax,16
.if eax == LBN_DBLCLK
invoke SendMessage,hList,LB_GETCURSEL,0,0
invoke SendMessage,hList,LB_GETTEXT,eax,ADDR buffer
invoke MessageBox,hWnd,ADDR buffer,ADDR texst,MB_OK
.endif
.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog,hWin,0
.endif
popa
xor eax,eax
ret
WndProc endp

InitCom proc
invoke CreateFile,addr com, GENERIC_READ or GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL
mov hCom, eax
.if hCom == INVALID_HANDLE_VALUE
invoke MessageBox,hWnd,addr errmes,addr szerr,MB_OK
ret
.endif
invoke GetCommState, hCom, addr dcb
mov dcb.BaudRate, CBR_2400
mov dcb.ByteSize, 8
mov dcb.StopBits, ONESTOPBIT
mov dcb.Parity, ODDPARITY
invoke SetCommState,hCom, addr dcb
invoke GetCommMask, hCom, dwSignal
invoke SetCommMask, hCom, EV_RXCHAR
;invoke CreateEvent, NULL, FALSE, FALSE, NULL
;mov over.hEvent, eax
xor eax, eax
ret
InitCom endp

GetMsg proc
local bytes:BYTE
loopget:
invoke WaitCommEvent,hCom, addr dwSignal, NULL
mov flag, 1 ; флаг использования порта (получаем данные)
invoke ReadFile,hCom, addr data, sizeof data, addr bytes, NULL
mov flag, 0 ; освободили линию
invoke MessageBox,0,addr data,addr szerr,MB_OK
invoke SendMessage,hList,LB_ADDSTRING,NULL,addr data ;and add it to the list box
jmp loopget
ret
GetMsg endp

SendMsg proc
local bytes:BYTE
.if flag == 0
invoke WriteFile, hCom, addr buffer, sizeof buffer, addr bytes, NULL
.elseif
invoke MessageBox,hWnd,addr lineErr,addr szerr,MB_OK
.endif
ret
SendMsg endp
CloseCom proc
invoke CloseHandle, over.hEvent
invoke CloseHandle, hCom
mov hCom, 0
ret
CloseCom endp
end start




Ранг: 24.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 16 октября 2007 09:58
· Личное сообщение · #2

Freecod пишет:
GENERIC_READ or GENERIC_READ

Оригинально



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 16 октября 2007 10:06
· Личное сообщение · #3

Может это тебе чем-то поможет.

Несколько компонентов(Delphi) для работы с COM.
Я не смотрел, как они написаны, но давно успешно юзал какой-то из них.

COM_PORT.ZIP http://slil.ru/24984720



Ранг: 72.3 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 16 октября 2007 10:13
· Личное сообщение · #4

держи ещё, совсем недавно спрашивали на канале, так пришлось найти эту доку



Ранг: 72.3 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 16 октября 2007 10:15
· Личное сообщение · #5

мде... аттачи тут уже не судьба починить...

Download-Link #1: rapidshare.com/files/62885737/__1056___1072___1073___1086___1090___1072____1089__COM___1080__LPT___1074__Win32.rar.html



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 16 октября 2007 10:32
· Личное сообщение · #6

Xserg пишет:
Freecod пишет:
GENERIC_READ or GENERIC_READ
Оригинально

Издержки нервного программирования =) Но при проверке всё было путём.

sER: перзалей на ifolder или dump.ru плз



Ранг: 72.3 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 16 октября 2007 10:50
· Личное сообщение · #7

Freecod,
Файл успешно закачан: dump.ru/files/n/n52661516/
MD5 хеш файла: 9d58e1629d216ba5d88e4f8a06bbacc7



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 16 октября 2007 11:48
· Личное сообщение · #8

Спасибо, будем курить.



Ранг: 11.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 17 октября 2007 12:47 · Поправил: DW_G
· Личное сообщение · #9

Freecod пишет:
пересылки сообщения через COM1 средствами API

вот писал както правда в делфи, для сотового, но думаю разберешся:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, ColorButton;

type
TForm1 = class(TForm)
Button1: TButton;
SpinEdit1: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
SpinEdit2: TSpinEdit;
ComboBox1: TComboBox;
Button2: TButton;
Button4: TButton;
Edit1: TEdit;
Memo1: TMemo;
Label5: TLabel;
ColorButton1: TColorButton;
ColorButton2: TColorButton;
ColorButton3: TColorButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SpinEdit1KeyPress(Sender: TObject; var Key: Char);
procedure SpinEdit2KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure ColorButton1Click(Sender: TObject);
procedure ColorButton2Click(Sender: TObject);
procedure ColorButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
HCom: THandle = INVALID_HANDLE_VALUE;
CN: Integer = 1;
Speed: Integer = 9600;
BS: Integer = 8;
implementation

{$R *.dfm}

//function BuildDCB: Boolean;
procedure TForm1.Button1Click(Sender: TObject);
var
COMDCB: DCB;
COMTimes: COMMTIMEOUTS;
begin
if(HCom<>INVALID_HANDLE_VALUE)then
begin
FileClose(HCom);
HCom:=INVALID_HANDLE_VALUE;
end;
HCom:=CreateFile(PChar('COM'+IntToStr(CN)),(GENERIC_READ or GENERIC_WRITE),0,Nil,OPEN_EXISTING,0,0);
if(HCom<>INVALID_HANDLE_VALUE)then
begin
PurgeComm(HCom,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
if(GetCommState(HCom,COMDCB)=False)or(GetCommTimeouts(HCom,COMTimes)=F alse)then
begin
FileClose(HCom);
HCom:=INVALID_HANDLE_VALUE;
Form1.Label1.Caption:='Отказано в доступе к порту "COM"'+IntToStr(CN);
Exit;
end;
COMDCB.BaudRate:=Speed;
COMDCB.ByteSize:=BS;
COMDCB.Parity:=NOPARITY;
COMDCB.StopBits:=2;
COMTimes.ReadIntervalTimeout:=50;
COMTimes.ReadTotalTimeoutMultiplier:=2;
COMTimes.ReadTotalTimeoutConstant:=5000;
COMTimes.WriteTotalTimeoutMultiplier:=1;
COMTimes.WriteTotalTimeoutConstant:=5000;
if(SetCommState(HCom,COMDCB)=False) or (SetCommTimeouts(HCom,COMTimes)=False)then
begin
FileClose(HCom);
HCom:=INVALID_HANDLE_VALUE;
Form1.Label1.Caption:='Отказано в доступе к порту "COM"'+IntToStr(CN);
Exit;
end;


Form1.Label1.Caption:='Порт "COM"'+IntToStr(CN)+' доступен!';
end
else Form1.Label1.Caption:='Отказано в доступе к порту "COM"'+IntToStr(CN);
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
BS:=Form1.SpinEdit2.Value;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if(HCom<>INVALID_HANDLE_VALUE)then
begin
FileClose(HCom);
HCom:=INVALID_HANDLE_VALUE;
end;
end;

procedure TForm1.SpinEdit1KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Char(0);
end;

procedure TForm1.SpinEdit2KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Char(0);
end;

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Char(0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if(HCom<>INVALID_HANDLE_VALUE)then
begin
FileClose(HCom);
HCom:=INVALID_HANDLE_VALUE;
end;
Form1.Label1.Caption:='';
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
CN:=Form1.SpinEdit1.Value;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Speed:=StrToInt(Form1.ComboBox1.Items[Form1.ComboBox1.ItemIndex]);
end;
{
function BuildDCB: Boolean;
begin
BuildDCB:=False;
if(PurgeComm(COMArea.ComHandle,(PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR))=False)then Exit;
if(GetCommState(COMArea.ComHandle,COMArea.ComDCB)=False)or(GetCommTime outs(COMArea.ComHandle,COMArea.ComTimes)=False)then Exit;
COMArea.ComDCB.BaudRate:=COM_Speed;
// COMArea.ComDCB.Flags:=$1011;
// COMArea.ComDCB.Flags:=$1;
// COMArea.ComDCB.XonLim:=0;
// COMArea.ComDCB.XoffLim:=0;
COMArea.ComDCB.ByteSize:=8;
COMArea.ComDCB.Parity:=NOPARITY;
// COMArea.ComDCB.StopBits:=TWOSTOPBITS;
// COMArea.ComDCB.XonChar:=Char($F0);
// COMArea.ComDCB.XoffChar:=Char($F1);
// COMArea.ComDCB.ErrorChar:=Char($F2);
// COMArea.ComDCB.EofChar:=Char($F3);
// COMArea.ComDCB.EvtChar:=Char($F4);
COMArea.ComTimes.ReadIntervalTimeout:=0;
COMArea.ComTimes.ReadTotalTimeoutMultiplier:=2;
COMArea.ComTimes.ReadTotalTimeoutConstant:=500;
COMArea.ComTimes.WriteTotalTimeoutMultiplier:=0;
COMArea.ComTimes.WriteTotalTimeoutConstant:=0;
if(SetCommState(COMArea.ComHandle,COMArea.ComDCB)=False)then Exit;
if(SetCommTimeouts(COMArea.ComHandle,COMArea.ComTimes)=False)then Exit;
BuildDCB:=True;
end;
function COMRWF(NRd: Integer; WS: String; var RS: String): Boolean;
begin
COMRWF:=False;
COMArea.ComToWrit:=I;
COMArea.ComToRead:=NRd;
COMArea.ComWrot:=0;
COMArea.ComRead:=0;
if(PurgeComm(COMArea.ComHandle,(PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR))=False)then Exit;
Sleep(200);
if(COMArea.ComToWrit<>0)then
if(WriteFile(Cardinal(COMArea.ComHandle),COMArea.ComWritBuffer,COMArea .ComToWrit,COMArea.ComWrot,NIL)=False)or(COMArea.ComToWrit<>COMArea.Co mWrot)then Exit;
if(COMArea.ComToRead<>0)then
if(ReadFile(Cardinal(COMArea.ComHandle),COMArea.ComReadBuffer,COMArea. ComToRead,COMArea.ComRead,NIL)=False)then Exit;
COMRWF:=True;
end;

}

procedure TForm1.Button4Click(Sender: TObject);
var ByteReaded,procitanie:cardinal;
s,rez:string;

begin
//application.ProcessMessages;
S:=EDIT1.Text;
s:=s+#13;
writefile(hcom,s[1],length(s),ByteReaded,nil);
label5.Caption:='записано в порт '+inttostr(ByteReaded-1)+' байт';
setlength(rez,65536);
FillChar(Rez[1],65536, 0);
sleep(100);
ReadFile(hcom,rez[1],65536,procitanie,nil);
Rez:=Copy(rez,0,procitanie);
Rez:=StringReplace(Rez,#13#10,' ',[rfReplaceAll]);
Rez:=StringReplace(Rez,#13,' ',[rfReplaceAll]);
Rez:=StringReplace(Rez,#10,' ',[rfReplaceAll]);
memo1.Lines.Add('<команда> '+edit1.Text);
memo1.Lines.Add('');
memo1.Lines.Add('<ответ> '+rez);
memo1.Lines.Add('');
end;

procedure TForm1.ColorButton1Click(Sender: TObject);
begin
Button4Click(Sender);
end;

procedure TForm1.ColorButton2Click(Sender: TObject);
begin
Button1Click(sender);
end;

procedure TForm1.ColorButton3Click(Sender: TObject);
begin
Button2Click(sender);
end;

end.



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 18 октября 2007 10:48
· Личное сообщение · #10

sER клевая статья , а откуда она , может там(сайте) еще что интересного есть ?

ЗЫ h**p://www.happytown.ru/resume.html не робит



Ранг: 72.3 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 18 октября 2007 11:18
· Личное сообщение · #11

Grom_, ты спрашивай что интересует =)
многие хорошие сайты уже канули в лету....



Ранг: 72.3 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 18 октября 2007 11:25
· Личное сообщение · #12

если интересует именно happytown, попробуй так:
web.archive.org/web/*/http://www.happytown.ru/



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 02 ноября 2007 12:46
· Личное сообщение · #13

Всем, кто пойдёт по моему тёмному пути - не забивайте на таймауты!!!
Из-за того что я забил на это, огрёб кучу проблем. Когда добился передачи данных, получалось получить только первые 8 байт за раз и всё! Ипался, ипалося... Оказалось, он не ждал все данные, что успел, то и выводил.
Вообщем, кому понадобится - полностью рабочий пример:
.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
GetMsg PROTO
SendMsg PROTO

.data
dlgname db "MAIN",0
szerr db "Error",0
texst db "Text",0
errmes db "Error open COM1",0
lineErr db "Line now bisy", 0
com db "COM1",0
over OVERLAPPED <>
time COMMTIMEOUTS <>
dcb DCB <>
endprog db 0
data db 300 dup (0)
buffer db 300 dup (0)
.data?
hInstance dd ?
ThreadID dd ?
hWnd dd ?
flag db ?
dwSignal dd ?
hList dd ?
hBox dd ?
hCom dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
invoke ExitProcess,eax


WndProc proc hWin:DWORD,
uMsg:DWORD,
wParam:DWORD,
lParam:DWORD

pusha
.if uMsg == WM_INITDIALOG
mov eax, hWin
mov hWnd, eax
invoke LoadIcon,hInstance,100
invoke SendMessage,hWin,WM_SETICON,1,eax
invoke GetDlgItem,hWin,1000
mov hList,eax
invoke GetDlgItem,hWin,2000
mov hBox,eax
invoke SetFocus, hBox
call InitCom
invoke CreateThread,0,0,GetMsg, 0, 0, 0
mov ThreadID, eax
.elseif uMsg == WM_COMMAND
mov eax, wParam
.if wParam == 100 ; кнопка Send
invoke GetDlgItemText, hWin, 2000, ADDR buffer, 300
call SendMsg
.endif
and eax,0FFFFh
.if eax == 1000 ; Listbox
mov eax,wParam
shr eax,16
.if eax == LBN_DBLCLK
invoke SendMessage,hList,LB_GETCURSEL,0,0
invoke SendMessage,hList,LB_GETTEXT,eax,ADDR buffer
invoke MessageBox,hWnd,ADDR buffer,ADDR texst,MB_OK
.endif
.endif
.elseif uMsg == WM_CLOSE
call CloseCom
invoke EndDialog,hWin,0
.endif
popa
xor eax,eax
ret
WndProc endp

InitCom proc
invoke CreateFile,addr com, GENERIC_READ or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL
mov hCom, eax
.if hCom == INVALID_HANDLE_VALUE
invoke MessageBox,hWnd,addr errmes,addr szerr,MB_OK
ret
.endif
invoke GetCommState, hCom, addr dcb
mov dcb.BaudRate, CBR_2400
mov dcb.ByteSize, 8
mov dcb.StopBits, ONESTOPBIT
mov dcb.Parity, ODDPARITY
mov time.ReadIntervalTimeout, 100
mov time.ReadTotalTimeoutMultiplier, 0
mov time.ReadTotalTimeoutConstant, 0
mov time.WriteTotalTimeoutMultiplier, 0
mov time.WriteTotalTimeoutConstant, 0
invoke SetCommTimeouts, hCom, addr time
invoke SetCommState,hCom, addr dcb
invoke SetCommMask, hCom, EV_RXCHAR
invoke GetCommMask, hCom, dwSignal
xor eax, eax
ret
InitCom endp

GetMsg proc
local bytes:DWORD
loopget:
invoke WaitCommEvent,hCom, addr dwSignal, NULL
invoke ReadFile,hCom, addr data, sizeof data, addr bytes, NULL
invoke SendMessage,hList,LB_ADDSTRING,NULL,addr data ;and add it to the list box
jmp loopget
ret
GetMsg endp

SendMsg proc
local bytes:DWORD

invoke TerminateThread, ThreadID, 0
invoke PurgeComm, hCom, PURGE_TXCLEAR
invoke SetupComm, hCom, 1024, 1024
invoke WriteFile, hCom, addr buffer, sizeof buffer, addr bytes, NULL
invoke CreateThread,0,0,GetMsg, 0, 0, 0
mov ThreadID, eax
ret
SendMsg endp

CloseCom proc
invoke TerminateThread, ThreadID, 0
invoke CloseHandle, hCom
mov hCom, 0
ret
CloseCom endp
end start



 eXeL@B —› Программирование —› COM1 иже с ним
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати