求助 SPCOMM串口在发送过程中接受 接受到的数据

Flash card 11天前 166

这个是串口发送的代码:
function SEND_COMMAND(SD: ansistring; var RD: PansiChar): INTEGER; stdcall;
var
  N2: REAL;
  B: BOOLEAN;
begin
  if READ_BUSY then
  begin
    RESULT := 0;
    EXIT;
  end;
  if not PORT_ACTIVE then
  begin
    RESULT := -1;
    EXIT;
  end;
  READ_BUSY := TRUE;
  RECEIVE_FINISH := FALSE;
  START_TIMES := NOW;
//  S_DATA := '';
  MYCOM.WriteCommData((PansiChar(HexStrToStr(SD))), Length(HexStrToStr(SD)));
//  MYCOM.WriteCommData(PansiChar(SD), Length(SD));
  B := FALSE;
  while not RECEIVE_FINISH do
  begin
      APPLICATION.ProcessMessages;    //将此处改为sleep(0)
    delay(1);
    N2 := NOW - START_TIMES;
    N2 := N2 * 100000000;
    B := N2 > OVERTIME; //OverTime;   //超时时间    毫秒
    if B then
      BREAK;
  end;
  if B then
    RESULT := -2    // 超时没有返回值
  else
    RESULT := 1;
  ShowMessage(S_DATA);
  RD := PansiCHAR(S_DATA);
    //SetLength(RD,256);
    //Move(S_DATA[1], RD^, length(S_DATA));
  S_DATA := '';
  READ_BUSY := FALSE;
   {返回值解释
  0: 串口忙
  -1:串口被未打开
  1: 串口打开成功
  -2:串口打开失败
  }
end;

这个是串口接收的代码:
procedure TMYOBJ.MYComReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
var
  S1: ansistring;
begin
  RECEIVE_FINISH := false;
  START_TIMES := NOW;
  SetLength(S1, BufferLength);
  MOVE(Buffer^, PAnsiCHAR(S1)^, BufferLength);
    //S_DATA := S_DATA + S1;//原
  S_DATA := StrToHexStr(S1);
  showmessage('接受:' + s_Data);
  if POS('BB', S_DATA) > 0 then
    RECEIVE_FINISH := TRUE;
//  if Length(S_DATA) >= 10 then
//    RECEIVE_FINISH := TRUE;
Application.ProcessMessages;
end;


电脑连接了单片机  当串口发送了一些数据之后,单片机会返回一些数据(即触发了MYComReceiveData事件),在MYComReceiveData中定义了
S_DATA全局变量 当执行了SEND_COMMAND后  MYComReceiveData里的showmessage 可以显示S_DATA的值,可是在SEND_COMMAND里面却接受不到S_Data的值


往大神们指点指点,百度了好几天没有找到原因。实在没有办法论坛发帖求助!


最新回复 (8)
  • 能不能不在send_command中读取? 在外部有一个时钟?
  • 或者用一个控件实时显示receive_finish和s_data的值, 看看到底哪里出错了
  • Flash card 11天前
    引用 4
    碧树西风 或者用一个控件实时显示receive_finish和s_data的值, 看看到底哪里出错了
    用控件实时显示没有问题 ,可以显示出来  但是变量就是不可以了
  • Flash card 用控件实时显示没有问题 ,可以显示出来 但是变量就是不可以了
    变量不可以显示? 转换成字符串, 显示到label上吧
  • Flash card 11天前
    引用 6
    变量获取不到值。
  • Flash card 11天前
    引用 7
    碧树西风 变量不可以显示? 转换成字符串, 显示到label上吧
    我单步调试的时候  
    我再Send_commd 里面设了一个断点  在MYComReceiveData里也设置了一个断点   
    发现先进Send_commd的断点  等Send_commd里全部跑完之后才能进MYComReceiveData
    所以在Send_Commd 里获取不到MYComReceiveData中的值对吗?
  • 可能和进程控制有关。 换个方法吧, 用一个Timer,应该可以搞定。
    不要在一棵树上吊死,多试几棵
  • 要写多线程,在线程里等待。主线程里不能等待,否则出问题。
返回
发新帖