📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
bReceive=false;
Timer->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn_OpenClick(TObject *Sender)
{
MSComm->CommPort=1; //指定端口
MSComm->RThreshold=1; //设置接收多少字节开产生oncomm事件
MSComm->Handshaking=1;
MSComm->InputMode=1; //数据通过 Input 属性以文本形式取回。
if(MSComm->PortOpen)MSComm->PortOpen=false;
MSComm->PortOpen=true;
MSComm->InputLen=0; //一次读取所有数据
MSComm->SThreshold=0; //一次发送所有数据
MSComm->InBufferCount=0; //清空读取缓冲区
MSComm->OutBufferCount=0; //清空发送缓冲区
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn_EndClick(TObject *Sender)
{
if(MSComm->PortOpen)
MSComm->PortOpen=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MSCommComm(TObject *Sender)
{
switch(MSComm->CommEvent)
{
case comEvSend: ShowMessage("在传输缓冲区中有比 Sthreshold 数少的字符。");
// case comEvReceive: ShowMessage("收到 Rthreshold 个字符。该事件将持续产生直到用Input 属性从接收缓冲区中删除数据。");
case comEvCTS: ShowMessage("Clear To Send 线的状态发生变化。");
case comEvDSR: ShowMessage("Data Set Ready 线的状态发生变化。该事件只在 DST 从 1 变到 0 时才发生。");
case comEvCD: ShowMessage("Carrier Detect 线的状态发生变化");
case comEvRing: ShowMessage("检测到振铃信号。一些 UART(通用异步接收— 传输)可能不支持该事件。");
case comEvEOF: ShowMessage("收到文件结束(ASCII 字符为 26)字符。");
case comEventBreak: ShowMessage("接收到一个中断信号。");
case comEventCTSTO: ShowMessage("Clear To Send 超时。在系统规定时间内传输一个字符时,Clear To Send 线为低电平。");
case comEventDSRTO: ShowMessage("Data Set Ready 超时。在系统规定时间内传输一个字符时,Data Set Ready 线为低电平。");
case comEventFrame: ShowMessage("帧错误。硬件检测到一帧错误。");
case comEventOverrun: ShowMessage("端口超速。没有在下一个字符到达之前从硬件读取字符,该字符丢失。");
case comEventCDTO: ShowMessage("载波检测超时。在系统规定时间内传输一个字符时,Carrier Detect 线为低电平。Carrier Detect 也称为 Receive Line Signal Detect (RLSD)。");
case comEventRxOver: ShowMessage("接受缓冲区溢出。接收缓冲区没有空间。");
case comEventRxParity: ShowMessage("奇偶校验。硬件检测到奇偶校验错误");
case comEventTxFull: ShowMessage("传输缓冲区已满。传输字符时传输缓冲区已满");
case comEventDCB: ShowMessage("检索端口的设备控制块 (DCB) 时的意外错误");
default: ShowMessage("Other Event");
}
if(MSComm->CommEvent==2)
{
if(bReceive)
{
Var_Data[num]=MSComm->Input;
num++;
}
else
MSComm->InBufferCount=0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn_ReceiveClick(TObject *Sender)
{
bReceive=!bReceive;
if(bReceive)
btn_Receive->Caption=_T("停止接收");
else
btn_Receive->Caption=_T("开始接收");
Timer->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TimerTimer(TObject *Sender)
{
for(long i=0;i<num;i++)
{
ListBox_Receive->Items->Add(VarToStr(&Var_Data[i]));
}
num=0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -