小弟想编写于串口通信的程序,主要是和单片机通信,本来是使用SSPCOM控件,但是发现到现在出现了一些问题,就是,对于发送的数据太大的就发送不出去,我是一个字节一个字节的发,好像我不敢一次发一串,因为单片机是每次只能收一个,我试过一次发一串的,单片机好像每次都只能受到第一个字节,所以改用每次发一个字节,COMFALG:=FALSE;
......
IF NOT COMM1.WRITEDATA(@SBUF,1)
THEN
COMFLAG:=TRUE;
......
IF COMFLAG THEN
SHOWMESSAGE(' SEND FAILURE');
发送600字节以下的基本上每次都可以成功,发送600-700之间的数据偶尔成功,发送700以上的一般都是显示“SEND FAILURE”;
看了sspcom的源程序,发现他定义的缓冲区是4096啊,但是我的就是不行啊!我想每次发送到600字节就主动清发送缓冲区,但是,SSPCOM好像不能清除,各位给个主意好不好啊!不想使用ACTIVEX 控件,安装时太麻烦!
......
IF NOT COMM1.WRITEDATA(@SBUF,1)
THEN
COMFLAG:=TRUE;
......
IF COMFLAG THEN
SHOWMESSAGE(' SEND FAILURE');
发送600字节以下的基本上每次都可以成功,发送600-700之间的数据偶尔成功,发送700以上的一般都是显示“SEND FAILURE”;
看了sspcom的源程序,发现他定义的缓冲区是4096啊,但是我的就是不行啊!我想每次发送到600字节就主动清发送缓冲区,但是,SSPCOM好像不能清除,各位给个主意好不好啊!不想使用ACTIVEX 控件,安装时太麻烦!
如果是用API还可以用
var
hcom:THandle;
begin
.........
hcom:=CreateFile(....
PurgeComm(hcom,PURGE_TXCLEAR);//清空发送缓冲区
PurgeComm(hCom,PURGE_RXCLEAR) //清空接收缓冲区
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, SPComm, ComCtrls;type
TForm1 = class(TForm)
Comm1: TComm;
ComboBox1: TComboBox;
BitBtn1: TBitBtn;
Edit1: TEdit;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
Memo2: TMemo;
BitBtn5: TBitBtn;
Label1: TLabel;
Label2: TLabel;
memo1: TRichEdit;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
tbuff:string;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
begin
comm1.CommName:=ComboBox1.Text;
Comm1.BaudRate:=StrToInt(Edit1.text);
Comm1.StartComm;
end;procedure TForm1.BitBtn2Click(Sender: TObject);
begin
comm1.StopComm;
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var buff:array [0..65534] of char;
count:integer;
temp:string; //凭证内容
temp1:string; //名称
begin
////////////////////////////////////
//开始接收数据
//////////////////////////////////////////////
// buff:=PChar(buffer);
// count:=integer(bufferlength);
//buff:=copy(buff,1,count);
//showmessage('l');
tbuff:='';
// setlength(buff,bufferlength);
move(buffer^,buff,bufferlength);
for count:=0 to bufferlength-1 do
tbuff:=tbuff+' '+inttohex(ord(buff[count]),2);
memo1.Text:=memo1.Text+tbuff;
end;procedure TForm1.BitBtn4Click(Sender: TObject);
begin
tbuff:='';
Memo1.Clear;
end;procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close;
end;procedure TForm1.BitBtn5Click(Sender: TObject);
var tmp:string;
pDataToWrite:array of char;
dwSizeofDataToWrite:Word;
i:byte;
begin
setlength(pdatatowrite,2560);
for i:=0 to 9 do
for dwsizeofdatatowrite:=0 to 256 do
pdatatowrite[i*256+dwsizeofdatatowrite]:=char(dwsizeofdatatowrite); Comm1.WriteCommData(pchar(pDataToWrite),2560);end;end.
我也是在朋友的上面改的,如果你要源程序,我给你发到你的email
************
* 努力学习 *
* 全为 *
*¥人民币¥*
************
2。单片机接收中断处理程序不要进行复杂耗时的运算
3。如果没有流量控制,则发送一定的字节数以后,spcomm要进行延时比如半秒
2。单片机接收中断处理程序不要进行复杂耗时的运算
3。如果没有流量控制,则发送一定的字节数以后,spcomm要进行延时比如半秒
比如说在VC中用IN、OUT类函数写个dll,给DELPHI调用就是了。
我以前做过,没发现问题。
COM口地址你自己在设备管理器的看一下,我忘了。