哪位老大帮我解决一下串口读写问题!

blanda 2003-06-19 10:16:13
小弟我使用readfile 和writefile对串口读写,哪位老大帮我编个小例子,小弟感激不尽!
...全文
77 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitcom 2003-06-24
  • 打赏
  • 举报
回复
多谢楼上的这位!!
jpyc 2003-06-23
  • 打赏
  • 举报
回复
mscomm:微软的东西,ActivX控件,使用简单,在VB中带的,性能一般,由于是ActivX控件,打包时需要注册好多信息,不推荐使用。
spcomm:比较好的vcl,算是比较专业的,解剖了一下,功能比较完善。
TurboPower:公认的专业通讯控件。可以到其站点下载,开放源码了。
我在制作串口通讯软件时三种都用过,最终全部使用TurboPower!所以也推荐大家使用它。
写了个例子,基本的串口通讯都可以实现,可提供参考。
下载地址:http://www.kaer.cn/default.aspx(网站安全性较差,经常当机,如果急用,mail我)
多多指正:sdwhxyr@yeah.net
李_军 2003-06-20
  • 打赏
  • 举报
回复
他要用API啊,不过我还是喜欢用SPCOMM控件,又稳定,比mscomm好多了,只不过16进字,不怎么样
李_军 2003-06-20
  • 打赏
  • 举报
回复
这都被你认出来
我去做手机短信报警程序,用串口发了
bluecyclone 2003-06-20
  • 打赏
  • 举报
回复
学习!
dingfeng1977 2003-06-20
  • 打赏
  • 举报
回复
李军,你跑去哪里了?
ksaiy 2003-06-19
  • 打赏
  • 举报
回复
太多了~
还不如用mscomm呢~
这个来得快啊~
李_军 2003-06-19
  • 打赏
  • 举报
回复
这两个单元就够了
李_军 2003-06-19
  • 打赏
  • 举报
回复
unit Unit2;

interface

uses
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.
李_军 2003-06-19
  • 打赏
  • 举报
回复
nit Unit1;

interface

uses
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.

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧