串口开发群:2000202!!!怎样用Delphi进行开发与单片机通信的软件,请各位高手帮忙!!!!!!!! ( 积分: 100 )

  • 主题发起人 主题发起人 fsh8205-1
  • 开始时间 开始时间
F

fsh8205-1

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样用Delphi进行开发与单片机通信的软件,高手们请赐教.最好给个完整的实列,分不够可以再加.谢谢!
可以的话也可以发到我邮箱:Gfansenhua@163.com
或都加入我的串口群一起讨论:2000202 QQ:122128801
 
怎样用Delphi进行开发与单片机通信的软件,高手们请赐教.最好给个完整的实列,分不够可以再加.谢谢!
可以的话也可以发到我邮箱:Gfansenhua@163.com
或都加入我的串口群一起讨论:2000202 QQ:122128801
 
串口通讯用控件或用文件方式打开串口读写。
 
前几天刚写了一个
下面是摘了主要的几个函数
你看看
稍作改动就可以用
type
TComm = Class(TThread)
protected
procedure Execute; override;
end;

Procedure TComm.Execute;
var
dwEvtmask, dwOvres, bb : Dword;
RXFinish : Bool;
begin
FreeOnTerminate := True;
while not Terminated {true} do
begin
DwEvtMask:=0;
RXFinish:=WaitCommEvent(hcom,dwevtmask,@LpolR); //等待串口事件EV_RXCHAR
if not RXFinish then //如果返回True,已立即完成,否则继续判断
if GetLastError()=ERROR_IO_PENDING then //正在接收数据
begin
bb:=WaitForSingleObject(LpolR.hEvent,20);//等待500ms
Case bb of
Wait_Object_0: RXFinish:=GetOverLappedResult(hcom,LpolR,dwOvRes,False);
//返回False,出错
Wait_TimeOut: RXFinish:=False;//定时溢出
else RXFinish:=False; //出错
end;
end else RXFinish:=False;
if RXFinish then
begin
if WaitForsingleobject(Post_Event,infinite)=Wait_Object_0 then //等待同步事件置位
begin
resetEvent(Post_Event); //同步事件复位
PostMessage(Form1.handle,WM_CommNotify,0,0); //发送消息
//这里触发串口接收事件
end;
end;
sleep(1);
end;
end;

Procedure TForm1.MsgComm(Var Msg:Tmessage); //接收数据
var
clear : boolean;
coms : TComStat;
cbNum, Cbread, lpErrors : Dword;
i, j, CheckSum : integer;
s : Array[0..7] of Byte;
str : String;
ScrolBar : TScrollStyle;
begin
clear := clearCommerror(hcom,lperrors,@Coms);
if clear then
begin
cbNum :=Coms.cbInQue; //获取接收缓冲区待接收字节数
ReadFile(hcom,s,cbnum,Cbread,@LpolR); //读串口
SetEvent(Post_Event); //同步事件置位
str := '';
for i := 0 to Cbread-1 do
begin
ArrRec := s;
str := str + IntToHex(ArrRec,2) + ' ';
end;
Memo2.Lines.Add(str);
sleep(2);

// 接收数据判断并响应
end;

end;
Function TForm1.WriteStr(StrArr : Array of Byte):Boolean; //发送数据
var
DwCharsWritten,DwRes:Dword;
BRes : boolean;
Len : Integer;
Begin
Len := Length(StrArr);
BRes:=False;
if hcom<>INVALID_HANDLE_VALUE then
begin
DwCharsWritten:=0;
BRes:=WriteFile(Hcom,StrArr,Len,
DwCharsWritten,LpolW); //返回True,数据立即发送完成
if not BRes then
begin
if GetLastError()=Error_IO_Pending then
begin //正在发送数据
DwRes:=WaitForSingleObject(LpolW^.hEvent,Infinite);
if DwRes=Wait_Object_0 then // 如果不相等,出错
BRes:=GetOverLappedResult(hcom,LpolW^,DwCharsWritten,False) //返回False,出错
else BRes:=true; //数据发送完成
end;
end;
end;
Result:=Bres;
end;

Procedure TForm1.CommInitialize;
Var
Lpdcb:TDCB;
Comm : Pchar;//String;
BoudRate : Cardinal;
begin
BoudRate := StrToInt(ComBoBox2.Text);
Comm := Pchar(ComBoBox1.Text);
hcom := createFile(Comm, //串口,可为com1-com4
generic_read or Generic_write,//访问模式
0, //共享模式,必须为0
nil, //安全属性指针
open_existing, ///找开方式必须为open_existing
File_Flag_Overlapped,//文件属性,本文设为交迭标志
0); //临时文件句柄,必须为0
if hcom<>invalid_Handle_Value then
begin
SetupComm(hcom,4096,4096); //设置缓冲区长度
getCommState(hcom,lpdcb); //设置串口
// BuildCommDCB('baud=BoudRate parity=N data=8 stop=1',Lpdcb);
lpdcb.BaudRate := BoudRate;
lpdcb.ByteSize := 8;
setCommState(hcom,lpdcb);
SetCommMask(Hcom,ev_Rxchar); //设置串口事件屏蔽
end else showMessage('无法打开串口!');

end;
 
直接调用api 的
用控件的更简单
以前好多帖子的,自己搜一下
 
用spcomm控件就能实现呀
 
// 这也也有必要
// 初始化内存分配


New(lpolW);
// New(lpolR);
LpolW^.Internal:=0;
LpolW^.InternalHigh:=0;
LpolW^.Offset:=0;
LpolW^.OffsetHigh:=0;
LpolW^.hEvent:=Createevent(nil,true,False,nil);
{ LpolR^.Internal := 0;
LpolR^.InternalHigh:=0;
LpolR^.Offset:=0;
LpolR^.OffsetHigh:=0;}
FillChar(lpolR, SizeOf(lpolR),0);
Lpolr.hEvent:=Createevent(nil,true,False,nil);
PurgeComm(Hcom,Purge_TxAbort or Purge_RxAbort or Purge_Txclear or Purge_Rxclear);
Post_Event:=Createevent(nil,true,true,nil);
 
uiit:你好!
可以到我的群里来讨论讨论这个问题吗?
你有没有做过用Delphi与单片机通信这方面的软件啊,可以给我些例子看看吗?
因为我因为刚刚接触这块的初学者比较笨,让你见笑了!
 
sorry!
讨论也要过几天
上面我用过的例子
你可以拿去用的
 
uiit:我用了一下你例子可是发出后竟然接收不到另何数据.你的代码可以再说清楚一点吗?
 
TComm 是创建的监听串口线程
MsgComm 是从串口接收数据的消息事件
WriteStr 发送16进制数
你可以随便改动为放松字符串或其他
CommInitialize 串口的初始化(串口打开、以及一些串口参数设置波特率、校验位
.. 很多,你可以只设几个,其他的一般用不着,用的话去看一下相关资料)
下面的是一些有关内存分配的
你可以在formcreate里照写不用管他
我这里处理的不好,不过能用,没有时间去改他
有些可以不用设置全局
 
uiit:好呀,真是太谢谢你了!不过我还是有点不太明白,可以给我发个详细一点注释的(Delphi与单片机通信)这方面的例子吗?
 
hehe ,以上是我从以前的程序里摘的,基本功能都可以实现哈
(毕竟属于公司)不可能把整包打给你了
这个程序的注释也就那么多
想了解多,多看看书吧
这方面书多的要不完
 
Uiit:可是我们这边很少这方面的书啊.可以到我群里来聊聊吗?
 
公司不上q,机子也没装
有什么问题发邮箱了
共同探讨
sxd269@163.com
 
楼主的问题好奇怪,单片机与其它设备的方法有很多种,你指哪一种呢?对Delphi来讲,只要确定了通信类型就行了.比如说单片机通过串口与外部通信,Delphi可以用mscomm控件或API来完成通信代码.反过来说,Delphi开发的串口通信既可用于单片机,也同样可用于PC机或嵌入式设备,只要双方遵循事先的约定的协议.我用Delphi开发与单片机通信的软件时,一般都要用Delphi再写一个单片机的仿真程序,这样可以方便自己的调试,也容易发现问题.
 
Su37:你说的,我还是有点不是很明白,我只是想要用Delphi来开发一个软件来测试我们公司的单片机完成后有没有什么地方是错误的.(就是我的这个软件是通过串口来以我们的单片机进行通信的),然后把所有的正确与错误报告反映到前台来,就OK啦!!!!!你可不可以把你以前做过的这样的软件发个给你做做参考呀? 谢谢!!!!!!
 
Uiit:好的到时候我一定会来向你讨教的.
 
用mscomm可能会更方便一点,比控件更简单更直接!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部