目前我正在编写一个关于串口收发程序,通过编写接口函数进行串口发送,随后串口会接收到一个反馈帧,发送接口函数的返回值需由串口接收到的数据是否正确决定。这个串口接收程序由一个子线程完成。主要代码如下:定义全局变量:  FTW:boolean;
   strTW:string;
   strTWText:string;
//串口接收线程
procedure ComRecThread;
var ....
begin
.....
.....
  EnterCriticalSection(CS2);
  strTW:=inttohex(Recdata[4],2)+inttohex(Recdata[5],2)+inttohex(Recdata[6],2);
  strTWText:='';                           //这三行是对strTWText的赋值
  for L:=7 to WirelessLength+7-1 do        //
    strTWText:=strTWText+char(Recdata[L]); //   
  FTW:=true;
  LeaveCriticalSection(CS2); 
end;
//串口发送接口函数
function TestWireless(TagID:PChar;Param:PChar):Integer;StdCall;
var Cmd:array[0..255] of Byte;
    TickTime:DWord;
    n,i:Integer;
    str:PChar;
begin
   Result:=0;
   ...
   ...  FTW:=false;
  if SendCom(Cmd,SendLength)=0 then   //SendCom函数是往串口发送数据命令
    exit;//  strTWText:='aaaaa';              //这行是对strTWText的赋值  TickTime:=GetTickCount;
  repeat
  until (GetTickCount-TickTime>=WaitTime) or ((FTW=true) and (strTW=TagID));  EnterCriticalSection(CS2);
  if (FTW=true) and (strTW=TagID) then
  begin
    Move(strTWText[1],Param^,length(strTWText));      //通过这句通过Param参数返回strTWText的值
    Result:=1;
  end;
  LeaveCriticalSection(CS2);
end;
现在的问题是strTWText变量如果用接收函数中赋值代码进行赋值,函数会执行一会后产生EInvalidPointer with message "Invalid Pointer Operation"错误,若strTWText在发送函数中进行常量赋值,则会正确运行。分析原因,可能是频繁进行收发的多线程临界问题所引发的字符串赋值问题,请问,该如何进行赋值才能将内存中的值赋给另一个内存中。

解决方案 »

  1.   

    在Uses里面第一位加上ShareMem看看?DLL.主程序都加
      

  2.   

    全局變量用 ShortString 代替 String 
      

  3.   


    {
      FTW:=false;
      if SendCom(Cmd,SendLength)=0 then  //SendCom函数是往串口发送数据命令
        exit;//  strTWText:='aaaaa';              //这行是对strTWText的赋值 
    }从代码来看,你是在线程的EXECUTE()方法里对全局变量进行赋值吧。
    全局变量属于线程外的东西,相当于认为它属于主线程管理。因此,这儿存在一个线程同步的问题了。
    你用了临界区进行同步,但你同步的方法不正确。你应当调用同步方法来实现线程同步。
    同步的方法,你可以看看 "线程同步" 相关的资料。我就不在这儿写代码了。:),你Google一下,很多.