begin
      output:=mmsend.Text;  //在mmsend.Text输入的是41
      len:=length(output);      if len>0 then
      begin
        i:=1;
        count:=1;
        tmpvar:=vararraycreate([1,1],varbyte);
        while(i<len) do
        begin
          tmpstr:=copy(output,i,2);
          tmpstr:=lowercase(tmpstr);
          tmpint:=hextoint(tmpstr);     //输出对应十六进制的值,这里tmpint值为65
          if tmpint=-1 then
          begin
            showmessage('发送的数据格式有问题');
            exit;
          end
          else begin
                tmpvar[count]:=tmpint;
                inc(count);
                vararrayredim(tmpvar,count);
          end;
          i:=i+3;
        end;
        mscomm1.Output:=tmpvar;
      end;
end;
请问把发送的数据41给单片机的P1口,想让P1口显示的是0100 0001,这个程序应该怎么改?请大家多多指教!!

解决方案 »

  1.   

    一、在pc编程时,将第二、三脚(RD、TD)短接,自己发自己收,当验证发送的数据正确无误后,再与下位机连接调试,这样方能分清问题在上位机还是下位机;
    二、下位机代码先直接对IO口赋值,用keil进行模拟运行,观测IO端口状态是否正常,正常了后,写芯片、上电,看发光二极管亮的情况是否符合,符合了,按通讯情况修改好代码、重写芯片,再与PC连接调试。这样做好像有点多余,但在问题不能定位时,此方法有助弄清故障来自软件还是硬件。
    三、用万用表测量串口电平变换电路,如使用MAX232进行匹配的,着重检测接PC端的电压是否达到最少+-8伏(质量好的MAX232一般能超过+-10伏,如果电压不足,除芯片原因外,跟使用的电解电容有关)?MAX232的输入、输出的RD与TD有否反接?
    总的一句话:当问题出现时,自己首先心中要明确,原因到底源自哪方,PC程序(第一点验证)?芯片代码还是硬件(第二、三点验证)?
    由于你提供的情况很有限,别人很难明确指出你的问题所在,建议按上述方法细心查对吧。
      

  2.   

    51的SBUF寄存器是8位的,像要发41的话就是发一个字节的65就好了吧。
      

  3.   

    d: char;
    a,b,c: byte;c:=41;
    a:=c mod 10;
    b:=c div 10;d:=(b shl 4) or a发送 d 即可