原來學長寫了一篇關于串口通信的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("串口打開失敗"));
}
}
根據原來的代碼改成了這樣,但是并不能控制,還希望大神們能教一下,謝謝
uj5u.com熱心網友回復:
大概看了一下, 上面的程式時fprintf 輸出到串口, 你輸出到a.txt,自然不能實作控制可以用 sprint 輸出到字串中,然后 m_cCom 輸出
uj5u.com熱心網友回復:
就是沒有學過m_cCom輸出方式,能麻煩提供一個陳述句參考一下嗎,謝謝
uj5u.com熱心網友回復:
http://blog.sina.com.cn/s/blog_74f586a50100rsx7.htmluj5u.com熱心網友回復:
這個代碼好像太老了,串口已經識別不了這個函式了uj5u.com熱心網友回復:
函式名主體還是差不多的,無非就是修飾上一樣推薦使用API,兼容性比較好 Serial Communications in Win32
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/15232.html
標籤:硬件/系統
下一篇:反向獲取方法呼叫的DLL資訊
