小弟我使用readfile 和writefile对串口读写,哪位老大帮我编个小例子,小弟感激不尽!
解决方案 »
- ListView的CustomDrawItem可以用什么消息截获?
- 今天心情很好,大家来讲笑话吧
- WM_SYSCOMMAND, SC_Maximize,的意义?
- 关于ADO的问题,请高手指点!
- Aersdesign报表问题,不知各位遇到过没有。
- http://www.1931-9-18.org/bbs/dispbbs.asp?boardID=235&ID=10244 勿忘国耻!!!
- 看看这个错误怎么办?(无法为更新行集定位。。。。。)
- ly_liuyang(Liu Yang) 进来看。
- 过年啦,领分啦,风云公开测试啦......集信息管理,多媒体播放(FLASH,影视,歌曲),图片浏览,网页浏览于一体的...Faint,先用用再说
- 第一次提问:有关findkey查询数据库记录。
- 谁有没有关于串口方面 的资料。如串口方面的组件等!高分相送
- mediaplayer控件播放的问题!已经问过几次了!有知道的吗?在线等待!
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,Unit2;type
TForm1 = class(TForm)
rdCOM: TRadioGroup;
Label1: TLabel;
mSend: TMemo;
Label2: TLabel;
mReceive: TMemo;
btnOpenPort: TButton;
btnSend: TButton;
btnEnd: TButton;
btnClear: TButton;
procedure btnSendClick(Sender: TObject);
procedure btnClearClick(Sender: TObject);
procedure btnOpenPortClick(Sender: TObject);
procedure btnEndClick(Sender: TObject);
procedure mKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
ReadThread:TReadThread;//声明读取数据的线程
end;var
Form1: TForm1;
hComm: THandle;
implementation{$R *.DFM}procedure TForm1.btnSendClick(Sender: TObject);
var
Temp:string;
lrc:LongWord;
begin
if (hComm=0) then exit;//若尚未打开通信端口,则跳出
Temp:=mSend.Text ;//欲送出的数据
//执行送出的函数
WriteFile(hComm,Pointer(Temp)^,Length(Temp), lrc, nil); //送出数据
end;//以下是清除显示数据按钮按下时的执行程序代码
procedure TForm1.btnClearClick(Sender: TObject);
begin
mReceive.Clear; //将接收区清除
end;//以下是打开通信端口的函数
procedure TForm1.btnOpenPortClick(Sender: TObject);
var
cc:TCOMMCONFIG;
Temp:string;
begin
//Temp:='COM'+inttostr(rdcom.ItemIndex+1); // 选择所要打开的COM
Temp:='COM1';
hComm:=CreateFile(PChar(Temp), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0);// 打开COM
if (hComm = INVALID_HANDLE_VALUE) then begin//如果COM 未打开
MessageBox (0, '打开通信端口错误!!','',MB_OK);
exit;
end; GetCommState(hComm,cc.dcb); // 得知目前COM 的状态
cc.dcb.BaudRate:=CBR_115200; // 设置波特率为9600
cc.dcb.ByteSize:=8; //字节为 8 bit
cc.dcb.Parity:=NOPARITY; // Parity 为 None
cc.dcb.StopBits:=ONESTOPBIT;// 1 个Stop bit if not SetCommState(hComm, cc.dcb) then begin// 设置COM 的状态
MessageBox (0, '通信端口设置错误!!!','',MB_OK);
CloseHandle(hComm);//关闭通信端口
exit;
end;
end;
//结束系统的按钮
procedure TForm1.btnEndClick(Sender: TObject);
begin
CloseHandle(hComm);//关闭通信端口
close;//结束程序
end;
//当于Memo对象中按下按钮后,执行以下的程序
procedure TForm1.mKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then btnSendClick(btnSend);//按下Enter才执行
end;//窗体建立时执行以下的程序
procedure TForm1.FormCreate(Sender: TObject);
begin
//建立线程对象,并且激活执行
ReadThread:=TReadThread.Create(False);
end;//窗体关闭时执行以下的程序
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ReadThread.Free; //释放对象
end;
end.
Windows,Classes, SysUtils;type
TReadThread = class(TThread)
private
{ Private declarations }
procedure ReadPort; //读取串行端口数据
protected
procedure Execute; override;
end;implementation
uses Unit1; // 声明引用Unit1,必须放在implementation区段function ReadHex(AString:string):integer;
begin
Result:=StrToInt('$'+AString)
end;function UnicodeToAnsi(Unicode: string):string;
var
s:string;
i:integer;
j,k:string[2];
begin
i:=1;
s:='';
while i<Length(Unicode)+1 do begin
j:=Copy(Unicode,i+2,2);
k:=Copy(Unicode,i,2);
i:=i+4;
s:=s+Char(ReadHex(j))+Char(ReadHex(k));
end;
if s<>'' then
s:=WideCharToString(PWideChar(s+#0#0#0#0))
else
s:='';
Result:=s;
end;procedure TReadThread.Execute;
begin
{ Place thread code here }
While not Terminated do
begin
Synchronize(ReadPort);//刚才所定义的读取数据函数
end;
end;//读取串行端口的程序放在这里
procedure TReadThread.ReadPort;
var
Temp : string;
inbuff: array[0..2047] of Char;
nBytesRead, dwEvent, dwError:LongWORD ;
cs:TCOMSTAT;
begin
if (hComm=0) then exit;//先判断是否已打开通信端口
ClearCommError(hComm,dwError,@CS); //取得状态
ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
//串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
if cs.cbInQue =0 then exit;
// 数据是否大于我们所准备的Buffer
if cs.cbInQue > sizeof(inbuff) then begin
PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
exit;
end;
Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
//Temp := UnicodeToAnsi(Temp);
Form1.mReceive.Text :=Form1.mReceive.Text + Temp; // 将数据显示于Memo1 上
Form1.mReceive.SetFocus ;
Form1.mReceive.SelStart := Length(Form1.mReceive.Text);
Form1.mReceive.SelLength := 0; //移到最下端end;
end.
还不如用mscomm呢~
这个来得快啊~
spcomm:比较好的vcl,算是比较专业的,解剖了一下,功能比较完善。
TurboPower:公认的专业通讯控件。可以到其站点下载,开放源码了。
我在制作串口通讯软件时三种都用过,最终全部使用TurboPower!所以也推荐大家使用它。
写了个例子,基本的串口通讯都可以实现,可提供参考。
下载地址:http://www.kaer.cn/default.aspx(网站安全性较差,经常当机,如果急用,mail我)
多多指正:[email protected]