我把一个利用TComm控件做的通讯程序改进了一下,还有一些问题,哪位大虾能帮我诊断一下?
串口使用的是三芯线,分别是接地、发送、接收。在PC上接好串口,把线另一头的“发送”和“接收”端用导线连上,使用串口调试助手V2.2可以给自己发送和接收数据,不过我编写的这个程序就无法实现了。
具体程序如下:
//------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Comm"
#pragma resource "*.dfm"
TForm1 *Form1;
TRect rt;
String ReceiveStr;
float ReceiveData[50];
TPoint PointArray[50];
//------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered = true;
}
//------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//打开通信端口
Comm1->PortOpen =true;
Form1->mReceive->Clear();
}
//------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
String InputStr;
//命令指定,并加上结尾字符Cr
InputStr=Trim(txtInput->Text) + '\x0d';
Comm1->OutputString(InputStr);//送出数据
}
//------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
//先不引发事件
Comm1->RThreshold = 0;
//送出设置的字符串
Comm1->OutputString("SET TYPE 3\r");
Delay(1000);//延迟
Comm1->DataCount =0; //清除接收区
Comm1->RThreshold = 1; //设置接收事件的阀值
//设定画图方式
Pic1->Canvas->Pen->Mode =pmCopy;
//画出边框
Pic1->Canvas->Rectangle(0,0,Pic1->Width ,Pic1->Height);
rt=Pic1->ClientRect; //指定范围
}
//------------------------------------------------------------------
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
//检查是否打开了通信端口
if (Comm1->PortOpen) Comm1->PortOpen =false;
exit(0);
}
//------------------------------------------------------------------
void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{
String Buf1,Buf2;
int DotPos,i,j;
//接收数据
Buf1 = Trim(Comm1->Input);
//数据Append到ReceiveStr变量中
ReceiveStr = ReceiveStr + Buf1;
//检查结尾字符是否已返回
if (ReceiveStr.Pos('!')< 1) return;
else
{
i = 0; //序数归0
mReceive->Text = "";
do
{
//检查逗号的位置
DotPos = ReceiveStr.Pos(',');
if (DotPos==0) break;
//取出数值字符串
Buf2 = ReceiveStr.SubString(1,DotPos-1);
//放到Memo组件中,并且加上断行字符(Cr、Lf)
mReceive->Text =mReceive->Text+ IntToStr(i+1) + "->" + Buf2 + '\r' + '\n';
//留下未处理的数据
ReceiveStr =ReceiveStr.Delete(1,DotPos);
i += 1; //序数加1
if (i>49) break;
}
while (1); //直到找不到逗号
} //else loop
}
//------------------------------------------------------------------
//时间延迟函数
void Delay(DWORD DT)
{
long tt;
tt=GetTickCount();
while (GetTickCount()-tt<DT)
{
Application->ProcessMessages();
if ((GetTickCount()-tt)<=0)
tt=GetTickCount();
}
}
//-------------------------------------------------------------------
void __fastcall TForm1::Comm1ReceiveData(TObject *Sender)
{
String Buf;
int DotPos,i,j;
float tmpSingle,MaxValue,MinValue;
TPoint pt;
//接收资料
Buf = Trim(Comm1->Input);
ReceiveStr = ReceiveStr + Buf; //Append数据
//结尾字节是否已返回
if (ReceiveStr.Pos('!')< 1) return;
else
{
i = 0;
do
{
//检查逗号的位置
DotPos = ReceiveStr.Pos(',');
if (DotPos==0) break;
//数据放进数组
ReceiveData[i] = StrToFloat( ReceiveStr.SubString(1,DotPos-1));
//剩下未处理数据
ReceiveStr =ReceiveStr.Delete(1,DotPos);
i += 1;
if (i>49) break;
}
while (1); //直到寻找不到逗号
ReceiveStr = "";
MaxValue = -9999; //默认最大数值
MinValue = 9999; //默认最小数值
//找出最大及最小值
for (i = 0 ;i<50;i++ )
{
if (ReceiveData[i]>MaxValue) MaxValue = ReceiveData[i];
if (ReceiveData[i]<MinValue) MinValue = ReceiveData[i];
}
//开始处理图形,将数据存储到PT数组中
for (i = 0 ;i<50;i++ )
{
pt.x=(int)((float)rt.Right*i/49); //Scale转换
pt.y=(int)((float)rt.Bottom*ReceiveData[i]/(MaxValue-MinValue));
PointArray[i]=pt;
}
Pic1Paint(Sender); //调用Picture的Paint事件
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Pic1Paint(TObject *Sender)
{
//绘出边框
Pic1->Canvas->Pen->Color = clBlack;
Pic1->Canvas->Brush->Color = clWhite;
Pic1->Canvas->Rectangle(rt);
//画线
Pic1->Canvas->Pen->Color = clRed;
Pic1->Canvas->Polyline(PointArray,49);
}
//----------------------------------------------------------------------------
void __fastcall TForm1::OnPaint(TObject *Sender)
{
//绘出边框
Pic1->Canvas->Pen->Color = clBlack;
Pic1->Canvas->Brush->Color = clWhite;
Pic1->Canvas->Rectangle(rt);
//画线
Pic1->Canvas->Pen->Color = clRed;
Pic1->Canvas->Polyline(PointArray,49);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn6Click(TObject *Sender)
{
if(Form1->OpenDialog1->Execute())
//显示对话框
{
Form1->BitBtn1->Enabled=true;
Form1->BitBtn2->Enabled=true;
Form1->BitBtn3->Enabled=true;
Form1->BitBtn4->Enabled=true;
Form1->BitBtn5->Enabled=true;
Form1->BitBtn7->Enabled=true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn7Click(TObject *Sender)
{
Form1->mReceive->Lines->LoadFromFile(Form1->OpenDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn5Click(TObject *Sender)
{//设置对话框标题
Form1->SaveDialog1->Title="另存为文本文件:";
//设置默认路径
Form1->SaveDialog1->InitialDir="C:\\Documents and Settings\\Administrator\\桌面\\";
//设置过滤器
Form1->SaveDialog1->Filter="Text Files(*.txt)|*.txt";
//显示对话框
if(Form1->SaveDialog1->Execute())
//存储文件
{
Form1->mReceive->Lines->SaveToFile(Form1->SaveDialog1->FileName);
}
}
//---------------------------------------------------------------------------
相关推荐
【COA三维路径规划】郊狼算法无人机避障三维航迹规划【含Matlab仿真 3361期】.zip
CSDN Matlab武动乾坤上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
MATLABSimulink模拟及会议论文,关于具备自动温度控制和能耗分析的智能太阳能热水系统。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
完美复现基于自适应虚拟谐波阬的光储VSG并网电流谐波抑制模型(Simulink仿真实现)
内容概要:本文围绕基于自适应虚拟谐波阬的光储VSG并网电流谐波抑制模型展开研究,提出了一种结合虚拟同步发电机(VSG)控制与自适应虚拟谐波阬技术的谐波治理方案,旨在有效应对光伏发电与储能系统并网过程中产生的特定次谐波问题。通过在Simulink中构建完整的系统仿真模型,详细实现了VSG的惯量阻尼控制、功率环调控以及自适应谐波阬的频率识别与阻抗重塑机制,能够动态跟踪并抑制并网电流中的谐波成分,从而提升电能质量和系统并网稳定性。文章深入剖析了控制器结构设计、关键参数整定方法及谐波抑制效果的仿真验证过程,充分验证了该方法在复杂工况下的有效性、鲁棒性与工程应用潜力。; 适合人群:具备电力电子、新能源并网、电力系统分析等相关专业知识背景的科研人员与工程技术人员,尤其适用于熟悉Simulink仿真环境、掌握基本控制理论与信号处理技术的研究生、高校教师及企业研发人员。; 使用场景及目标:①应用于光伏-储能联合系统的并网逆变器控制设计;②用于提升VSG并网系统的电能质量与抗扰动能力;③为高比例新能源接入场景下的谐波分析与主动抑制策略提供仿真验证平台与技术支撑;④辅助开展新型电力系统中电能质量治理相关的教学与科研工作。; 阅读建议:建议读者结合提供的Simulink模型文件进行同步仿真操作,重点理解VSG控制架构与自适应虚拟谐波阬模块的耦合关系,关注谐波检测、频率自适应调整与复矢量控制的实现细节,并可通过改变负载条件或电网阻抗参数进行多工况测试,以深入掌握系统的动态响应特性与控制性能边界。
机械三维3D设计图-食品皮带机输送除尘消毒设备.zip
机械三维3D设计图-食品皮带机输送除尘消毒设备.zip
机械三维3D设计图-膜厚测定自动搬送设备.zip
机械三维3D设计图-膜厚测定自动搬送设备.zip


ActiveX/COM/DCOM
