我弄的一个通讯(spcomm)程序,
为什么当我发送指令到户外设备时,就出现信号中断呢?当我要把我的指令保存在户外设备时,就会中断,例如:我想设置户外设备的时间,当我校对时就会中断。

解决方案 »

  1.   

    好!举个例子吧。
    开始接收的是(16 02 01 01 03 00 04 01 30 03 79 e4)01,30是表示接收的参数
    发送(16 02 01 01 03 00 04 00 60 03 79 e4)到户外,其中00,60表示要改变的参数
    在发送(16 02 01 01 01 00 05 03 dc 5a),05表示发送的命令
    而接收的是(16 02 01 00 03 01 30 00 3C 03 68 9C )01,30表示接收的参数,
    按理说接收的是(16 02 01 01 03 00 04 3C 03 68 9C )
      

  2.   

    把spcomm相关的代码贴出来,我帮你看看
      

  3.   

    好的。
    procedure Tfmrz.btnyesClick(Sender: TObject);
    var
    c:integer;
    begin
      sbuf[1]:=SYNC;
      sbuf[2]:=STX;
      sbuf[3]:=01;
      sbuf[4]:=01;
      sbuf[5]:=03;
      sbuf[6]:=00;
      sbuf[7]:=04;
      if fmrz.combdw.ItemIndex=0 then
        sbuf[8]:=00
        else
        sbuf[8]:=01;
      sbuf[9]:=strtoint(txtsz.Text);
      sbuf[10]:=ETX;
      sbuf[11]:=121;
      sbuf[12]:=228;
      for c:=0 to 12 do
      begin
      if not fm.Comm1.WriteCommData(@sbuf[c],12) then
        begin
          commdlg:=false;
          exit;
        end;
        sleep(2);
      end;
      close;
      fmml.Enabled:=true;
    end;
      

  4.   

    我将WriteCommData(@sbuf[c],12)的参数12改变为1000,就出现中断信号的情况
      

  5.   

    if not fm.Comm1.WriteCommData(@sbuf[c],12) then=>  if not fm.Comm1.WriteCommData(@sbuf[c],1) then或  for c:=0 to 12 do
      begin
        if not fm.Comm1.WriteCommData(@sbuf[c],12) then
        begin
          commdlg:=false;
          exit;
        end;
        sleep(2);
      end;==>  if not fm.Comm1.WriteCommData(@sbuf[c],12) then
      begin
        commdlg:=false;
        exit;
      end;试一试看
      

  6.   

    为什么我将WriteCommData(@sbuf[c],12) 的参数改成大于12的整数就通信中断呢?
      

  7.   

    上面打错了  if not fm.Comm1.WriteCommData(@sbuf[c],12) then=>  if not fm.Comm1.WriteCommData(@sbuf[c],1) then或者  for c:=0 to 12 do
      begin
        if not fm.Comm1.WriteCommData(@sbuf[c],12) then
        begin
          commdlg:=false;
          exit;
        end;
        sleep(2);
      end;==>  if not fm.Comm1.WriteCommData(@sbuf[1],12) then
      begin
        commdlg:=false;
        exit;
      end;试一试看WriteCommData的第一个参数是发送的数据指针,第二个参数是要发送的字节数,如果字节数过多,超出分配的数据区,肯定不行
      

  8.   

    不是这个原因的,我知道了,我刚才把
      sbuf[1]:=SYNC;
      sbuf[2]:=STX;
      sbuf[3]:=01;
      sbuf[4]:=01;
      sbuf[5]:=03;
      sbuf[6]:=00;
      sbuf[7]:=04;
      if fmrz.combdw.ItemIndex=0 then
        sbuf[8]:=00
        else
        sbuf[8]:=01;
      sbuf[9]:=strtoint(txtsz.Text);
      sbuf[10]:=ETX;
      sbuf[11]:=215;
      sbuf[12]:=192;
    后面的指令改变了一下就可以发了,但是
      sbuf[11]:=215;
      sbuf[12]:=192;
    的值是变化的,我就不知道该怎么样赋值了
      

  9.   

    sbuf是不是定义为sbuf: Array [1..12] of Byte;
      

  10.   

    是的,
    sbuf: Array [1..12] of Byte;
      

  11.   

    不行吗?
    sbuf: Array [1..12] of char呢?