大家救命,在用MSCOMM控件在一个按钮中实现发送和接收数据的问题。

legendhui 2004-12-17 03:03:53
我想在一个按钮响应函数中,发送一个数据包,然后等待一段时间后,再对接收的数据进行判断。我想用MSCOMM控件来实现,请问可不可以?我在发送数据后,用Sleep函数让线程等待一段时间,可是仍然不会产生CommEvent,要等到执行完这个按钮中所有的语句才会响应。请高手指点,谢谢!
...全文
556 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodingBySea 2004-12-21
  • 打赏
  • 举报
回复
程序并没有错, ComEvReceive也可能发生了(如果通信连接正确的话.),怀疑测试过程中发送的数据太少,当你点击void CAutoMedView::OnOnCommMscomm() 所对应的工具或菜单时发送已经完成,此时收到的是ComEvEOF事件.建议1:把m_Comm.SetPortOpen(TRUE);放到OnOnCommMscomm()函数中;建议2:对m_Comm.GetCommEvent()==2返回的事件进行逐一判断,这应该是好习惯.
wy311216 2004-12-20
  • 打赏
  • 举报
回复
肯定好用啊,不管它有多少单片机,毕竟它是要通过串口传送的,所以同时你只能传送一组数据
我上面的程序代码,就可以控制很多个单片机
legendhui 2004-12-20
  • 打赏
  • 举报
回复
pAutoMedView->OnComm();
这个我也知道,不过是想检验一下在按钮执行的过程中是否能响应OnComm事件处理,我也说过了它根本不会去执行if(m_Comm.GetCommEvent()==2) 里面的东东。
legendhui 2004-12-20
  • 打赏
  • 举报
回复
定时器我也想过,不过我最终至少要控制12个单片机连续工作,并且应该实现发一个接一个,接收的数据判断后,再发下一个。所以定时器我想应该不好用。
wy311216 2004-12-20
  • 打赏
  • 举报
回复
pAutoMedView->OnComm();
虽然你触发了串口事件,但是和接收到外部数据触发的串口事件是两个不同的线程.所以你在OnButton10里面接收数据是不可能收到的.你得在OnComm事件处理里面接收
wy311216 2004-12-20
  • 打赏
  • 举报
回复
你可以使用定时器
wy311216 2004-12-20
  • 打赏
  • 举报
回复
BOOL CComTestDlg::ComInitialize(int i)
{
if(m_com.GetPortOpen())
{
//若有开启的COM口则关闭
m_com.SetPortOpen(FALSE);
}
m_com.SetCommPort(i);
if (!m_com.GetPortOpen())
{
//打开串口
m_com.SetPortOpen(TRUE);
}
//波特率9600,无校验,8个数据位,1个停止位
m_com.SetSettings("19200,n,8,1");
// 以二进制方式检取数据,参数取0数据以文字形式取回
m_com.SetInputMode(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_com.SetRThreshold(1);
//先预读缓冲区以清除残留数据
m_com.GetInput();
return TRUE;
}

void CComTestDlg::OnButtonopencom()
{
UpdateData(TRUE);
if(!(m_comValue == "1" || m_comValue == "2") )

{
MessageBox("请选择需要打开的COM口");
return;
}
ComInitialize(atoi(m_comValue));
m_openBtn.EnableWindow(FALSE);
m_sendBtn.EnableWindow(TRUE);
m_importBtn.EnableWindow(TRUE);
}

void CComTestDlg::OnClose()
{
if(m_com.GetPortOpen())
{
//若有开启的COM口则关闭
m_com.SetPortOpen(FALSE);
}
DestroyWindow();

}

void CComTestDlg::OnOnCommMscomm()
{
CListCtrl *preturnListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST2);
CListCtrl *pdataListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
//定义VARIANT型变量 
VARIANT m_input1;
//定义COleSafeArray型变量
COleSafeArray m_input2;
int length;
LONG i;
//定义字节数组 
BYTE data[128],datahead;
CString str,str1;
//接收缓冲区内字符
if(m_com.GetCommEvent()== 2)
{
m_com.SetInputLen(1);
//从缓冲区读数据
m_input1=m_com.GetInput();
//将VARIANT型变量转换为ColeSafeArray型变量
m_input2=m_input1;
//将数据转换为BYTE型数组
for(i=0;i< 1;i++)
m_input2.GetElement(&i,data+i);
datahead=data[0];
//传送出的数据得到正确响应,终止定时器,删除第一个数据
if(datahead==0xA5)
{
KillTimer(1);
pdataListCtrl->DeleteItem(0);
Send();
}
//重发第一个数据
else if(datahead==0xA6)//发送出去的数据错误,重新发送.
{
Send();
}
else if(datahead==0x5A)//发送过来的命令
{
m_com.SetInputLen(1);
m_input1=m_com.GetInput();
m_input2=m_input1;
for(i=0;i< 1;i++)
m_input2.GetElement(&i,data+i);
length=data[0];
m_com.SetInputLen(length);
//从缓冲区读数据
//Sleep(50);
m_input1=m_com.GetInput();
//将VARIANT型变量转换为ColeSafeArray型变量
m_input2=m_input1;
//将数据转换为BYTE型数组
for(i=0;i< length;i++)
m_input2.GetElement(&i,data+i);
//m_data1=data[1];//sno
//m_data2=data[2]+1;//bno
BYTE CHKRESULT = 0;
for(i=0;i<length;i++)//校验数据的正确与否。CHK+SNO+BNO+BARCODE[1]+。。。。。。BARCODE[N]
{
CHKRESULT+=data[i];
}
if(CHKRESULT==0)
{
//preturnListCtrl添加数据
CString strBoxNo,strReaderNo,strData;
strBoxNo.Format("%d",data[1]);
strReaderNo.Format("%d",data[2]+1);
strData.Format("0x%02X",data[3]);
int i = preturnListCtrl->GetItemCount();
pdataListCtrl->InsertItem(LVIF_TEXT|LVIF_STATE,i,strBoxNo,0,LVIS_SELECTED,0,0);
pdataListCtrl->SetItemText(i,1,strReaderNo);
pdataListCtrl->SetItemText(i,2,strData);
}
}
else if(datahead==0xA7)
{

}
}
}

//将CString转为CByteArray
void CComTestDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
}

//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CComTestDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}

void CComTestDlg::SendData(CString str,int sno,int bno)//向串接器发送命令
{
CByteArray hexdata;
CString str1 = "";
CString str2 = "";
CString str3 = "";
int CMD[5];
int result = 0;
int check = 0;
int header = 0x5A;
int len = str.GetLength();
BYTE data[128];

for (int i=0; i<len; i++)
{
data[i] = str.GetAt(i);
result = result + data[i];
str1.Format("%02X", data[i]); //$
str2 += str1;
}

str3 = str2;
//计算校验码
check = 256-(sno + bno + result - 1)%256;
CMD[0] = 0x5A;
CMD[1] = len + 3;
CMD[2] = check;
CMD[3] = sno;
CMD[4] = bno - 1;

str1 = "";
str2 = "";
for(i=0;i<5;i++)
{
str1.Format("%02X",CMD[i]); //$
str2 += str1;
}
//向串口发送数据
str = str2 + str3;
String2Hex(str,hexdata);
m_com.SetOutput(COleVariant(hexdata)); //发送数据
}

//发送数据到串口
void CComTestDlg::OnSend()
{
Send();
}

//发送数据到串口
void CComTestDlg::Send()
{
//从datalist中得到要发送的数据发送出去
CString strBoxNo;
CString strReaderNo;
CString strData;
int BoxNo;
int ReaderNo;
CListCtrl *pdataListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);

if (pdataListCtrl->GetItemCount() <= 0)
{
//MessageBox("没有数据");
return;
}

strBoxNo = pdataListCtrl->GetItemText(0,0);
strReaderNo = pdataListCtrl->GetItemText(0,1);
strData = pdataListCtrl->GetItemText(0,2);
BoxNo = atoi(strBoxNo.GetBuffer(0));
ReaderNo = atoi(strReaderNo.GetBuffer(0));
SendData(strData, BoxNo, ReaderNo);
//启动定时器
SetTimer(1,20000,NULL);
}

void CComTestDlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:
Send();
break;
case 2:
;
}
//CDialog::OnTimer(nIDEvent);
}

void CComTestDlg::OnClear()
{
//CListCtrl *preturnListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST2);
//preturnListCtrl->DeleteAllItems();
MessageBox("hello");
}


void CComTestDlg::OnImport()
{
CListCtrl *pdataListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
pdataListCtrl->DeleteAllItems();

CString szLine = "";
CString strBoxNo = "";
CString strReaderNo = "";
CString strData = "";
CFileFind find;
if(!find.FindFile(".//data.txt"))
{
MessageBox("没有可导入的数据文件");
return;
}
CStdioFile file;
file.Open("data.txt",CFile::modeRead);

while(file.ReadString(szLine))
{
if(szLine != "")
{
CString str = "";
szLine.TrimLeft();
szLine.TrimRight();
for(int i=0; i<szLine.GetLength(); i++)
{
str = szLine.Mid(i,1);
if(str == " ")
{
strBoxNo = szLine.Left(i);
szLine = szLine.Mid(i);
szLine.TrimLeft();
szLine.TrimRight();
break;
}
}

if(szLine != "")
{
CString str1 = "";
for(int k=0; k<szLine.GetLength(); k++)
{
str1 = szLine.Mid(k,1);
if(str1 == " ")
{
strReaderNo = szLine.Left(k);
szLine = szLine.Mid(k);
szLine.TrimLeft();
szLine.TrimRight();
break;
}
}
if(szLine != "")
{
strData = szLine;
}
}
if(strBoxNo=="" || strReaderNo=="" || strData == "")
{
continue;
}
int j = pdataListCtrl->GetItemCount();

pdataListCtrl->InsertItem(LVIF_TEXT|LVIF_STATE,j,strBoxNo,0,LVIS_SELECTED,0,0);
pdataListCtrl->SetItemText(j,1,strReaderNo);
pdataListCtrl->SetItemText(j,2,strData);
strBoxNo = "";
strReaderNo = "";
strData = "";
}
}
}

legendhui 2004-12-20
  • 打赏
  • 举报
回复
wy311216
我的OnButton3()里实际也是发送数据的,我跟踪了,实际实际是执行的,及时把他换成,OnButton3()里的语句也没有意义,我现在主要想解决的是,在一个按钮里,同时发送然后等下微机处理完数据后,在接收数据,对其判断,然后再发数据。
wy311216 2004-12-20
  • 打赏
  • 举报
回复
void CMovequipDlg::OnButton10()
{
OnButton3();
Sleep(2000);
}
你在事件处理函数中调用事件处理函数.OnButtton3是不会执行的.你可以跟踪一下
legendhui 2004-12-20
  • 打赏
  • 举报
回复
我的代码是这样写的:
void CAutoMedView::OnInitialUpdate()
{
m_Comm.SetCommPort(1);
m_Comm.SetInBufferSize(1024);
m_Comm.SetOutBufferSize(512);
if(!m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);
m_Comm.SetInputMode(1);
m_Comm.SetRThreshold(1);
m_Comm.SetSettings("9600,n,8,1");
m_Comm.SetInputLen(0);
m_Comm.GetInput();
m_Comm.SetEOFEnable(true);

}
////////////////////
void CAutoMedView::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
Sleep(3000);
VARIANT m_Input1;
COleSafeArray m_Input2;
long length,i;
BYTE data[1024];
CString str;
if(m_Comm.GetCommEvent()==2)
{
m_Input1=m_Comm.GetInput();
m_Input2=m_Input1;
length=m_Input2.GetOneDimSize();
for(i=0;i<length;i++)
m_Input2.GetElement(&i,data+i);
for(i=0;i<length;i++)
{
BYTE a=*(char*)(data+i);
str.Format("%02X ",a);
m_strReceiveData+=str;
}
}
UpdateData(false);
}
////////////////////////////
void CMovequipDlg::OnButton3()
{
// TODO: Add your control notification handler code here
CMainFrame * pMainFrame = (CMainFrame*)AfxGetMainWnd();
CAutoMedView * pAutoMedView = (CAutoMedView*)pMainFrame->GetActiveView();
byte.RemoveAll();
UpdateData(TRUE);
switch(m_nHprobe)
{
case 0:
packet = "a5c5a040000000f5";
break;
case 1:
packet = "a5c5a140000000f5";
break;
case 2:
packet = "a5c5a240000000f5";
break;
case 3:
packet = "a5c5a340000000f5";
break;
case 4:
packet = "a5c5a440000000f5";
break;
default:
AfxMessageBox("请输入0--4之间的数");
return;
}
pAutoMedView->String2Hex(packet,byte);
pAutoMedView->m_Comm.SetOutput(COleVariant(byte));

}
//////////////////////////////////////////////////
void CMovequipDlg::OnButton4()
{
// TODO: Add your control notification handler code here
CMainFrame * pMainFrame = (CMainFrame*)AfxGetMainWnd();
CAutoMedView * pAutoMedView = (CAutoMedView*)pMainFrame->GetActiveView();
byte.RemoveAll();
UpdateData(TRUE);
CString str;
switch(m_nHsamplingpin)
{
case 0:
packet = "a5c7a140000000f5";
break;
case 1:
packet = "a5c7a240000000f5";
break;
default:
AfxMessageBox("请输入0--1之间的数");
return;
}
pAutoMedView->String2Hex(packet,byte);
pAutoMedView->m_Comm.SetOutput(COleVariant(byte));

}
void CMovequipDlg::OnButton10()
{
// TODO: Add your control notification handler code here
CMainFrame * pMainFrame = (CMainFrame*)AfxGetMainWnd();
CAutoMedView * pAutoMedView = (CAutoMedView*)pMainFrame->GetActiveView();
OnButton3();
Sleep(2000);
pAutoMedView->OnComm();
//在这里对收到的数据进行判断,然后再进行其它数据的发送。可是进入 OnOnCommMscomm()函数它并不执行if(m_Comm.GetCommEvent()==2)这个判断里的内容,不管Sleep多久。
OnButton4();
UpdateData(false);
}
danielzhu 2004-12-20
  • 打赏
  • 举报
回复
UP
legendhui 2004-12-20
  • 打赏
  • 举报
回复
大哥,这样也忒麻烦了吧,要一两个单片机还好说,我以后要有12个单片机,这样恐怕不如用别的省事
5iDream 2004-12-19
  • 打赏
  • 举报
回复
gz
  • 打赏
  • 举报
回复
如果是VC程序,建议不要用MSCOMM控件,自己用API实现,也没几句代码兼容性还好,不过我在网吧,没法给例子。
yintongshun 2004-12-18
  • 打赏
  • 举报
回复
示例:
初始化:
bool CYourClass::OpenPort()
{
if(m_Comm.GetPortOpen())
m_Comm.SetPortOpen(FALSE);
m_Comm.SetCommPort(m_iPort); //选择com1
if( !m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE); //打开串口
else
AfxMessageBox("cannot open serial port");

m_Comm.SetSettings(_T("1200,E,8,1")); //波特率1200,无校验,8个数据位,1个停止位
m_Comm.SetSThreshold(0);
m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Comm.SetInputMode(1);
m_Comm.SetInputLen(0); //设置当前接收区数据长度为0
return true;
}
发送:
CByteArray bArryFrame;
bArryFrame.Add(0x68);
bArryFrame.Add(0x23);
m_Comm.SetOutput(COleVariant(bArryFrame));

接收:
CByteArray m_RecFrameArray_All;(类中定义即可)
void CYourClass::OnCommMscommCtrl()
{
// TODO: Add your control notification handler code here
Sleep(300);

VARIANT variant_inp;
COleSafeArray safearray_inp;
CString csDispString;
LONG len;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
short ENO;
CString strtemp;
ENO=1;BYTE bt;CString csByte,csResult;
if(1)//bReceive)
{
ENO=m_Comm.GetCommEvent();

if(ENO==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_Comm.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(LONG iter=0;iter<len;iter++)
{
safearray_inp.GetElement(&iter,rxdata+iter); //转换为BYTE型数组

bt=*(char*)(rxdata+iter);m_RecFrameArray_All.Add(bt);
strtemp.Format("%02X ",m_RecFrameArray_All.ElementAt(iter));
csResult+=strtemp;
}
}
kugou123 2004-12-18
  • 打赏
  • 举报
回复
你的代码是怎么写的?
legendhui 2004-12-18
  • 打赏
  • 举报
回复
谁能比较详细的给我解决这个问题啊?最好在原来控件的基础上,实在不行别的方法也可以。我另开一贴,用我的一半分相送(大约100多分)!愁死我了!!!发了这么久了
UDX协议 2004-12-18
  • 打赏
  • 举报
回复
http://www.vczx.com/article/show.php?id=790
换个控件试试
zyp2kyear 2004-12-18
  • 打赏
  • 举报
回复
http://cs.nju.edu.cn/yangxc/dcc2003.files/jszc-sub/comif-30.htm
legendhui 2004-12-18
  • 打赏
  • 举报
回复
请问
CreateMutex
WaitForSingleObject
在哪里创建,用的时候怎么用,能不能给出详细的代码。本人实在太菜了
我的程序中的一部分如下:

void CMovequipDlg::OnButton10()
{
// TODO: Add your control notification handler code here
CMainFrame * pMainFrame = (CMainFrame*)AfxGetMainWnd();
CAutoMedView * pAutoMedView = (CAutoMedView*)pMainFrame->GetActiveView();
OnButton1();//对机器发送一条指令,然后它作出相应的动作后返回一条指令。
Sleep(1000);
pAutoMedView->OnComm();
pAutoMedView->m_strReceiveData;//等待接收缓冲区里的数据,然后判断做下一步。这里主要是要接收到数据,然后才能最下一步。
OnButton2();
Sleep(2000);
}
加载更多回复(7)
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 Altium Designer 18是一款功能丰富的电子设计自动化工具,其集成了电路原理图绘制、PCB布局规划、三维视图展示、电路仿真分析以及生产文件生成等多项核心功能,为电子工程师们提供了一个全面的硬件设计解决方案。该软件的官方文指导材料系统地阐述了从项目初始阶段到最终完成的全过程操作方法。 在“AD18 官方文指导材料”,使用者可以掌握以下核心内容要点: 1. **系统配置与界面认知**:熟悉Altium Designer 18的工作平台,涵盖菜单选项、工具栏配置、工作区域安排,以及个性化工作界面的设定方法。 2. **项目创建流程**:掌握如何建立新的项目工程,包括工程参数配置、项目模板选取,以及项目文件的添加操作。 3. **电路图绘制技术**:学习电路原理图的绘制流程,包括元件库的维护管理、元件放置技巧、连接线路绘制、属性编辑操作,以及网络表的自动生成方法。 4. **元件库构建与管理**:了解如何建立自定义元件库,执行元件的导入与导出任务,以及利用Altium Designer自带的元件资源库。 5. **PCB布局设计方法**:掌握PCB设计的基本准则,如元件布局策略、布线技巧、层叠结构调整、布线规则优化,以及冲突检测与短路处理技术。 6. **设计规范与约束条件**:理解设定设计规范和电气约束条件的关键性,包括间距参数设定、焊盘尺寸规格、过孔尺寸要求等,以及运用规则检查进行设计验证的流程。 7. **三维模型整合应用**:学习如何将三维模型与PCB设计内容相结合,以实现更为直观的机械配合验证。 8. **电路性能仿真技术**:掌握使用Altium Des...
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### 接口测试知识要点说明 #### 一、接口测试的定义及分类 1. **概念阐释**: - 接口测试作为软件测试的关键环节,主要对系统之间的交互点进行验证。 - 它旨在核实接口的正确性、稳定性和功能性,保障各个系统组件能够依照预期执行交互操作。 2. **实施情境**: - 适用于多系统联合开发的环境。 - 适用于包含多个子系统的复杂应用系统开发过程。 3. **适用范围**: - 为其他系统提供支持的底层基础架构系统。 - 负责协调心服务的系统架构。 4. **分类标准**: - **模块接口测试**:通常作为单元测试的一部分,适用于独立构建的功能模块。 - **Web接口测试**: - **服务端接口测试**:针对客户端与服务器端之间的接口进行验证。 - **外部接口测试**:对第三方提供的接口进行测试,例如支付平台提供的授权登录接口。 5. **测试角度**: - **接口功能验证**:核实接口功能是否满足预期要求。 - **接口性能评估**:衡量接口的处理能力及响应时间。 - **接口稳定性考察**:检测接口在长时间运行的表现情况。 - **接口安全检测**:确保接口能够抵御非法访问或数据篡改。 6. **测试手法**: - **参数细致测试**:深入测试接口的输入参数和输出结果。 - **场景模拟测试**:依据实际业务场景进行测试验证。 #### 二、接口测试的详细流程 1. **测试规划**: - 明确测试范围、目标及所需资源。 - 规划测试策略,选择适宜的工具和技术手段。 2. **测试用例设计**: - 依据需求文档和接口规格文档设计测试用例。 - 覆...
内容概要:本文研究基于遗传算法(GA)与粒子群算法(PSO)相结合的无人机三维路径规划方法,旨在解决无人机在复杂三维环境避障与路径优化的关键问题。通过构建包含障碍物、威胁区域等约束的三维仿真环境,系统实现了GA与PSO两种智能优化算法的Matlab代码,并对其在路径规划的性能进行全面对比分析,重点关注路径长度、飞行安全性、算法收敛速度等核心指标。研究充分利用GA的全局搜索能力与PSO的快速局部收敛特性,提出一种混合优化策略,有效克服单一算法易陷入局部最优或收敛缓慢的缺陷。文不仅详细阐述了算法的设计流程、数学模型与实现细节,还提供了完整的仿真结果,验证了所提混合方法在复杂动态场景下的优越性、有效性和鲁棒性,为无人机自主导航提供了可靠的理论依据和技术方案。; 适合人群:具备一定Matlab编程基础和优化算法理论知识,从事无人机系统设计、智能控制、路径规划、人工智能应用等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、山区、灾害救援等复杂三维环境的无人机自主避障与最优任务路径规划;②为智能优化算法(GA、PSO及其混合策略)的学习、性能对比与工程化应用提供详实的实践案例和代码参考;③服务于高校科研教学、算法原型快速复现、以及在此基础上的进一步改进与创新研究。; 阅读建议:建议读者结合所提供的Matlab代码进行仿真运行与调试,深入理解两种算法的参数设置、适应度函数设计及路径生成机制,可通过修改环境地图、增加动态障碍物或调整优化目标函数等方式进行扩展性研究,以深化对算法本质和应用场景的理解。

15,465

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧