mfc串口通信

qq_43355719 2020-05-09 09:08:30
原来学长写了一篇关于串口通信的matlab的程序,用来控制仪器,但是现在要求用mfc写一套,原matlab代码如下:
delete(instrfindall);
%%定义旋转时间。
t_rotateh=40;%%旋转器水平旋转一周的时间,并留出一定余量。
t_rotatev=45;%%旋转器垂直旋转一周的时间,并留出一定余量。
r_t=max(t_rotateh/360*(B-A),t_rotatev/90*r_C)+2;%%旋转器垂直旋转一个步径,同时水平旋转最大角度,所使用的最大时间。
t=t_rotateh/360*C+2;%%旋转器水平旋转一次花费的时间。
% t_file=1;
% %注释1:避免清除变量。
% clear all
% clc
%注释2:端口设置并打开端口。
scom = serial(port);
scom.BaudRate = 9600;
scom.InputBufferSize = 512;
scom.BytesAvailableFcnMode = 'terminator'; % 'byte'
% scom.terminator = LF ;
scom.Timeout = 10; %read or write wait time
fopen(scom);
% %注释3:输入设置。
%%水平方向:
n=floor((B-A)/C)+1;
xmatrix=zeros(1,n);ymatrix=zeros(1,n);zmatrix=zeros(1,n);
%%注意检查同等变量是否使用了相同的次数。因为可能有拼写错误。
for ii=1:n
matrix=A+ii*C-C;
xmatrix(ii)=floor(matrix/100);
ymatrix(ii)=floor((matrix-100*xmatrix(ii))/10);
zmatrix(ii)=floor((matrix-100*xmatrix(ii)-10*ymatrix(ii))/1);
end
%%垂直方向:
r_n=floor((r_B-r_A)/r_C)+1;
% r_xmatrix=zeros(1,r_n);r_ymatrix=zeros(1,r_n);r_zmatrix=zeros(1,r_n);
for ii=1:r_n
matrix=r_A+ii*r_C-r_C;
r_xmatrix(ii)=floor(matrix/100);
r_ymatrix(ii)=floor((matrix-100*r_xmatrix(ii))/10);
r_zmatrix(ii)=floor((matrix-100*r_xmatrix(ii)-10*r_ymatrix(ii))/1);
end
%注释4:返回初始位置。
t1=clock;
fprintf(scom,'%s\r',...
['W',num2str(xmatrix(1)),num2str(ymatrix(1)),num2str(zmatrix(1)),' ',num2str(r_xmatrix(1)),num2str(r_ymatrix(1)),num2str(r_zmatrix(1)),'']);
t2=clock;
t3=t2-t1;
t4=t3(3)*24*24*24+t3(4)*60*60+t3(5)*60+t3(6);
while(t4<=t_rotateh)
t2=clock;
t3=t2-t1;
t4=t3(3)*24*24*24+t3(4)*60*60+t3(5)*60+t3(6);
end
%%旋转、矢网测量并保存数据。
for ii=1:1:r_n
%注释5:垂直旋转。
t1=clock;
fprintf(scom,'%s\r',['W',num2str(xmatrix(1)),num2str(ymatrix(1)),num2str(zmatrix(1)),' ',num2str(r_xmatrix(ii)),num2str(r_ymatrix(ii)),num2str(r_zmatrix(ii)),'']);
t2=clock;
t3=t2-t1;
t4=t3(3)*24*24*24+t3(4)*60*60+t3(5)*60+t3(6);
while(t4<=r_t)
t2=clock;
t3=t2-t1;
t4=t3(3)*24*24*24+t3(4)*60*60+t3(5)*60+t3(6);
end
for jj=1:1:n
%注释6:水平旋转。
t1=clock;
fprintf(scom,'%s\r',['W',num2str(xmatrix(jj)),num2str(ymatrix(jj)),num2str(zmatrix(jj)),' ',num2str(r_xmatrix(ii)),num2str(r_ymatrix(ii)),num2str(r_zmatrix(ii)),'']);
t2=clock;
t3=t2-t1;
t4=t3(3)*24*24*24+t3(4)*60*60+t3(5)*60+t3(6);
while(t4<=t)
t2=clock;
t3=t2-t1;
t4=t3(3)*24*24*24+t3(4)*60*60+t3(5)*60+t3(6);
end
end




现在写成C++的mfc型后不知道该怎么控制仪器了,
void CHelloDlg::OnBnClickedBtnopenport()
{
// TODO: 在此添加控件通知处理程序代码

int t_rotateh = 40; // 旋转器水平旋转一周的时间,并留出一定余量。
int t_rotatev = 45; // 旋转器垂直旋转一周的时间,并留出一定余量。
int A, B, C, r_A, r_B, r_C;
CString strEDIT1, strEDIT2, strEDIT3, strEDIT4, strEDIT5, strEDIT6;
GetDlgItem(IDC_EDIT1)->GetWindowText(strEDIT1);
GetDlgItem(IDC_EDIT2)->GetWindowText(strEDIT2);
GetDlgItem(IDC_EDIT3)->GetWindowText(strEDIT3);
GetDlgItem(IDC_EDIT4)->GetWindowText(strEDIT4);
GetDlgItem(IDC_EDIT5)->GetWindowText(strEDIT5);
GetDlgItem(IDC_EDIT6)->GetWindowText(strEDIT6);
A = _ttol(strEDIT1);
B = _ttol(strEDIT2);
C = _ttol(strEDIT3);
r_A = _ttol(strEDIT4);
r_B = _ttol(strEDIT5);
r_C = _ttol(strEDIT6);

int r_t = max(t_rotateh / 360 * (B - A), t_rotatev / 90 * r_C) + 2; //旋转器垂直旋转一个步径,同时水平旋转最大角度,所使用的最大时间。
int t = t_rotateh / 360 * C + 2; // 旋转器水平旋转一次花费的时间。





if (m_cCom.get_PortOpen()) //如果串口是打开的,则行关闭串口
{
m_cCom.put_PortOpen(FALSE);
}

m_cCom.put_CommPort(3); //选择COM3
m_cCom.put_InBufferSize(1024); //接收缓冲区
m_cCom.put_OutBufferSize(1024);//发送缓冲区
m_cCom.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_cCom.put_InputMode(1);//以二进制方式读写数据
m_cCom.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_cCom.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位

if (!m_cCom.get_PortOpen())//如果串口没有打开则打开
{
m_cCom.put_PortOpen(TRUE);//打开串口
AfxMessageBox(_T("串口打开成功"));

int i;
int n = floor((B - A) / C) + 1;

int* xmatrix;
int* ymatrix;
int* zmatrix;
xmatrix = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
xmatrix[i] = 0;
}

ymatrix = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
ymatrix[i] = 0;
}

zmatrix = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
zmatrix[i] = 0;
}

int i1, matrix;
for (i1 = 1; i1 < n; i1++)
{
matrix = A + i1 * C - C;
xmatrix[i1] = floor(matrix / 100);
ymatrix[i1] = floor((matrix - 100 * xmatrix[i1]) / 10);
zmatrix[i1] = floor((matrix - 100 * xmatrix[i1] - 10 * ymatrix[i1]) / 1);

}


int* r_xmatrix;
int* r_ymatrix;
int* r_zmatrix;
r_xmatrix = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
r_xmatrix[i] = 0;
}

r_ymatrix = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
r_ymatrix[i] = 0;
}

r_zmatrix = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
r_zmatrix[i] = 0;
}
int r_n = floor((r_B - r_A) / r_C) + 1;
int i2;

for (i2 = 1; i2 < r_n; i2++)
{
matrix = r_A + i2 * r_C - r_C;
r_xmatrix[i2] = floor(matrix / 100);
r_ymatrix[i2] = floor((matrix - 100 * r_xmatrix[i2]) / 10);
r_zmatrix[i2] = floor((matrix - 100 * r_xmatrix[i2] - 10 * r_ymatrix[i2]) / 1);
}
//注释4:返回初始位置。
FILE* m_cCom;
fopen_s(&m_cCom, "d://a.txt","w");
time_t t1, t2, t4, t5, t7, t8;
time(&t1);
fprintf(m_cCom, "%c", &xmatrix[1], &ymatrix[1], &zmatrix[1], ' ', &r_xmatrix[1], &r_ymatrix[1], &r_zmatrix[1], ' ');
time(&t2);

int t3 = difftime(t2, t1);

while (t3 <= t_rotateh)
{
time(&t2);
t3 = difftime(t2, t1);
}




for (int ii = 1; ii < r_n; ii++)
// 注释5:垂直旋转。
{
time(&t4);
fprintf(m_cCom, "%c", &xmatrix[1], &ymatrix[1], &zmatrix[1], ' ', &r_xmatrix[1], &r_ymatrix[1], &r_zmatrix[1], ' ');
time(&t5);
int t6 = difftime(t5, t4);

while (t6 <= r_t)
{
time(&t5);
t6 = difftime(t5, t4);
}


for (int jj = 1; jj < n; jj++)
{ // 注释6:水平旋转。
time(&t7);
fprintf(m_cCom, "%c", &xmatrix[1], &ymatrix[1], &zmatrix[1], ' ', &r_xmatrix[1], &r_ymatrix[1], &r_zmatrix[1], ' ');
time(&t8);
int t9 = difftime(t8, t7);
while (t9 <= t)
{
time(&t8);
t9 = difftime(t8, t7);
}
}
}

}
else
{
m_cCom.put_OutBufferCount(0);
AfxMessageBox(_T("串口打开失败"));
}
}
根据原来的代码改成了这样,但是并不能控制,还希望大神们能教一下,谢谢
...全文
103 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2020-05-12
  • 打赏
  • 举报
回复
函数名主体还是差不多的,无非就是修饰上一样 推荐使用API,兼容性比较好 Serial Communications in Win32
qq_43355719 2020-05-12
  • 打赏
  • 举报
回复
这个代码好像太老了,串口已经识别不了这个函数了
qq_43355719 2020-05-11
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903的回复:
大概看了一下, 上面的程序时fprintf 输出到串口, 你输出到a.txt,自然不能实现控制
可以用 sprint 输出到字符串中,然后 m_cCom 输出
就是没有学过m_cCom输出方式,能麻烦提供一个语句参考一下吗,谢谢
zgl7903 2020-05-10
  • 打赏
  • 举报
回复
大概看了一下, 上面的程序时fprintf 输出到串口, 你输出到a.txt,自然不能实现控制
可以用 sprint 输出到字符串中,然后 m_cCom 输出

2,640

社区成员

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

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