转载:http://www.cnblogs.com/Bung/archive/2011/05/20/2051636.html

通过comport获取计算机中的所有串口号:

procedure TForm1.FormCreate(Sender: TObject);  //获取计算机中的串口号

var

Cnumber:TStrings;

i:Integer;

begin

cbb2.Items.Clear;

Cnumber:=TStringList.Create;

EnumComPorts(Cnumber);  //获取串口号函数:EnumComPorts

for i:=0 to Cnumber.Count-1 do

begin

cbb2.Items.Add(Cnumber.Strings[i])

end;

cbb2.ItemIndex:=0;

Cnumber.Free;

end;

procedure TForm1.btn7Click(Sender: TObject);  //打开串口

begin

ComPort1.Port:=cbb2.Text;

if ComPort1.Connected then

begin

ComPort1.Close;

ComPort1.Open;

end

else

ComPort1.Open;

end;

我开始用comport时发现它每次14个字符触发一次接收事件,而我要接收的一帧完整数据是82个字符,因此我在每帧的前后个加了开始码和结束码,共84个字符,当Count值大于84我才处理,程序片断如下:

procedure TFCOMM.ComPortRxChar(Sender: TObject; Count: Integer);

var

ReceiveData:TDateRec;

p:Pbyte;

Block : array[0..85] of Char;

begin

if (not Ready)  then

begin

ComPort.Read(p,1);   //开始码为$7FFE,接收时先收的是$FE

move(p, SecondByte,1);

if SecondByte = $FE then        //如果收到的字节是$FE,那就看看下一个是不是$7F

begin

FirstByte := SecondByte;

ComPort.Read(p,1);;

move(p, SecondByte,1);

end;

end;

if (FirstByte = $FE) and (SecondByte = $7F) then

Ready := True;

if Ready and (count>=84) then

begin

。。。。

end;

end;

Spcomm有的是定时查询的方式读COM口;而ComPort用Overlapped机制进行COM读写,只要COM有数据接收到,ComPort就能够从Event响应,并通知应用程序接收,所以,某种ComPort的实时性更好。但是,Overlapped的Event被触发,并不是COM接入一段完整的信息才触发,是Windows自己决定的,我在多个计算机和不同的Windows版本上试过,其触发后接收到的字符数并不一样。因此,需要自己建一个缓冲区来处理数据。

procedure TCustomComPort.CreateHandle;

begin

FHandle := CreateFile(

PChar('\\.\' + FPort),

GENERIC_READ or GENERIC_WRITE,

0,

nil,

OPEN_EXISTING,

FILE_FLAG_OVERLAPPED,  // 以Overlapped方式打开COM口

0);

if FHandle = INVALID_HANDLE_VALUE then

raise EComPort.Create(CError_OpenFailed, GetLastError);

end;

procedure TComThread.Execute;

var

EventHandles: array[0..1] of THandle;

Overlapped: TOverlapped;

Signaled, BytesTrans, Mask: DWORD;

begin

FillChar(Overlapped, SizeOf(Overlapped), 0);

Overlapped.hEvent := CreateEvent(nil, True, True, nil);

EventHandles[0] := FStopEvent;

EventHandles[1] := Overlapped.hEvent; // COM口上的Overlapped事件

repeat

// 等待COM上的事件

// wait for event to occur on serial port

WaitCommEvent(FComPort.Handle, Mask, @Overlapped);

Signaled := WaitForMultipleObjects(2, @EventHandles, False, INFINITE);

// if event occurs, dispatch it

if (Signaled = WAIT_OBJECT_0 + 1)

and GetOverlappedResult(FComPort.Handle, Overlapped, BytesTrans, False)

then

begin

// 通知应用程序接收数据

FEvents := IntToEvents(Mask);

DispatchComMsg;

end;

until Signaled <> (WAIT_OBJECT_0 + 1);

// clear buffers

SetCommMask(FComPort.Handle, 0);

PurgeComm(FComPort.Handle, PURGE_TXCLEAR or PURGE_RXCLEAR);

CloseHandle(Overlapped.hEvent);

CloseHandle(FStopEvent);

end; 
Cport - 应用集合

通过comport获取计算机中的所有串口号:

procedure TForm1.FormCreate(Sender: TObject);  //获取计算机中的串口号

var

Cnumber:TStrings;

i:Integer;

begin

cbb2.Items.Clear;

Cnumber:=TStringList.Create;

EnumComPorts(Cnumber);  //获取串口号函数:EnumComPorts

for i:=0 to Cnumber.Count-1 do

begin

cbb2.Items.Add(Cnumber.Strings[i])

end;

cbb2.ItemIndex:=0;

Cnumber.Free;

end;

procedure TForm1.btn7Click(Sender: TObject);  //打开串口

begin

ComPort1.Port:=cbb2.Text;

if ComPort1.Connected then

begin

ComPort1.Close;

ComPort1.Open;

end

else

ComPort1.Open;

end;

我开始用comport时发现它每次14个字符触发一次接收事件,而我要接收的一帧完整数据是82个字符,因此我在每帧的前后个加了开始码和结束码,共84个字符,当Count值大于84我才处理,程序片断如下:

procedure TFCOMM.ComPortRxChar(Sender: TObject; Count: Integer);

var

ReceiveData:TDateRec;

p:Pbyte;

Block : array[0..85] of Char;

begin

if (not Ready)  then

begin

ComPort.Read(p,1);   //开始码为$7FFE,接收时先收的是$FE

move(p, SecondByte,1);

if SecondByte = $FE then        //如果收到的字节是$FE,那就看看下一个是不是$7F

begin

FirstByte := SecondByte;

ComPort.Read(p,1);;

move(p, SecondByte,1);

end;

end;

if (FirstByte = $FE) and (SecondByte = $7F) then

Ready := True;

if Ready and (count>=84) then

begin

。。。。

end;

end;

Spcomm有的是定时查询的方式读COM口;而ComPort用Overlapped机制进行COM读写,只要COM有数据接收到,ComPort就能够从Event响应,并通知应用程序接收,所以,某种ComPort的实时性更好。但是,Overlapped的Event被触发,并不是COM接入一段完整的信息才触发,是Windows自己决定的,我在多个计算机和不同的Windows版本上试过,其触发后接收到的字符数并不一样。因此,需要自己建一个缓冲区来处理数据。

procedure TCustomComPort.CreateHandle;

begin

FHandle := CreateFile(

PChar('\\.\' + FPort),

GENERIC_READ or GENERIC_WRITE,

0,

nil,

OPEN_EXISTING,

FILE_FLAG_OVERLAPPED,  // 以Overlapped方式打开COM口

0);

if FHandle = INVALID_HANDLE_VALUE then

raise EComPort.Create(CError_OpenFailed, GetLastError);

end;

procedure TComThread.Execute;

var

EventHandles: array[0..1] of THandle;

Overlapped: TOverlapped;

Signaled, BytesTrans, Mask: DWORD;

begin

FillChar(Overlapped, SizeOf(Overlapped), 0);

Overlapped.hEvent := CreateEvent(nil, True, True, nil);

EventHandles[0] := FStopEvent;

EventHandles[1] := Overlapped.hEvent; // COM口上的Overlapped事件

repeat

// 等待COM上的事件

// wait for event to occur on serial port

WaitCommEvent(FComPort.Handle, Mask, @Overlapped);

Signaled := WaitForMultipleObjects(2, @EventHandles, False, INFINITE);

// if event occurs, dispatch it

if (Signaled = WAIT_OBJECT_0 + 1)

and GetOverlappedResult(FComPort.Handle, Overlapped, BytesTrans, False)

then

begin

// 通知应用程序接收数据

FEvents := IntToEvents(Mask);

DispatchComMsg;

end;

until Signaled <> (WAIT_OBJECT_0 + 1);

// clear buffers

SetCommMask(FComPort.Handle, 0);

PurgeComm(FComPort.Handle, PURGE_TXCLEAR or PURGE_RXCLEAR);

CloseHandle(Overlapped.hEvent);

CloseHandle(FStopEvent);

end;

Cport 详细解释和应用相关推荐

  1. Python精讲Numpy基础,大牛笔记详细解释

    https://www.toutiao.com/a6664936105076326920/ 总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Pyth ...

  2. UIApplication sharedApplication详细解释-IOS

    UIApplication sharedApplication详细解释-IOS 分类: iOS开发2012-07-27 10:25 10287人阅读 评论(2) 收藏 举报 applicationui ...

  3. MongoDB:详细解释mongodb的高级操作,聚合和游标

    前几天总结了mongodb的安装入门.详细解释了增删改查的基本操作,今天再来总结下mongodb更高级的操作,聚合和游标. 一.聚合,mongodb的聚合操作一般分为四种情景,分别是:count.di ...

  4. PySide2 基础入门-创建实例窗口(详细解释)

    PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...

  5. Python之pandas:pandas.set_option函数的参数详细解释

    Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...

  6. linux中useradd的文件路径,linux的useradd命令详细解释

    Linux中的useradd命令顾名思义就是添加用户的命令.下面由学习啦小编为大家整理了Linux的useradd命令的详细解释的相关知识,希望对大家有帮助! linux的useradd命令的详细解释 ...

  7. 英语中的介词详细解释

    英语中的介词详细解释 xixi2015-01-05 10:02:58 转载于:https://www.cnblogs.com/lyhabctranslate/p/4202991.html

  8. ios学习--TableView详细解释

    2019独角兽企业重金招聘Python工程师标准>>> ios学习--TableView详细解释 分类: ios Object-C 2012-05-17 08:48  1714人阅读 ...

  9. theano中的Rop和Lop的详细解释

    #------------------------------------------序------------------------------------------------------- ...

最新文章

  1. 上课讲到的设计模式总结
  2. java override格式_Lambda表达式告别@override
  3. LeetCode Random Pick Index(蓄水池抽样算法)
  4. C语言再学习 -- C 预处理器
  5. org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory
  6. MacBook键盘符号
  7. 前端工程师凭什么这么值钱?
  8. 本地windows下新建kafka生产消费数据
  9. smooth_l1_loss(y_true, y_pred)
  10. 嵌入式Linux环境变量如何参与程序运行
  11. 相克军oracle dba视频,相克军 Oracle DBA培训视频教程
  12. PDF资源:Windows程序设计、Python3网络爬虫开发实战
  13. Python TKinter下拉日历控件
  14. 随机抽样、分层抽样、整群抽样、系统抽样的区别
  15. H5表单中时间日期控件
  16. vscode折叠/展开所有区域代码快捷键 注释快捷键
  17. js使用cookie实现7天免登录
  18. 自己搞了一个相亲直播app,有兴趣的朋友可以来看看
  19. python小测试_Python小测试 (2)
  20. NLP学习(二)中文分词技术

热门文章

  1. 使用Let's Encrypt申请永久免费通配符证书
  2. 【调剂】计算机好的矿山安全、计算机等专业工科男(学硕)调剂信息
  3. html写桌面宠物,写个桌面宠物
  4. 小程序底部tabBar购物车右上角增加数字
  5. 织梦DedeCMS添加百度分享代码的最简单方法
  6. 阿里短信 ajax,阿里大于-短信验证码接口
  7. Unity使用设置界面Slider控制音量,场景切换时音量滑条都不改变
  8. 如何搞垮一个测试团队?
  9. IDEA代码检测插件,总有一款适合你
  10. 【板栗糖GIS】轻量3d格式转换软件—CADExchanger的安装教程