tomy 发表于 2010-6-23 11:13:59

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;

tomy 发表于 2010-6-23 13:26:57

单步进行调试的时候发现Memo2的内容与发送的相符,可是一运行起来的时候接收到的不不知道怎么不行,总是丢最好两个(共发送4个数据)

忘记说了,我这是在同一台机子上试的,直接将串口的2.3两脚短接的!

还请各位前辈们指点一下,非常感谢!

tomy 发表于 2010-6-23 14:34:13

改变模式: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;

tomy 发表于 2010-6-25 08:44:33

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


以上是我的判断,各位高手帮忙指点一下!这种问题要如何处理呢?

tomy 发表于 2010-6-25 08:53:55

./emotion/em045.gif

怎么都两天多了,还没有人进来帮帮忙呢???./emotion/em115.gif

tomy 发表于 2010-6-25 15:34:21

今天发现另一个问题!

用MSCOMM控件发送时:

mscomm1.output := char($a5);

用这句发送时,发现接收到的数据是00;

这个是因为CHAR型是ASCII的,所以超过$80后就转换不了了!!

tomy 发表于 2010-6-26 13:54:56

经查询相关资料,采用以下方式解决发送的问题
var
    s1 : variant;
         :
         :
begin
    s1 := VarArrayCreate(,varbyte);
          :
          :
    s1 := $cd;
    form1.mscomm1.output := s1;


另,将串2,3短接,用单步调试,发现从output及Input中读回来的值是相同的.
说明发送与接收的数据是相同,那显示出来的内容不相同就是数据处理的问题了!


./emotion/em087.gif

tomy 发表于 2010-7-3 14:44:01

没气氛,,,我发了这么多天的东西,没一个人来搭理的!!

./emotion/em101.gif./emotion/em103.gif
我太伤心了~~~

lonczkw 发表于 2010-10-13 20:23:09

我顶

hehanlou 发表于 2010-10-30 17:26:48

顶顶更健康
页: [1]
查看完整版本: DELPHI初学者在编写MSComm串口时遇到发送与接收不一致的问题!