Memo2.Text里的内容都是16进制如下:
24 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 44 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 E7 00 ...现在我要把这些16进制通过MSCOMM控件发送到串口,但问题来了,就是如果碰到大于127的16进制(比如E7),就不会发送出去,怎么办,要发送前判断E7是否大于127吗,然后怎么处理才能发送出去呢?  s := Memo2.Text;
  while s<>'' do
  begin
  t:=t+chr(strtoint('$'+copy(s,1,2)));
  delete(s,1,3);
  end;
  MSComm1.output:= t;

解决方案 »

  1.   

    base64编码后再发不过,最好先搞清楚它为什么不支持,估计是哪里没设置好
      

  2.   

    用网络上流传的经典串口调试助手 SSCOM32 等去测试 也不能发送?
    检查一下你的接收程序 ?
      

  3.   

    MSComm1.output:= t;
    你发送不出去大于127的字符,是因为你在发送时候的数据类型不正确,即t的数据类型不正确。
    MSComm控件本身可以发送大于127的十六进制值,但要求其数据类型必须是Variant类型才可以。
      

  4.   

    不应该的啊,E7通过二进制模式发送是肯定能发送的。楼主试一试这个,这是一个串口调试器,你用它试一试,看看是不是你的程序有问题。
    http://download.csdn.net/source/1441583
      

  5.   

    用API。
    会不会是你的串口协议是7个数据位?
      

  6.   

    如果你要用MSCOMM,发送包括大于240的字符,基本上不能用
      

  7.   

    这个观点是错误的,我经常使用MSComm作为与终端装置通讯用,根本不是你说的不能用,而是你不会用:MSComm所需要的对象变量必须是Variant类型的才可以,否则就会产生类似的情况(不能发送大于127的值)
      

  8.   

    最近发现有几个使用MSComm发不了大于127的值的帖子,现说明一下为什么会有这种问题:
    这种问题可能用法是这样的:
    var s:byte; 
    begin 
      s:=171; 
      mscomm1.output:=char(s);  //通过串口按件发送数据 
    end; 
    这种用法对于MSComm来说是错误的,因为你的S定义的是Byte类型,这样的话只能发送小于127的字节。 
    请各位仔细看一下MSComm的Output类型定义,它定义的是OleVariant类型,你将其它类型的数据赋值给OleVariant类型,中间编译程序会代你进行转换,但隐式转换是会出错的!这也是为什么不能发送大于127值的原因。 
    应该这样: procedure TForm1.SendButtonClick(Sender: TObject);
    var
      Data:OleVariant;
      Bytes:Array [0..255] of Byte;
      i:integer;
    begin
      //创建Variant类型的数组,数组元素为字节类型,个数256个
      Data:=VarArrayCreate([0,255],varByte);
      //为每个数组元素赋值
      for i:=0 to 255 do
      begin
        Data[i]:=i;
      end;
      //发送这256个字节
      MSComm1.Output:=Data;
    end;
    发送结果可用其它的串口调试器接收,发现其值是从00到FF的值,中间任何一个值都不缺,也就是说发送是成功的
      

  9.   

    具体到楼主的例子,应该这样:
    Procedure Form1.Button1Click(Sender:TObject)
    var
      t:OleVariant;
      i:Integer;
      s:String;
    begin
      s:=Memo2.Text; 
      t:=VarArrayCreate([0,Length(s)/3],varByte);
      i:=0;
      while s <>'' do 
      begin     
        t[i]:=Byte(strtoint('$'+copy(s,1,2))); 
        delete(s,1,3); 
        inc(i);
      end; 
      MSComm1.output:= t;
    end;
      

  10.   

    找到了
    http://topic.csdn.net/t/20030725/09/2069612.html
      

  11.   

    继续请教一下:
    用你提供的程序,可以正确发送用下面的程序,也可能接收到并显示
    procedure TForm1.MSComm1Comm(Sender: TObject);
    var
      vtmp, ovTmp: variant;
      i, iReceived: Integer;
      bTmp: Byte;
      s: string;
    begin
      case MSComm1.commEvent of
        comEvSend:
          begin      end;
        comEvReceive:
          begin
              mscomm1.InputMode := comInputModeBinary;          iReceived := mscomm1.InBufferCount;
              ovtmp := mscomm1.Input;
              vtmp := VarArrayCreate([0, iReceived], varbyte);
              vtmp := ovtmp;
              s := '';
              for i := 0 to iReceived - 1 do
              begin
                btmp := vtmp[i];
               // s := s + chr(bTmp) //字符接收   else
                  s := s + ' '+ inttohex(ord(chr(bTmp)), 2); //16进制接收
              end;
              form1.RichEdit1.Text := form1.RichEdit1.Text + s;
              memo2.Lines.Add(s);
          end;
      end;
    end;但是我将串口的2.3脚短接的时候,程序就出错了,不知道原因,能否帮忙找找原因?以前调试程序一直就是将2.3脚短接,这样可以省一个串口或者电脑
      

  12.   

    错误就是:          iReceived := mscomm1.InBufferCount;不管发多少字节,不论如何设置, 
      MSComm1.InputLen
      MSComm1.SThreshold    
      MSComm1.RThreshold      iReceived 总是返回大于248以上的数,返回一堆00的数据,或者下标溢出,这种情况只要是不短接2,3pin时就不会出现
      

  13.   

    感觉就是十分简单的东西,让微软一做就恶心的不行了,网上那么多串口使用就是mscomm问题最多
      

  14.   

    总算找到问题了
    初始化串口的时候需要加上
      Mscomm1.InputLen   :=0;   //   Input读取整个缓冲区内容
      

  15.   

    t:=t+chr(strtoint('$'+copy(s,1,2))); 你看看你的t最大能放什么样的数据我用串口PCOMM。dll
    0~0xff都可以发送