我现在的程序接收和发送都好使
我是这样的,能接收的时候不能发,发的时候不能接收
我的接收是用一个线程来接收的.我想让程序在接收的同时能够发送数据!!!希望各位提出宝贵意见以及思路.
  有代码者最佳!!!

解决方案 »

  1.   

    也是建议  SPCOMM~
      
    --------------------------------------------------------------
    程序,犹如人生。
      

  2.   

    我原先用mscomm, 但是我们要求的波特率比较特殊,用他设置波特率不好使!  这个控件只能使用固定的几个波特率.
      

  3.   

    不都是发送一个数据,然后接收一个数据么?api编程的demo倒是有一个,留下邮箱发你一个,不一定满足你的要求,供参考
      

  4.   

    我用的全双工通讯,现在问题是串口传输没有冲突,我觉得我的程序有冲突.
    我的接收消息事件跟发送事件都在主线程,会不会有问题的.
    我见到的一个例子大概是这样的:
     初始化时创建监视线程来捕获消息WM_COMMNOTIFY ,当有数据过来时,就进入消息处理事件,现在是当我用另一台机器定时发送数据时,我这里不能发送给另一台机器!
    我的代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;const
         WM_COMMNOTIFY=WM_USER+1;     //通信消息type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        ComboBox1: TComboBox;
        Memo1: TMemo;
        Button5: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button5Click(Sender: TObject);
      private
         procedure   WMCOMMNOTIFY(var   Message:TMessage);
         message   WM_COMMNOTIFY;
        { Private declarations }
      public    { Public declarations }
      end;var
      Form1: TForm1;
      hNewCommFile,Post_Event,Post_Event_1:THandle;  Receive:boolean;
      ReceiveData:Dword;
      lpol:poverlapped;
    implementation{$R *.dfm}
    procedure   AddToMemo(str:PChar;len:Dword);  //接收显示
    var
     c:string;  i:integer;  str1:string;
    begin
         str[len]:=#0;
         c:=strpas(str);
      for i:=1 to length(c) do
      begin
         str1:=str1+inttohex(ord(c[i]),2)+'   ';
       end;
         Form1.Memo1.Lines.Add(str1);end;
    procedure   CommWatch(Ptr:Pointer);stdcall;         //监视线程
    var
        dwEvtMask:Dword;
    begin
        FillChar(lpol,sizeof(toverlapped),0);
        while true do
        begin
            dwEvtMask:=0;
            if     WaitCommEvent(hNewCommFile,dwEvtMask,lpol)   then
            begin
                WaitForSingleObject(Post_event,INFINITE);
                ResetEvent(Post_Event);
                PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);
            end;
        end;
    end;procedure   TForm1.WMCOMMNOTIFY(var   Message:   TMessage);   //消息 处理时间
    var
        CommState:ComStat;
        dwNumberOfBytesRead:Dword;
        ErrorFlag:Dword;
        InputBuffer:array[0..1024]   of   char;
    begin
        if   not   ClearCommError(hNewCommFile,ErrorFlag,@CommState)   then
        begin
            MessageBox(0,'ClearcommErro!','Notice',MB_OK);
            PurgeComm(hNewCommFile,Purge_Rxabort   or   Purge_Rxclear);
            exit;
        end;
        if(Commstate.cbInQue   >0)   then
        begin
           ReadFile(hNewCommFile,InputBuffer,CommState.cbInQue,dwNumberOfBytesRead,lpol) ;
           AddToMemo(InputBuffer,dwNumberOfBytesRead);
           SetEvent(Post_Event);
        end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);//接收按钮事件
    var
        com_thread:Thandle;
        ThreadId:DWORD;
    begin
        Post_Event:=CreateEvent(nil,true,true,nil);
        Com_Thread:=CreateThread(nil,0,@CommWatch,nil,0,ThreadID);
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var
    DCB:tdcb;
    begin
              hNewCommFile:=CreateFile('COM1',GENERIC_WRITE,0,nil,OPEN_EXISTING,
                              FILE_FLAG_OVERLAPPED,0);
              if   hNewCommFile=INVALID_HANDLE_VALUE   then
                      MessageBox(0,'Error   opening   com   port!','Notice',MB_OK);
              SetupComm(hNewCommFile,1024,1024);
              GetCommState(hNewCommFile,dcb);
              dcb.BaudRate:=9600;
              dcb.ByteSize:=8;
              dcb.Parity:=NOPARITY;
              dcb.StopBits:=ONESTOPBIT;
              SetCommState(hNewCommFile,dcb) ;
              SetCommMask(hNewCommFile,ev_rxchar);
    end;procedure TForm1.Button5Click(Sender: TObject); //发送按钮
    var
    Write_Os:Toverlapped;
    x1:array[0..4] of byte;
    dwNumberOfBytesWritten:DWORD;
    begin
          fillchar(Write_Os,sizeof(Write_Os),0);
          X1[0]:=$81;
          X1[1]:=$13;
          X1[2]:=$F0;
          X1[3]:=$81;
          X1[4]:=$05;
          WriteFile(hNewCommFile,X1,5,dwNumberOfBytesWritten,@Write_Os);
          SetEvent(Post_Event_1);
    end;
    end.
    我的程序有很多不安全因素,我现在主要想实现功能,2台电脑同时对发,谁给你修改修改
    谢谢