DELPHI初学者在编写MSComm串口时遇到发送与接收不一致的问题!
请救各位前辈:以下程序中出现在问题.我点发送后,Memo2中只显示两个数据,再点一次发送时,接收到是上次发后剩余的两个数据.
从以下程序看来,我哪部份编写出问题了,请各位前辈指点下小弟(beginner).
//*********************************************
//以下部分MScomm串口的一些属性设置
//***********************************************
procedure TForm1.FormCreate(Sender: TObject);
begin
ifmscomm1.PortOpen then mscomm1.PortOpen := false;//关闭端口
mscomm1.CommPort := 1;//设置端口1
mscomm1.InBufferSize := 256;//设置接收缓冲区为256个字节
mscomm1.OutBufferSize := 256;
mscomm1.Settings := '2400,n,8,1';
mscomm1.InputLen := 1;//读到缓冲区全部内容
mscomm1.InBufferCount := 0;//清除接收缓冲区
mscomm1.OutBufferCount := 0;//清除发送缓冲区
mscomm1.RThreshold := 1;//设置 接收每个字节产生Oncomm事件
mscomm1.InputMode := cominputmodeBinary;//二进制方式
mscomm1.PortOpen := true;//打开端口
end;
//*********************************************
//以下部分是串口接收程序//些部分是转用咱论坛一个前辈贴子的(具体哪个贴忘记了)
//***********************************************
procedure TForm1.MSComm1Comm(Sender: TObject);
var
buffer:Olevariant;//mscomm1.inputmode:=cominputmodebinary
str:string;
i:integer;
begin
case mscomm1.CommEvent of
comEvReceive://串行接收事件处理
begin
if mscomm1.InputMode = comInputModeText then
str := mscomm1.Input//读出后会自动清除接收缓冲区,STR~STR
ELSE
buffer := mscomm1.Input;//读出后会自动清除接收缓冲区,buffer~buffer
edit3.Text := '';
for i := 0 to mscomm1.RThreshold-1 do //32字节HEX转换
begin
if mscomm1.InputMode = comInputModeText then
edit3.Text := edit3.Text+inttohex(byte(str),2)+' '
else
edit3.Text := edit3.Text+inttohex(buffer,2)+' ';
end;
memo2.Lines.Add(edit3.Text);
end;
end;
end;
//*******************************************
//以下是串口发送 (这部分是自定义的函数)
//***********************************************
procedure FSendcom(var DChan,Dstatu : integer);
begin
form1.mscomm1.output := char($2);
form1.MSComm1.Output := char(Dstatu);
form1.MSComm1.output := char(Dchan);
form1.MSComm1.Output := char($d);
end; 单步进行调试的时候发现Memo2的内容与发送的相符,可是一运行起来的时候接收到的不不知道怎么不行,总是丢最好两个(共发送4个数据)
忘记说了,我这是在同一台机子上试的,直接将串口的2.3两脚短接的!
还请各位前辈们指点一下,非常感谢! 改变模式:inputmode := comInputModeText,同时将发送用string的形式发送时,发现发送的与接收的一致.
//*******************************************
//以下是串口发送 (这部分是自定义的函数)
//***********************************************
procedure FSendcom(var DChan,Dstatu : integer);
var
s1:string;
begin
s1 := concat(char($2),char(Dstatu),char(DChan),char($d));
form1.mscomm1.output := s1;
end; ./emotion/em050.gif以上的程序执行时还发现一个问题!
当发送数据为字符型char($2),char($A5),char($30),char($d)时,
那么,s1的值为#2'?'#$D,通过串口发送后,用TEXT的方式读取数串口接收区,
当采用inttohex(byte(str),2)处理数据时发现,值变为:02 3F 0D
就是byte将两个''判断成是字符表示符了,"?"的ASCII对应的十六进制值是3F
以上是我的判断,各位高手帮忙指点一下!这种问题要如何处理呢? ./emotion/em045.gif
怎么都两天多了,还没有人进来帮帮忙呢???./emotion/em115.gif 今天发现另一个问题!
用MSCOMM控件发送时:
mscomm1.output := char($a5);
用这句发送时,发现接收到的数据是00;
这个是因为CHAR型是ASCII的,所以超过$80后就转换不了了!! 经查询相关资料,采用以下方式解决发送的问题
var
s1 : variant;
:
:
begin
s1 := VarArrayCreate(,varbyte);
:
:
s1 := $cd;
form1.mscomm1.output := s1;
另,将串2,3短接,用单步调试,发现从output及Input中读回来的值是相同的.
说明发送与接收的数据是相同,那显示出来的内容不相同就是数据处理的问题了!
./emotion/em087.gif 没气氛,,,我发了这么多天的东西,没一个人来搭理的!!
./emotion/em101.gif./emotion/em103.gif
我太伤心了~~~ 我顶 顶顶更健康
页:
[1]