极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17490|回复: 5

自己写PC机上的串口组件(附源码)

[复制链接]
发表于 2013-4-6 17:16:34 | 显示全部楼层 |阅读模式
微软停止了对mscomm组件的维护,在64位的windows下使用该组件可能会遇到问题。所以以后的串口程序都是建议直接使用API
方式。当然这是很久之前就发生的事情,而今天做的事情就是把API封装成组件使用。
程序用 DELPHI XE2 开发 环境是 64位 win8 pro。
在我印象中本版块比较少发自行开发的软件的帖子,不知道我是不是第一个呢...{:soso_e112:}

有两点要特别指出的
1 本程序是作为“堕落城市”项目开发的其中一部分(不要以为那个项目已经搁浅了,其实我重来没放弃过,只是稍稍慢了点)
2 代码是在以前的开发项目中整理出来的,其实很少写DELPHI的component,另外还没通过真实串口设备测试。

除了欢迎跟贴之外还特别欢迎有条件的朋友进行测试,如果您能完整描述真实且合理测试过程和测试结果,我会送您一些有用但不太贵重的礼物(放心不会让您付运费的,但数量有限)。

以下是uspi_serial_port_interface.pas文件的全部内容
  1. unit uspi_serial_port_interface;
  2. //只要有了这个单元就足够了,秒掉mscomm
  3. interface
  4. uses
  5.   Windows,System,SysUtils;

  6. type
  7.   TBytes=array of Byte;    //数据类型
  8.   Tspi_kc = class(TObject)
  9.   private
  10.     FOpen_flg:Boolean;    //端口开启标记

  11.     FPort,                //端口号
  12.     FByteSize,            //字节长度 典型值  8
  13.     FParity,              //NOPARITY=0
  14.     FStopBits:Byte;       //ONESTOPBIT=0
  15.     FBaudRate:Cardinal;   //波特率  典型值 CBR_9600

  16.     FComm_handle: THandle;  //COM句柄

  17.   public

  18.        function open_comm(APort:Byte;ABaudRate:Cardinal;AByteSize,AParity,AStopBits:Byte):boolean;  //打开通信端口
  19.     procedure close_comm;       //关闭通信端口
  20.     function send_comm(Adata:TBytes):Boolean;    //发送
  21.     function receive_comm(var Adata:TBytes):boolean; //接收  
  22.   end;

  23. implementation


  24. function Tspi_kc.open_comm(APort:Byte;ABaudRate:Cardinal;AByteSize,AParity,AStopBits:Byte):boolean;  //打开通信端口
  25. var
  26.   v_cc:TCOMMCONFIG;
  27.   v_temp:string;
  28. begin
  29.   Result:=False;
  30.   v_temp:='COM'+inttostr(Aport);                          // 选择所要打开的COM
  31.   FComm_handle:=CreateFile(PChar(v_temp), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING, 0, 0); // 打开COM
  32.   if (FComm_handle = INVALID_HANDLE_VALUE) then Exit;  // 如果COM 未打开  退出函数 结果是 false

  33.   if GetCommState(FComm_handle,v_cc.dcb) then // 获取目前COM 的状态
  34.   begin
  35.     with v_cc.dcb do
  36.     begin
  37.       //设置状态参数
  38.       BaudRate:=ABaudRate;    //波特率  典型值 CBR_9600
  39.       ByteSize:=AByteSize;    //字节长度 典型值  8
  40.       Parity:=AParity;        //NOPARITY=0
  41.       StopBits:=AStopBits;    //ONESTOPBIT=0
  42.     end;
  43.     if SetCommState(FComm_handle,v_cc.dcb) then // 设置COM 的状态
  44.       Result:=true           //正确设置 返回 true
  45.     else
  46.       CloseHandle(FComm_handle);    //否则 关闭comm口
  47.   end;

  48. end;

  49. procedure Tspi_kc.close_comm;       //关闭通信端口
  50. begin
  51.   SetCommMask(FComm_handle,$$0);
  52.   CloseHandle(FComm_handle);
  53. end;

  54. function Tspi_kc.send_comm(Adata:TBytes):Boolean;    //发送
  55. var
  56.   lrc:LongWord;
  57. begin
  58.   Result:=False;
  59.   if FComm_handle<=0 then Exit;
  60.   if WriteFile(FComm_handle,Adata[0],Length(Adata), lrc, nil) then // 送出数据  对于动态数组这里一定要这样写 Adata[0]即数组的第一个元素 不能写动态数组名 ;但是对于下标固定的静态数组可以直接写数组名
  61.     Result:=True;
  62. end;

  63. function Tspi_kc.receive_comm(var Adata:TBytes):boolean; //接收
  64. var
  65.   nBytesRead, dwError:LongWORD ;
  66.   v_cs:TCOMSTAT;
  67. begin
  68.   Result:=False;
  69.   if FComm_handle<=0 then Exit;

  70.   if ClearCommError(FComm_handle,dwError,@v_cs) then  //取得状态
  71.   begin
  72.     if v_cs.cbInQue<=0 then Exit;  //没有数据 退出
  73.     SetLength(Adata,v_cs.cbInQue);
  74.     if ReadFile(FComm_handle,Adata[0],v_cs.cbInQue,nBytesRead,nil) then // 接收COM 的数据  对于动态数组这里一定要这样写 Adata[0]即数组的第一个元素 不能写动态数组名 ;但是对于下标固定的静态数组可以直接写数组名
  75.     begin
  76.       //PurgeComm(hComm, PURGE_RXCLEAR);  // 清除COM 数据
  77.       Result:=True;
  78.     end;
  79.   end;
  80. end;



  81. end.
复制代码
回复

使用道具 举报

发表于 2013-5-8 15:42:52 | 显示全部楼层
这是用VB 写的?
回复 支持 反对

使用道具 举报

发表于 2013-5-8 15:43:22 | 显示全部楼层
好吧 我知道了     DELPHI
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-8 18:38:02 | 显示全部楼层
终于有人关注一下了,真心感动...
没错就是DELPHI
回复 支持 反对

使用道具 举报

发表于 2013-5-11 17:06:41 | 显示全部楼层
wing 发表于 2013-5-8 18:38
终于有人关注一下了,真心感动...
没错就是DELPHI

这种方式只限在Windows下用吧
回复 支持 反对

使用道具 举报

发表于 2013-12-3 21:47:06 | 显示全部楼层
我用delphi写了个TCP/IP的上位机器程序,发现下位机发数据到上位机时上位机软件会假死一会。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:24 , Processed in 0.039220 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表