Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Программирование —› COM1 иже с ним |
Посл.ответ | Сообщение |
|
Создано: 16 октября 2007 09:29 · Личное сообщение · #1 Очень нужен пример пересылки сообщения через COM1 средствами API. Асм, си, неважно. Сообственное есть, но: Данные не посылает (WriteFile возвращает 0) Данные не принимает (Не реагирует на событие) Или может кто найдёт косяк в моём сорце? Вроде всё правильно, но них*** не работает... .386
|
|
Создано: 16 октября 2007 09:58 · Личное сообщение · #2 |
|
Создано: 16 октября 2007 10:06 · Личное сообщение · #3 |
|
Создано: 16 октября 2007 10:13 · Личное сообщение · #4 |
|
Создано: 16 октября 2007 10:15 · Личное сообщение · #5 |
|
Создано: 16 октября 2007 10:32 · Личное сообщение · #6 |
|
Создано: 16 октября 2007 10:50 · Личное сообщение · #7 |
|
Создано: 16 октября 2007 11:48 · Личное сообщение · #8 |
|
Создано: 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. |
|
Создано: 18 октября 2007 10:48 · Личное сообщение · #10 |
|
Создано: 18 октября 2007 11:18 · Личное сообщение · #11 |
|
Создано: 18 октября 2007 11:25 · Личное сообщение · #12 |
|
Создано: 02 ноября 2007 12:46 · Личное сообщение · #13 Всем, кто пойдёт по моему тёмному пути - не забивайте на таймауты!!! Из-за того что я забил на это, огрёб кучу проблем. Когда добился передачи данных, получалось получить только первые 8 байт за раз и всё! Ипался, ипалося... Оказалось, он не ждал все данные, что успел, то и выводил. Вообщем, кому понадобится - полностью рабочий пример: .386
|
eXeL@B —› Программирование —› COM1 иже с ним |