毕业设计中,大侠们 SOS~~与单片机的通讯,我用SPCOMM 要实现下面功能,你们说这样可以吗? ( 积分: 100 )

  • 主题发起人 主题发起人 liuzt23
  • 开始时间 开始时间
L

liuzt23

Unregistered / Unconfirmed
GUEST, unregistred user!
毕业设计演示的要求是两台电脑间的模拟.我做的是指纹门禁的控制软件.要求是:如果我收到01.(开门指令)我就发送开门的指令.就发送0F...
我在一个例子上弄了这样的程序

发送
procedure TForm1.Button1Click(Sender: TObject);
begin
Comm1.WriteCommData(Pchar(Memo1.Text),Length(Memo1.Text));
end;
接收
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ReceivedString:String;
begin
SetLength(ReceivedString,Bufferlength);
Move(Buffer^,PChar(ReceivedString)^,BufferLength);
Memo2.Text:=ReceivedString;
end;
这样子,能不能实现一个一个字节的发送和接收?
还有这样子在Memo中能实现吗?
是不是还要在接收或发送间汤加延时的?
 
毕业设计演示的要求是两台电脑间的模拟.我做的是指纹门禁的控制软件.要求是:如果我收到01.(开门指令)我就发送开门的指令.就发送0F...
我在一个例子上弄了这样的程序

发送
procedure TForm1.Button1Click(Sender: TObject);
begin
Comm1.WriteCommData(Pchar(Memo1.Text),Length(Memo1.Text));
end;
接收
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ReceivedString:String;
begin
SetLength(ReceivedString,Bufferlength);
Move(Buffer^,PChar(ReceivedString)^,BufferLength);
Memo2.Text:=ReceivedString;
end;
这样子,能不能实现一个一个字节的发送和接收?
还有这样子在Memo中能实现吗?
是不是还要在接收或发送间汤加延时的?
 
这个很难说,要看着设备来的,不同的设备会有不同的情况,有些要加延时,有些也不需要,但从稳定的角度出发,一般还是有个选项可控延时的时间会较好一些。你还是得就着你自己的设备来测试,问别人没多大作用的
 
我到时的测试要求就是两台电脑间的,这需要延时 吗
 
还有上面的程序能读取 meno里的每一个字节吗,由于是新手,所以上面的程序还不是很明白
 
如果是非可见字符,你在memo中是实现不了的,你是看不到的
 
找两个机子做个串口线实际测试啊,

你在memo里显示的话最好还是用16进制显示嘛,这样ASCII为01,0F这样的还是看的很明白的。。
 
现在人家的电脑在用着.所以过会就弄
出问题了再向你们请教...
先谢你们了哦
 
弄不懂了,郁闷了,兄弟们能帮忙看看吗
一个例子程序是这样的:
procedure TForm1.Button2Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex=0 then
Comm1.CommName:='COM1'
else
Comm1.CommName:='COM2';
Comm1.StartComm;
Label7.Caption:='串口已经打开,可以测试';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Comm1.StopComm;
Label7.Caption:='串口尚未打开';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Comm1.StopComm;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Comm1.WriteCommData(Pchar(Memo1.Text),Length(Memo1.Text));
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ReceivedString:String;
begin
SetLength(ReceivedString,Bufferlength);
Move(Buffer^,PChar(ReceivedString)^,BufferLength);
Memo2.Text:=ReceivedString;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
case CB_BaudRate.ItemIndex of
0: Comm1.BaudRate:=9600;
1: Comm1.BaudRate:=4800;
2: Comm1.BaudRate:=2400;
3: Comm1.BaudRate:=1200;
end;

if CB_ParityCheck.ItemIndex=0 then
Comm1.ParityCheck:=false
else
Comm1.ParityCheck:=True;

if CB_ParityValue.ItemIndex=0 then
Comm1.Parity:=Mark
else
Comm1.Parity:=None;

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if Comm1.DtrControl=DtrEnable then
begin
Comm1.DtrControl:=DtrDisable;
Shape1.Brush.Color:=clWhite;
end
else
begin
Comm1.DtrControl:=DtrEnable;
Shape1.Brush.Color:=clRed;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if Comm1.DtrControl=DtrEnable then
Shape1.Brush.Color:=clRed;

if Comm1.RtsControl=RtsEnable then
Shape2.Brush.Color:=clRed;

Label7.Caption:='串口尚未打开';
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
if Comm1.RtsControl=RtsEnable then
begin
Comm1.RtsControl:=RtsDisable;
Shape2.Brush.Color:=clWhite;
end
else
begin
Comm1.RtsControl:=RtsEnable;
Shape2.Brush.Color:=clRed;
end;
end;

这是可以实现的,而我弄了一下,把它编辑成这样 却怎么弄都不行,真搞不懂了,编译也是通过的
procedure TForm2.Button2Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex=0 then
Comm1.CommName:='COM1'
else
Comm1.CommName:='COM2';
Comm1.StartComm;
statusbar1.Panels[3].Text:='串口已经打开,可以测试';
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
Comm1.StopComm;
statusbar1.Panels[3].Text:='串口尚未打开';
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Comm1.StopComm;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
case CB_BaudRate.ItemIndex of
0: Comm1.BaudRate:=9600;
1: Comm1.BaudRate:=4800;
2: Comm1.BaudRate:=2400;
3: Comm1.BaudRate:=1200;
end;

if CB_ParityCheck.ItemIndex=0 then
Comm1.ParityCheck:=false
else
Comm1.ParityCheck:=True;

if CB_ParityValue.ItemIndex=0 then
Comm1.Parity:=Mark
else
Comm1.Parity:=None;

end;

procedure TForm2.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ReceivedString:String;
begin
SetLength(ReceivedString,Bufferlength);
Move(Buffer^,PChar(ReceivedString)^,BufferLength);
Memo1.Text:=ReceivedString;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
statusbar1.Panels[1].Text:=timetostr(time);
end;
我只是把它的DTR,RST什么状态输出的给删了,这个是问题的所在吗?
 
还有就是,我那个网上广为流传的 SPCOMM教程是不是有错误的,我把它改成下面这样了,可还是不行,能告诉我错在哪里吗?我是一台机子上用调试助手来弄的
var
fcomm: Tfcomm;
viewstring:string;
rbuf,sbuf:array [0..64] of byte;




implementation

{$R *.dfm}
procedure TFCOMM.FormShow(Sender: TObject);

begin

comm1.StartComm;

end;

//关闭串口

procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);

begin

comm1.StopComm;

end;

//自定义发送数据过程

procedure senddata;

var

i:integer;

commflg:boolean;


begin

viewstring:='' ;

commflg:=true;

for i:=1 to 6 do

begin

if not fcomm.comm1.writecommdata(@sbuf,1) then

begin

commflg:=false;

break;

end;

//发送时字节间的延时

sleep(2);
viewstring:=viewstring+inttohex(sbuf,1)+'';
end;

viewstring:=viewstring;

fcomm.memo1.Lines.Add(viewstring);

fcomm.memo1.lines.add('');

if not commflg then messagedlg('发送失败 !' ,mterror,[mbyes],0);

end;

//发送按钮的点击事件

procedure TFCOMM.Btn_sendClick(Sender: TObject);

begin

sbuf[1]:=byte($f0); //帧头

sbuf[2]:=byte($01); //命令号

sbuf[3]:=byte($ff);

sbuf[4]:=byte($ff);

sbuf[5]:=byte($01);

sbuf[6]:=byte($f0); //帧尾

senddata;//调用发送函数

end;

//接收过程

procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);

var

i:integer;


begin

viewstring:='';

move(buffer^,pchar(@rbuf)^,bufferlength);

for i:=1 to bufferlength do

viewstring:=viewstring+inttohex(rbuf,2)+'';

viewstring:='接收'+viewstring;

memo1.lines.add(viewstring);

memo1.lines.add('');

end;
 
以前也作过类似的开发,主要是延时问题。
这个问题应该在单片机部分解决。
用两台电脑测不出效果的。
(电脑上完全正确,可一联单片机就错误百出)
 
" delphi与rs-232串行通信控制 "这本书挺好的。主要讲的就是电脑与单片机之间的通信。
里面有个自己写的串行通信控件,功能不多。但够用了。以前就是参考这个做的。
 
可是我在电脑中也出不来啊。。这个问题不就很大了。。我看了半天的程序没看出个所以然来,你能不能跟我讲下啊
 
我下星期毕业答辩,我的程序就剩这个问题了
我们到时候的要求就是在电脑里实现就可以了,我们组负责做硬件的没做出来。。
我做的是指纹门禁的管理系统,其实要求很简单,就是能读个协议上的指令,然后根据协议再发送指令,这样的实现根据你们的经验难吗?
 
知道的,能不能帮帮小弟啊,别嫌分少啊,因为我是新手已没分了~~
改日定当重谢~~
今晚要交论文给老师了,所以晚上怎么样都要搞定。。。。所以,大侠们~~~
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
626
import
I
后退
顶部