?? 串口調試dlg.cpp
字號:
);
((CButton*)GetDlgItem(IDC_RADIO_STRSHOW))->SetWindowPos
(
NULL,
401, EditRect.bottom-EditRect.top-135,
99,15,
NULL
);
((CButton*)GetDlgItem(IDC_RADIO_HEXSHOW))->SetWindowPos
(
NULL,
401, EditRect.bottom-EditRect.top-120,
99,15,
NULL
);
((CButton*)GetDlgItem(IDC_RADIO_STRSEND))->SetWindowPos
(
NULL,
171, EditRect.bottom-EditRect.top-115,
69,20,
NULL
);
((CButton*)GetDlgItem(IDC_RADIO_HEXSEND))->SetWindowPos
(
NULL,
241, EditRect.bottom-EditRect.top-115,
99,20,
NULL
);
((CButton*)GetDlgItem(IDC_OPEN_WAVEWINDOW))->SetWindowPos
(
NULL,
141, EditRect.bottom-EditRect.top-75,
80,20,
NULL
);
// Invalidate();
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMyDlg::OnOpenCom()
{
// TODO: Add your control notification handler code here
// char OpenComBut[9];
// ((CEdit*)GetDlgItem(IDC_OPEN_COM))->GetWindowText(OpenComBut,9);
//0 == strcmp(OpenComBut,"打開串口")
if(!m_Com.GetPortOpen())
{
GetPortNum();
m_Com.SetCommPort(m_Port);
m_Com.SetInBufferSize(4096);
m_Com.SetOutBufferSize(4096);
m_Com.SetPortOpen(TRUE);
m_Com.SetInputMode(1);
SetComState();
//m_Com.SetSettings(ComState);
m_Com.SetRThreshold(1);
m_Com.SetInputLen(0);
if(m_Com.GetPortOpen())
((CEdit*)GetDlgItem(IDC_OPEN_COM))->SetWindowText("關閉串口");
else
m_Com.SetPortOpen(FALSE);
}
else
{
m_Com.SetPortOpen(FALSE);
((CEdit*)GetDlgItem(IDC_OPEN_COM))->SetWindowText("打開串口");
}
}
void CMyDlg::OnSendData()
{
// TODO: Add your control notification handler code here
unsigned int i=0,j=0;
char SendData[1024],*strbuf;
if(m_Com.GetPortOpen())
{
UpdateData();
if(m_HexSend)
{
for(j=0;j<strlen(m_SendData);)
{
if(m_SendData.GetAt(j) == VK_SPACE) j++;
else
{
if(m_SendData.GetAt(j) >= '0' && m_SendData.GetAt(j) <= '9')
SendData[i]=m_SendData.GetAt(j)-'0';
else if(m_SendData.GetAt(j) >= 'A' && m_SendData.GetAt(j) <= 'F')
SendData[i]=m_SendData.GetAt(j)-'A'+10;
else if(m_SendData.GetAt(j) >= 'a' && m_SendData.GetAt(j) <= 'f')
SendData[i]=m_SendData.GetAt(j)-'a'+10;
else if(m_SendData.GetAt(j) != VK_SPACE)
{
::MessageBox(NULL,"您的輸入包含非法的十六進制字符!","提示!",MB_OK | MB_ICONWARNING);
m_SendData="";
i=0;
break;
}
j++;
if(j==strlen(m_SendData))
{
i++;
break;
}
if(m_SendData.GetAt(j) == VK_SPACE)
i++;
if(m_SendData.GetAt(j) >= '0' && m_SendData.GetAt(j) <= '9')
{ SendData[i]=(SendData[i]<<4)+m_SendData.GetAt(j)-'0';i++;}
else if(m_SendData.GetAt(j) >= 'A' && m_SendData.GetAt(j) <= 'F')
{ SendData[i]=(SendData[i]<<4)+m_SendData.GetAt(j)-'A'+10;i++;}
else if(m_SendData.GetAt(j) >= 'a' && m_SendData.GetAt(j) <= 'f')
{ SendData[i]=(SendData[i]<<4)+m_SendData.GetAt(j)-'a'+10;i++;}
else if(m_SendData.GetAt(j) != VK_SPACE)
{
::MessageBox(NULL,"您的輸入包含非法的十六進制字符!","提示!",MB_OK | MB_ICONWARNING);
m_SendData="";
i=0;
break;
}
j++;
}
}
strbuf=SendData;
}
else
{
// for(j=0;j<strlen(m_SendData);j++)
strbuf=m_SendData.GetBuffer(1024);
i=strlen(m_SendData);
}
CByteArray array;
array.RemoveAll();
// i=strlen(strbuf);
array.SetSize(i);
for(j=0;j<i;j++)
array.SetAt(j,strbuf[j]);
m_Com.SetOutput(COleVariant(array));
}
else
{
::MessageBox(NULL,"請先打開串口,再進行此操作!","提示!",MB_OK | MB_ICONWARNING);
}
}
void CMyDlg::SetComState()
{
CString StateBuf="";
ComState = "";
((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate))->GetLBText(((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate))->GetCurSel(),StateBuf);
ComState += StateBuf+',';
((CComboBox*)GetDlgItem(IDC_COMBO_Parity))->GetLBText(((CComboBox*)GetDlgItem(IDC_COMBO_Parity))->GetCurSel(),StateBuf);
ComState += StateBuf.Mid(1,1)+',';
((CComboBox*)GetDlgItem(IDC_COMBO_ByteSize))->GetLBText(((CComboBox*)GetDlgItem(IDC_COMBO_ByteSize))->GetCurSel(),StateBuf);
ComState += StateBuf+',';
((CComboBox*)GetDlgItem(IDC_COMBO_StopBits))->GetLBText(((CComboBox*)GetDlgItem(IDC_COMBO_StopBits))->GetCurSel(),StateBuf);
ComState += StateBuf;
// AfxMessageBox(ComState);
m_Com.SetSettings(ComState);
}
void CMyDlg::OnSelchangeCOMBOBaudRate()
{
// TODO: Add your control notification handler code here
if(m_Com.GetPortOpen())
SetComState();
}
void CMyDlg::OnSelchangeCOMBOByteSize()
{
// TODO: Add your control notification handler code here
if(m_Com.GetPortOpen())
SetComState();
}
void CMyDlg::OnSelchangeCOMBOParity()
{
// TODO: Add your control notification handler code here
if(m_Com.GetPortOpen())
SetComState();
}
void CMyDlg::OnSelchangeCOMBOStopBits()
{
// TODO: Add your control notification handler code here
if(m_Com.GetPortOpen())
SetComState();
}
BEGIN_EVENTSINK_MAP(CMyDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CMyDlg)
ON_EVENT(CMyDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CMyDlg::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
CString strtemp;
if(m_Com.GetCommEvent()==2)
{
int len=m_Com.GetInBufferCount();
if(len>0)
{
VARIANT vResponse=m_Com.GetInput();
COleSafeArray safearray_inp=vResponse;
BYTE rxdata[4096];
for(long k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++)
{
BYTE bt=*(unsigned char*)(rxdata+k);
// if(!m_HexShow)
strtemp.Format("%c",bt);
// else
// strtemp.Format("%02X ",bt);
m_ReceiveBuffer = m_ReceiveBuffer + strtemp;
}
}
NewReceive=1;
}
}
void CMyDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
ComState = m_Com.GetSettings();
CDialog::OnClose();
}
void CMyDlg::OnClearRxwnd()
{
// TODO: Add your control notification handler code here
m_ReceiveData="";
m_ReceiveBuffer="";
UpdateData(FALSE);
}
void CMyDlg::OnRadioHexshow()
{
// TODO: Add your control notification handler code here
m_HexShow = TRUE;
NewReceive =1;
}
void CMyDlg::OnRadioHexsend()
{
// TODO: Add your control notification handler code here
m_HexSend = TRUE;
((CEdit*)GetDlgItem(IDC_EDIT_SENDDATA))->SetFocus();
UpdateData(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_SENDDATA))->SetSel(-1);
}
void CMyDlg::OnRadioStrsend()
{
// TODO: Add your control notification handler code here
m_HexSend = FALSE;
((CEdit*)GetDlgItem(IDC_EDIT_SENDDATA))->SetFocus();
UpdateData(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_SENDDATA))->SetSel(-1);
}
void CMyDlg::OnRadioStrshow()
{
// TODO: Add your control notification handler code here
m_HexShow = FALSE;
NewReceive =1;
}
void CMyDlg::OnUpdateEditSenddata()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
char str[3]="";
CString String="錯誤的十六進制代碼:";
DWORD j = ((CEdit*)GetDlgItem(IDC_EDIT_SENDDATA))->GetSel();
// if( ((i & 0xffff0000)>>16) != (i & 0x0000ffff))
// m_SendData.Delete((i & 0x0000ffff),((i & 0xffff0000)>>16)-(i & 0x0000ffff));
j &= 0x0000ffff;
UpdateData();
if(m_HexSend)
for(unsigned int i=0;i<strlen(m_SendData);i++)
{
if(
!( m_SendData.GetAt(i) >= '0' && m_SendData.GetAt(i) <= '9' ||
m_SendData.GetAt(i) >= 'a' && m_SendData.GetAt(i) <= 'f' ||
m_SendData.GetAt(i) >= 'A' && m_SendData.GetAt(i) <= 'F' ||
m_SendData.GetAt(i) == VK_SPACE)
)
{
itoa(m_SendData.GetAt(i),str,10);
String+=str;
String+=',';
j -= 1;
m_SendData.Delete(i);
UpdateData(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_SENDDATA))->SetSel(j,j,TRUE);
::MessageBox(NULL,String,"警告",MB_OK | MB_ICONWARNING);
}
}
}
/**************************************************/
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
Invalidate();
}
void CMyDlg::OnTimer(UINT nIDEvent)
{
CString strtemp;
// TODO: Add your message handler code here and/or call default
if(NewReceive/*strcmp(m_ReceiveData,m_ReceiveBuffer)*/)
{
m_ReceiveData="";
for(unsigned int i=0;i<strlen(m_ReceiveBuffer);i++)
{
if(!m_HexShow)
strtemp.Format("%c",m_ReceiveBuffer.GetAt(i));
else
strtemp.Format("%02X ",(unsigned char)m_ReceiveBuffer.GetAt(i));
m_ReceiveData += strtemp;
}
((CEdit*)GetDlgItem(IDC_EDIT_RECEIVEDATA))->SetFocus();
UpdateData(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_RECEIVEDATA))->SetSel(-1);
if(WaveDlg.m_hWnd!=NULL)
WaveDlg.Invalidate();
// ShowWave();
NewReceive=0;
}
// CDialog::OnTimer(nIDEvent);
}
void CMyDlg::OnOpenWavewindow()
{
// TODO: Add your control notification handler code here
// WaveDlg = new CWaveDlg;
if(WaveDlg.m_hWnd==NULL)
{
WaveDlg.Create(IDD_WAVE_DIALOG);
((CEdit*)GetDlgItem(IDC_OPEN_WAVEWINDOW))->SetWindowText("關閉波形窗口");
}
else
{
WaveDlg.DestroyWindow();
((CEdit*)GetDlgItem(IDC_OPEN_WAVEWINDOW))->SetWindowText("打開波形窗口");
}
}
void CMyDlg::GetPortNum()
{
CString StateBuf="";
// ComState = "";
((CComboBox*)GetDlgItem(IDC_COMBO_PORT))->GetLBText(((CComboBox*)GetDlgItem(IDC_COMBO_PORT))->GetCurSel(),StateBuf);
m_Port = StateBuf.GetAt(3)-'0';
}
void CMyDlg::OnSelchangeComboPort()
{
// TODO: Add your control notification handler code here
if(!m_Com.GetPortOpen())
{
GetPortNum();
m_Com.SetCommPort(m_Port);
m_Com.SetInBufferSize(4096);
m_Com.SetOutBufferSize(4096);
m_Com.SetPortOpen(TRUE);
m_Com.SetInputMode(1);
SetComState();
//m_Com.SetSettings(ComState);
m_Com.SetRThreshold(1);
m_Com.SetInputLen(0);
if(m_Com.GetPortOpen())
((CEdit*)GetDlgItem(IDC_OPEN_COM))->SetWindowText("關閉串口");
else
m_Com.SetPortOpen(FALSE);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -