挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!

来源:互联网  时间:2016/8/26 5:46:10

关于网友提出的“ 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!”问题疑问,本网通过在网上对“ 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!
描述:

大家好:
     我想在delphi下用API函数编写一个串口通讯程序。公共变量和常量有:
Var
  openflag:boolean ;//打开标志
  handle :THandle;//串口句柄
Const
  comminquesize = 4096;//输入缓冲区大小
  commoutquesize = 4096;//输出缓冲区大小
打开COM串口的函数我定义如下:
procedure portOpen(com:string;bps:longint;par:char;dbit,sbit:byte);
var
  dcb   : TDCB;
begin
  OpenFlag:=false; //初始化串口
  handle:=CreateFile(PChar(com),
             GENERIC_READ+GENERIC_WRITE,
             0,
             nil,
             OPEN_EXISTING,
             0,
             0 );
  if handle = INVALID_HANDLE_VALUE then
    begin
      showmessage('无法打开串口:' + com);
      exit;
    end;
  GetCommState(handle,dcb);
  with dcb do
  begin
    BaudRate:=bps;                // 波特率
    if dbit in [4,5,6,7,8] then   // 数据位
      ByteSize:=dbit
    else
      ByteSize:=8;
    case sbit of                  // 停止位
      1: StopBits:=0;             // 1
      2: StopBits:=2;             // 2
      else StopBits:=0;           //1
      //else StopBits:=1;           // 1.5
    end;
    case par of                   //校验
      'n','N': Parity:=0;         //no
      'o','O': Parity:=1;         //odd
      'e','E': Parity:=2;         //even
      'm','M': Parity:=3;         //mark
      's','S': Parity:=4;         //space
      else     Parity:=0;         //no
    end;
  end;
  SetCommState(handle,dcb);
  SetupComm(handle,CommOutQueSize,CommInQueSize);
  OpenFlag:=true;
end;
关闭串口函数定义如下:
procedure portClose;
begin
   if OpenFlag then
     CloseHandle(handle);
   OpenFlag:=false;
end;
我的问题是:我要发送和接受数据!!!!!!!!!!!!!!!!???????
           我要发送的数据是一个字符串如:AF144100C1FF8C63 ;我要接受的数据
           是随意的。请问我在打开串口以后怎么利用API 函数:WriteFile 和 
           ReadFile 进行数据的写与读呢???因为这两个函数的参数我搞不很清楚
           请那位前辈给晚辈描述一下好吗?????????


解决方案1:

好的,BOOL WriteFile(
  HANDLE hFile,                    // handle to file to write to
  LPCVOID lpBuffer,                // pointer to data to write to file
  DWORD nNumberOfBytesToWrite,     // number of bytes to write
  LPDWORD lpNumberOfBytesWritten,  // pointer to number of bytes written
  LPOVERLAPPED lpOverlapped        // pointer to structure for overlapped I/O
);
BOOL ReadFile(
  HANDLE hFile,                // handle of file to read
  LPVOID lpBuffer,             // pointer to buffer that receives data
  DWORD nNumberOfBytesToRead,  // number of bytes to read
  LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
  LPOVERLAPPED lpOverlapped    // pointer to structure for data
);
 这两个函数你要先明白。你那里不要定义handle,因为这个handle事实上如果在窗体上,就是self.handle,是窗体句柄,可以改为m_Handle,
var
lrc , dwError, WEResult: DWord;
Buf:Array[1..n] of Byte;
OverLap: TOverlapped;
添充buf.
dwError := WriteFile(m_Handle,@Buf[1], Buf长度, lrc, @OverLap);
if dwError <> 0 then 说明发送不成功,否则成功。
读也是一样。只是你这里有个缺点,就是不能够知道什么时候有数据来。所以需要手动读一下来看看有没有数据到来。
ClearCommError(m_Handle, dwError, @cs);
  {$IFOPT D+}
  if (dwError and CE_IOE) <> 0 then RaiseCommError('串口IO错误', -1);
  if (dwError and CE_OVERRUN) <> 0 then RaiseCommError('串口缓冲区不足', -1);
  if (dwError and CE_RXPARITY) <> 0 then RaiseCommError('串口校检位出错', -1);
  if (dwError and CE_TXFULL) <> 0 then RaiseCommError('串口缓冲区已满', -1);
  {$ENDIF}
  if cs.cbInQue = 0 then exit; //表示没有数据可读,
  if cs.cbInQue > FReadBufSize then begin //表示数据太大了,溢出
    PurgeComm(hCommFile, PURGE_RXCLEAR);
    exit;
  end;
  
err = ReadFile(hCommFile, inbuf[0], cs.cbInQue, nBytesRead,@OverLap);
if err <> 0 then //表示出错。调用下面
 GetLastError //得到错误,
否则读成功

上一篇急!如何在一个应用程序中调用另一个应用程序,请高手指教
下一篇如何用delphi编写一个可以接受执行参数的程序
明星图片
相关文章
《 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)