|
Victor
控件使用方法详解 - TYBComm32
说明:
TYBComm32 是最早版本的串口控件, 提供访问串口的基本功能,
为兼容以前版本保留的, 建议新用户使用 TYbCommDevice
控件。
相关控件:
TYbCommDevice,
TCommQueue, EComm32Error
继承关系:
TObject
└TPersistent
└TComponent
└TYBComm32
属性:
| 属性 |
描述 |
| Active |
打开/关闭串口、判断串口是否已经打开
定义: __property bool Active = { read
= fGetActive, write = fSetActive };
在打开串口时用 try ... catch 可得到串口错误信息, 关于错误信息的详细描述:EComm32Error。
try
{ YBComm321->Active = true; //打开串口
}
catch(Exception &e)
{ ShowMessage(e.Message); //错误处理
} |
| ModemStatus |
调制解调器 (Modem) 状态 (只读属性)
定义: __property int ModemStatus
= { read = fGetModemStatus };
属性值可能包括以下位或位的的组合: MS_CTS_ON
清除发送 CTS (Clear To Send) 位有效; MS_DSR_ON
数据设备就绪 DSR (Data Set Ready) 位有效; MS_RING_ON
振铃指示 (Ring Indicator) 位有效; MS_RLSD_ON
数据载波检测 DCD (Data Carrier Detect) 又可称作 RLSD (Receive Line Signal
Detect) 位有效;
其他状态 (DTR 和 RTS 等) 请参考 Handle 属性和 API 函数 EscapeCommFunction. |
| DisableWrite |
不允许写串口 (让 Write 属性无效)
定义: __property bool DisableWrite
= { read = fGetDisableWrite, write = fSetDisableWrite};
如果 DisableWrite 属性为 true, 可禁止写串口, 但是 Command 方法仍然有效.
典型应用: 如果 Modem 正在数据通讯状态, 要想发送 "+++" 命令时, 必须在命令前、后各延时1秒钟,
此期间不允许写入串口任何其他数据。例如:
YBComm321->DisableWrite = true; //不允许写串口
YBComm321->PurgeWrite(); //扔掉缓存中所有正在写入的数据
Sleep(1000); //延时一秒钟
YBComm321->Command("+++"); //写入命令"+++",
这是AT指令当中惟一不需要回车的命令, 也不允许有回车
Sleep(1000); //延时一秒钟
YBComm321->Command("ATH0\r"); //写入挂机命令"ATH0",
AT 命令需要用回车结束
YBComm321->DisableWrite = false; //允许写串口 |
| Handle |
串口句柄, 可用 API 函数直接对串口操作.
定义: __property HANDLE Handle =
{ read = fGetHandle };
例如: EscapeCommFunction(YBComm321->Handle,SETDTR);
//使数据终端就绪引脚有效 (DTR: Data Terminal Ready)
用 EscapeCommFunction 可控制 DTR 和 RTS 的状态, 详细介绍请参考 API 函数的解释 (BCB:
Help - Windows SDK)。 |
| CommPort |
串口控件内部使用的属性。
定义: __property TComm32 *CommPort
= { read = _CommPort }; |
| InQueue |
串口读缓存, 指向一个 FIFO 队列缓存, 由控件内部使用, 不要访问除 Count 之外的其他属性。
定义: __property TCommQueue
*InQueue = { read = fGetInQueue };
可以通过 YBComm321->InQueue->Count 来判断串口缓存收到数据的字节数, 这个属性是随着接收数据动态变化的。 |
| OutQueue |
串口写缓存, 指向一个 FIFO 队列缓存, 由控件内部使用, 不要访问除 Count 之外的其他属性。
定义: __property TCommQueue
*OutQueue = { read = fGetOutQueue };
可以通过 YBComm321->OutQueue->Count 来判断缓存中还剩多少字节未发送, 这个属性是随着发送数据动态变化的。 |
| PortNo |
串口号, 整数, 1 对应 COM1, 2 对应 COM2, 3 对应 COM3 ... n 对应 COMn
定义:
__property int PortNo = { read = fGetPort
, write = fSetPort };
可通过这个属性改变操作的串口, 也可通过这个属性判断正在操作哪个串口。
改变这个属性的值, Active 属性会自动变为 false, 需要重新打开串口。 |
| Baud |
波特率, 整数, 可通过这个属性修改或得到当前读写的波特率。
定义:
__property int Baud = { read = fGetBaud
, write = fSetBaud };
改变这个属性的值, Active 属性会自动变为 false, 需要重新打开串口。
由 Windows 支持的波特率有:
| CBR_110 |
CBR_1200 |
CBR_9600 |
CBR_38400 |
CBR_115200 |
| CBR_300 |
CBR_2400 |
CBR_14400 |
CBR_56000 |
CBR_128000 |
| CBR_600 |
CBR_4800 |
CBR_19200 |
CBR_57600 |
CBR_256000 |
可以使用以上常数, 也可以直接使用整数值。例如: YBComm321->Baud
= CBR_57600; YBComm321->Baud
= 57600;
这两种方法都可以。 |
| Parity |
奇偶校验, 可以通过此属性设置或得到当前串口数据的奇偶校验。
定义: __property BYTE Parity = {
read = fGetParity , write = fSetParity };
改变这个属性的值, Active 属性会自动变为 false, 需要重新打开串口。
支持的值包括: NOPARITY 无奇偶校验
(No parity) ODDPARITY 奇校验
(Odd) EVENPARITY 偶校验 (Even)
MARKPARITY Mark 校验
在一般的通讯中, 这个属性的值都设置成 NOPARITY (无奇偶校验) |
| ByteSize |
数据位数, 可通过此属性设置或得到当前串口的数据位数。
定义: __property BYTE ByteSize =
{ read = fGetByteSize, write = fSetByteSize };
改变这个属性的值, Active 属性会自动变为 false, 需要重新打开串口。
支持的值: 4 到 8 之间的整数。
在一般的通讯中, 这个属性的值都设置成 8, 即 8 位的数据。 |
| StopBits |
停止位, 可通过此属性设置或得到当前串口的停止位数。
定义: __property BYTE StopBits =
{ read = fGetStopBits, write = fSetStopBits };
改变这个属性的值, Active 属性会自动变为 false, 需要重新打开串口。
支持的值包括: ONESTOPBIT 1个停止位
ONE5STOPBITS 1.5个停止位 TWOSTOPBITS
2 个停止位
在一般的通讯中, 这个属性值都设置成 1, 即 1 个停止位。 |
| FlowControl |
数据流控制 (Modem 与电脑之间的通讯握手协议)
定义:
enum TFlowControl { fcNone = 0, fcRtsCts
= 3, fcXonXoff = 4, fcTranXonXoff = 5, fcRtsCtsXonXoff = 6
};
__property TFlowControl FlowControl
= { read = fGetFlCtrl, write = fSetFlCtrl };
支持的值包括:
fcNone: 不启动 Modem 通讯协议
fcRtsCts: 采用硬件 RTS/CTS 协议
fcXonXoff: 采用软件 XON/XOFF 协议
fcTranXonXoff: 采用透明的 XON/XOFF 协议
fcRtsCtsXonXoff: 同时采用 RTS/CTS 和 XON/XOFF
协议
如果没有 Modem, 一般设置为 fcNone (不启动 Modem 通讯协议)
如果使用 Modem, 必需设置一个通讯协议, 一般采用 RTS/CTS 协议, 也可以用 XON/XOFF 协议。
改变这个值, 需要调用 InitModem 方法之后才可生效, 请参考方法 InitModem 的说明。 |
| AutoAnswer |
Modem 自动应答, 可设置或得到当前自动应答的状态。
定义: __property BYTE AutoAnswer =
{ read = fGetAutAns, write = fSetAutAns };
这个属性的值取值范围: 0 到 255 之间的整数。 0 表示不自动应答;
1 到 255 之间的数表示电话响铃几次之后应答; 1 是响铃立即应答,
2 是响铃 2 次之后应答……
改变这个值, 需要调用 InitModem 方法之后才可生效, 请参考方法 InitModem 的说明。 |
| InBufSize |
串口读数据缓存的容量, 单位: 字节, 可以读出或修改这个值。
定义: __property long InBufSize =
{ read = fGetInBufSize , write = fSetInBufSize };
这个属性的默认值为 8192, 即 8kb 缓存。 |
| OutBufSize |
串口写数据缓存的容量, 单位: 字节, 可以读出或修改这个值。
定义: __property long OutBufSize
= { read = fGetOutBufSize, write = fSetOutBufSize};
这个属性的默认值为 8192, 即 8kb 缓存。 |
| HwInSize |
在 Windows 串口驱动里面的读数据缓存容量, 单位: 字节, 可以读出或修改这个值。
定义: __property long HwInSize =
{ read = fGetHwInSize , write = fSetHwInSize };
这个属性的默认值为 1200 (字节)。 |
| HwOutSize |
在 Windows 串口驱动里面的写数据缓存容量, 单位: 字节, 可以读出或修改这个值。
定义: __property long HwOutSize =
{ read = fGetHwOutSize, write = fSetHwOutSize };
这个属性的默认值为 1200 (字节)。 |
方法:
| 方法 |
描述 |
| Read |
读串口 (接收数据)
定义: virtual long __fastcall Read(void
far *s, long n);
参数: s: 读出数据存放的地址; n:
读出数据字节数。
返回值: 实际读出的字节数。返回值有可能: ①
0: 没有读出数据; ② 实际读出的字节数, 这个数小于或等于参数
n 的值, 并且也小于或等于属性 InBufSize 的值。
例如:
char Buffer[8192]; //定义一个 8kb 缓存
int n = YBComm321->Read(Buffer,8192); //收到 n 个字节, 接收的数据保存到
Buffer 里 |
| Write |
写串口 (发送数据)
定义: virtual long __fastcall Write(const
void far *s, long n);
参数: s: 发送数据的地址 n:
发送的字节数
返回值: 实际发送的字节数。返回值有可能小于参数 n 的值, 原因是串口忙,
或者发送缓存不足以保存所有数据。
//--- 例(1), 发送简单数据类型: ---
char a[10];
AnsiString s;
short n;
YBComm321->Write(a,10); //发送字符数组
YBComm321->Write(s.c_str(),s.Length()); //发送字符串
YBComm321->Write(&n,2); //发送一个 16 位的短整数, 先发送低位字节, 后发送高位字节
//--- 例(2), 发送结构: ---
#pragma pack(push,1) //用字节型对齐方式,下面的 TMyStruct 结构是 7 个字节, 否则
TMyStruct 结构是8个字节
typedef struct
{ char a; //字节型变量, 1 个字节 short
b; //短整数变量, 2 个字节 long c; //长整数变量, 4 个字节
} TMyStruct;
#pragma pack(pop) //恢复原来的对齐方式
TMyStruct MyStruct; //定义结构变量
YBComm321->Write(&MyStruct,sizeof(TMyStruct)); |
| Command |
发送命令/字符串, 这个方法不受属性 DisableWrite 的控制。
定义: virtual long __fastcall Command(const
char far *s);
参数: s: 以 '\0' 结束的字符串
返回值: 实际发送的字节数。返回值有可能小于参数 n 的值, 原因是串口忙,
或者发送缓存不足以保存所有数据。
例如: YBComm321->Command("ATDT12345678\r");
//通过 Modem 进行拨号, 采用双音频方式, 电话号码为 12345678
注意: 如果使用 AT 指令, 除了"+++"之外的指令都要用回车结束。
Command 方法只是简单的通过串口发送字符串, 并不是特殊的功能, 本例子程序用下面的方法同样可以实现:
YBComm321->Write("ATDT12345678\r",13);
//发送 13 个字节的数据, 因为数据的内容为 AT 指令, 如果 Modem 为命令状态, 就会进行拨号, 号码为
12345678
通过属性 ModemStatus 可判断 Modem 的状态, 如果 MS_RLSD_ON 位有效, 为已经拨号成功,
收发数据的状态, 否则为命令状态, 所有写入串口的数据都认为是命令。 |
| PurgeRead |
清空读数据缓存 (扔掉读出的数据)
定义: virtual void __fastcall PurgeRead(bool
bAbort=false);
参数: bAbort: 强制终止正在执行的接收动作, 默认值为
false |
| PurgeWrite |
清空写数据缓存 (扔掉正在写的数据, 终止当前的写动作)
定义:
virtual void __fastcall PurgeWrite(bool
bAbort=false);
参数:
bAbort: 强制终止正在执行的发送动作, 默认值为 false |
| SettingsDialog |
显示串口设置对话框, 要求用户选择配置 virtual bool
__fastcall SettingsDialog(TComponent* AOwner, bool FActive=false);
参数: AOwner: 显示对话框的拥有者窗体, 一般用 this
即可; FActive: 是否确认选择的配置必须有效 如果为
true, 选择的配置必须有效, 并且按确定按钮时, 会打开串口; 如果为
false, 选择的配置不加验证, 按确定按钮时不打开串口;
返回值: true: 设置成功, 并且接受了设置; false:
设置失败, 或者取消了设置. |
| ResetModem |
复位 Modem, Modem 恢复上电状态
定义: virtual void __fastcall ResetModem(void);
通过 Command("ATZ\r") 实现的。 |
| InitModem |
初始化 Modem, 使用 Modem 之前必须进行初始化
定义: virtual void __fastcall InitModem(void);
通过 AT 指令实现的, 初始化成功会从串口收到包含 "OK" 和回车换行的字符串。
通过 InitModem 设置电脑与 Modem 之间的通讯协议, 通常在打开串口时执行, 或者在 AfterOpen
事件里执行。
建议拨号方在拨号之前先执行 InitModem 来判断 Modem 是否联机, 应答方在打开串口时必须进行 InitModem。 |
| TYBComm32 |
构造函数, 由系统自动调用, 或者通过 new 来调用。
定义: __fastcall TYBComm32(TComponent*
Owner);
参数: Owner: 拥有者, 通常用 this. |
| ~TYBComm32 |
析构函数, 由系统调用, 或者通过 delete 来调用。
定义: virtual __fastcall ~TYBComm32();
|
| NewCommBusy |
protected 成员, 串口事件的默认处理
定义: virtual void __fastcall NewCommBusy(TObject
*Sender, int NotifyType);
参数: Sender: 产生事件的控件 NotifyType:
是以下位或位的组合, 表示产生了相应的事件: EV_RXCHAR
收到数据 EV_TXEMPTY 数据已经发送完毕
EV_CTS 清除发送信号有变化 (CTS引脚电平有变化)
EV_DSR 数据设备就绪状态有变化 (DSR引脚电平有变化)
EV_RLSD 数据载波检测状态有变化 (DCD引脚电平有变化)
EV_RING 有振铃信号 EV_RXFLAG
收到可产生事件的字符, 可参考 API 函数 SetCommState EV_RX80FULL
接收缓存已经达到 80% 的容量, 如果是通过 Modem 等设备进行通讯, 要及时通知对方暂停发送 EV_ERR
线路状态有错误, 包括 CE_FRAME, CE_OVERRUN 和 CE_RXPARITY.
以上事件均由默认的处理过程进行处理, 用户通常只需要处理 EV_RXCHAR 和 EV_TXEMPTY 事件。 |
| NewAfterOpen |
protected 成员, 当打开串口之后产生的事件的默认处理过程。
定义:
virtual void __fastcall NewAfterOpen(TObject
*Sender);
参数:
Sender: 产生事件的控件。 |
| NewBeforeClose |
protected 成员, 关闭串口之前产生的事件的默认处理过程。
定义: virtual void __fastcall NewBeforeClose(TObject
*Sender);
参数: Sender: 产生事件的控件。 |
事件:
| 事件 |
描述 |
| OnCommNotify |
串口事件, 串口在数据传输过程中产生的事件。
定义: __property void __fastcall
(__closure *OnCommNotify) (TObject *Sender, int NotifyType)
= { read
= lpCommBusyProc, write = lpCommBusyProc };
参数: Sender: 产生事件的控件 NotifyType:
是以下位或位的组合, 表示产生了相应的事件: EV_RXCHAR
收到数据 EV_TXEMPTY 数据已经发送完毕
EV_CTS 清除发送信号有变化 (CTS引脚电平有变化)
EV_DSR 数据设备就绪状态有变化 (DSR引脚电平有变化)
EV_RLSD 数据载波检测状态有变化 (DCD引脚电平有变化)
EV_RING 有振铃信号 EV_RXFLAG
收到可产生事件的字符, 可参考 API 函数 SetCommState EV_RX80FULL
接收缓存已经达到 80% 的容量, 如果是通过 Modem 等设备进行通讯, 要及时通知对方暂停发送 EV_ERR
线路状态有错误, 包括 CE_FRAME, CE_OVERRUN 和 CE_RXPARITY.
以上事件均由默认的处理过程进行处理, 用户通常只需要处理 EV_RXCHAR 和 EV_TXEMPTY 事件。
也可以不用事件, 通过定期查询来访问串口的数据, 毕竟要收满缓存或者把缓存数据发完需要比较长(相对而言)的时间。
这个事件在另外一个线程里, 没在主线程里。在这个事件里要尽可能的缩短处理事件, 不要在此事件中停留太久。 |
| AfterOpen |
在串口打开之后产生的事件, 在这个事件中可以作一些特殊处理, 比如初始化 Modem 等。 __property
void __fastcall (__closure *AfterOpen) (TObject *Sender) =
{ read = lpAfterOpen,
write = lpAfterOpen };
参数: Sender: 产生事件的控件 |
| BeforeClose |
在关闭串口之前产生的事件, 在这个事件中可以作一些在串口关闭之前必须执行的特殊的处理。 __property
void __fastcall (__closure *BeforeClose) (TObject *Sender) =
{ read
= lpBeforeClose, write = lpBeforeClose };
参数: Sender: 产生事件的控件 |
返回目录
|