Cport 详细解释和应用
转载: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 详细解释和应用相关推荐
- Python精讲Numpy基础,大牛笔记详细解释
https://www.toutiao.com/a6664936105076326920/ 总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Pyth ...
- UIApplication sharedApplication详细解释-IOS
UIApplication sharedApplication详细解释-IOS 分类: iOS开发2012-07-27 10:25 10287人阅读 评论(2) 收藏 举报 applicationui ...
- MongoDB:详细解释mongodb的高级操作,聚合和游标
前几天总结了mongodb的安装入门.详细解释了增删改查的基本操作,今天再来总结下mongodb更高级的操作,聚合和游标. 一.聚合,mongodb的聚合操作一般分为四种情景,分别是:count.di ...
- PySide2 基础入门-创建实例窗口(详细解释)
PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...
- Python之pandas:pandas.set_option函数的参数详细解释
Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...
- linux中useradd的文件路径,linux的useradd命令详细解释
Linux中的useradd命令顾名思义就是添加用户的命令.下面由学习啦小编为大家整理了Linux的useradd命令的详细解释的相关知识,希望对大家有帮助! linux的useradd命令的详细解释 ...
- 英语中的介词详细解释
英语中的介词详细解释 xixi2015-01-05 10:02:58 转载于:https://www.cnblogs.com/lyhabctranslate/p/4202991.html
- ios学习--TableView详细解释
2019独角兽企业重金招聘Python工程师标准>>> ios学习--TableView详细解释 分类: ios Object-C 2012-05-17 08:48 1714人阅读 ...
- theano中的Rop和Lop的详细解释
#------------------------------------------序------------------------------------------------------- ...
最新文章
- 上课讲到的设计模式总结
- java override格式_Lambda表达式告别@override
- LeetCode Random Pick Index(蓄水池抽样算法)
- C语言再学习 -- C 预处理器
- org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory
- MacBook键盘符号
- 前端工程师凭什么这么值钱?
- 本地windows下新建kafka生产消费数据
- smooth_l1_loss(y_true, y_pred)
- 嵌入式Linux环境变量如何参与程序运行
- 相克军oracle dba视频,相克军 Oracle DBA培训视频教程
- PDF资源:Windows程序设计、Python3网络爬虫开发实战
- Python TKinter下拉日历控件
- 随机抽样、分层抽样、整群抽样、系统抽样的区别
- H5表单中时间日期控件
- vscode折叠/展开所有区域代码快捷键 注释快捷键
- js使用cookie实现7天免登录
- 自己搞了一个相亲直播app,有兴趣的朋友可以来看看
- python小测试_Python小测试 (2)
- NLP学习(二)中文分词技术