这里是双击控件后生成的所有函数,以及我们为Active控件添加的事件处理函数,定时函数等
在这里也可以看到我们创建的变量
首先是串口
void CMFCcktestDlg::OnCommMscomm3()
{
// TODO: 在此处添加消息处理程序代码
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len, k;
byte rxdata[2048]; //设置BYTE 数组
CString strtemp, buffer;
if (m_mscomm.get_CommEvent() == 2) //值为2表示接收缓冲区内有字符
{
if (BST_UNCHECKED == ((CButton*)GetDlgItem(IDC_CHECK16RECEIVE))->GetCheck())
{
//以下是正常显示效果处理代码,十六进制显示
variant_inp = m_mscomm.get_Input(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
for (k = 0; k < len; k++)
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
for (k = 0; k < len; k++) //将数组转换为Cstring型变量
{
BYTE bt = *(char*)(rxdata + k);//字符型
strtemp.Format(_T("%c"), bt); //将字符送入临时变量strtemp存放
if (strtemp == '\n' || strtemp == '\r')
{
strtemp = "\r\n";
}
//此处编译有错误,可在项目属性->配置属性->常规里将“字符集”改为使用多字节字符集即可
m_EditReceive += strtemp; //加入接收编辑框对应字符串
}
//UpdateData(FALSE); //更新编辑框内容
SetDlgItemText(IDC_EDIT2, m_EditReceive);
/*IDC_RECEIVE_EDIT1->ReplaceSel(m_strRXDATA, FALSE);*/
//m_mscomm.LineScroll(m_mscomm.GetLineCount());//clw注释
}
else//字符串显示
{
variant_inp = m_mscomm.get_Input(); //读缓冲区
safearray_inp = variant_inp; //VARIA NT型变量转换为ColeSafeArray型变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
for (k = 0; k < len; k++)
{
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
/* strtemp.Format(_T("%02X"), *(rxdata + k));
buffer += strtemp;*/
}
//buffer.TrimLeft();
//buffer.TrimRight();
//CByteArray receivedata;
//int receivedatalen;
//receivedatalen = Str2Hex(buffer, receivedata);
for (k = 0; k < len; k++)
{
switch (rxdata[k] / 16)
{
case 0: m_EditReceive += '0'; break;
case 1: m_EditReceive += '1'; break;
case 2: m_EditReceive += '2'; break;
case 3: m_EditReceive += '3'; break;
case 4: m_EditReceive += '4'; break;
case 5: m_EditReceive += '5'; break;
case 6: m_EditReceive += '6'; break;
case 7: m_EditReceive += '7'; break;
case 8: m_EditReceive += '8'; break;
case 9: m_EditReceive += '9'; break;
case 10: m_EditReceive += 'A'; break;
case 11: m_EditReceive += 'B'; break;
case 12: m_EditReceive += 'C'; break;
case 13: m_EditReceive += 'D'; break;
case 14: m_EditReceive += 'E'; break;
case 15: m_EditReceive += 'F'; break;
}
switch (rxdata[k] % 16)
{
case 0: m_EditReceive += '0'; break;
case 1: m_EditReceive += '1'; break;
case 2: m_EditReceive += '2'; break;
case 3: m_EditReceive += '3'; break;
case 4: m_EditReceive += '4'; break;
case 5: m_EditReceive += '5'; break;
case 6: m_EditReceive += '6'; break;
case 7: m_EditReceive += '7'; break;
case 8: m_EditReceive += '8'; break;
case 9: m_EditReceive += '9'; break;
case 10: m_EditReceive += 'A'; break;
case 11: m_EditReceive += 'B'; break;
case 12: m_EditReceive += 'C'; break;
case 13: m_EditReceive += 'D'; break;
case 14: m_EditReceive += 'E'; break;
case 15: m_EditReceive += 'F'; break;
}
m_EditReceive += ' ';
}
UpdateData(FALSE); //更新编辑框内容
//m_mscomm.LineScroll(m_recvshw.GetLineCount());//clw注释
}
}
}
然后是字符发送按钮
//字符发送
void CMFCcktestDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true); //读取编辑框内容
m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据
//m_EditSend.Empty(); //发送后清空输入框
//SetDlgItemText(IDC_EDIT2,m_EditSend);//更新发送编辑框内容 //更新编辑框内容
}
然后是清发送缓冲区按钮
void CMFCcktestDlg::OnBnClickedButtonCsend()
{
// TODO: 在此添加控件通知处理程序代码
m_EditSend.Empty(); //发送后清空输入框
SetDlgItemText(IDC_EDIT1, m_EditSend);//更新发送编辑框内容
}
然后添加两个函数分别是十六进制转字符和字符串转十六进制的
char HexChar(char c)
{
if ((c >= '0') && (c <= '9'))
return c - '0';//16进制中的,字符0-9转化成10进制,还是0-9
else if ((c >= 'A') && (c <= 'F'))
return c - 'A' + 10;//16进制中的A-F,分别对应着11-16
else if ((c >= 'a') && (c <= 'f'))
return c - 'a' + 10;//16进制中的a-f,分别对应也是11-16,不区分大小写
else
return 0x20; // 其他返回0x10
}
void StringtoHex(BYTE *GB, int glen, BYTE* SB, int* slen)
{
int i; //遍历输入的字符串
int a = 0;
char temp; //接收字符,用来判断是否为空格,若是则跳过
char temp1, temp2; //接收一个字节的两个字符 例如EB,则temp1='E',temp2 = 'B'
*slen = 0; //输出的16进制字符串长度
for (i = 0; i < glen; i++)
{
temp = GB[i];
if (temp == ' ')
continue;
if (a == 0)
temp1 = GB[i];
if (a == 1)
temp2 = GB[i];
a++;
if (a == 2)
{
a = 0;
temp1 = HexChar(temp1);
//temp1 = temp1 - '0';
//if (temp1>10)
// temp1 = temp1 -7;
temp2 = HexChar(temp2);
//temp2 = temp2 - '0';
//if (temp2>10)
//temp2 = temp2 -7;
SB[*slen] = temp1 * 16 + temp2;
(*slen)++;
}
}
}
然后添加16进制发送按钮的代码
void CMFCcktestDlg::OnBnClickedButtonSixteen()
{
// TODO: 在此添加控件通知处理程序代码
CByteArray HexDataBuf;
int i = 0;
BYTE SendBuf[128] = { 0 };
BYTE GetData[256] = { 0 };
int SendLen = 0;
int GetLen = 0;
UpdateData(TRUE);//获取编辑框内容
if (m_EditSend.IsEmpty())
{
AfxMessageBox(_T("发送数据为空!"));
return;
}
HexDataBuf.RemoveAll(); //清空数组
GetLen = m_EditSend.GetLength();
for (i = 0; i < GetLen; i++)
{
GetData[i] = (BYTE)m_EditSend.GetBuffer()[i];
}
StringtoHex(GetData, GetLen, SendBuf, &SendLen);//将字符串转化为字节数据
HexDataBuf.SetSize(SendLen); //设置数组大小为帧长度
for (i = 0; i < SendLen; i++)
{
HexDataBuf.SetAt(i, SendBuf[i]);
}
m_mscomm.put_Output(COleVariant(HexDataBuf)); //发送十六进制数据
UpdateData(false); //更新编辑框内容
}
然后添加打开串口按钮的程序,可以选择串口,波特率
void CMFCcktestDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
if (m_mscomm.get_PortOpen()) //如果串口是打开的,则行关闭串口
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(5); //选择COM1
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接
//收数据的OnComm事件
m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,
//1个停止位
if (!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{
m_mscomm.put_PortOpen(TRUE);//打开串口
AfxMessageBox(_T("串口5打开成功"));
}
else
{
m_mscomm.put_OutBufferCount(0);
AfxMessageBox(_T("串口5打开失败"));
}
}
关闭串口按钮
void CMFCcktestDlg::OnBnClickedButtonClose()
{
// TODO: 在此添加控件通知处理程序代码
m_mscomm.put_PortOpen(FALSE);//关闭串口
AfxMessageBox(_T("串口5已关闭"));
}
清接收缓冲区
void CMFCcktestDlg::OnBnClickedButtonClear()
{
// TODO: 在此添加控件通知处理程序代码
m_EditReceive = _T("");
SetDlgItemText(IDC_EDIT2, m_EditReceive);
}
为添加的定时器添加程序
void CMFCcktestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialogEx::OnTimer(nIDEvent);
CByteArray HexDataBuf;
int i = 0;
BYTE SendBuf[128] = { 0 };
BYTE GetData[256] = { 0 };
int SendLen = 0;
int GetLen = 0;
UpdateData(TRUE);//获取编辑框内容
if (m_EditSend.IsEmpty())
{
AfxMessageBox(_T("发送数据为空!"));
return;
}
HexDataBuf.RemoveAll(); //清空数组
GetLen = m_EditSend.GetLength();
for (i = 0; i < GetLen; i++)
{
GetData[i] = (BYTE)m_EditSend.GetBuffer()[i];
}
StringtoHex(GetData, GetLen, SendBuf, &SendLen);//将字符串转化为字节数据
HexDataBuf.SetSize(SendLen); //设置数组大小为帧长度
for (i = 0; i < SendLen; i++)
{
HexDataBuf.SetAt(i, SendBuf[i]);
}
m_mscomm.put_Output(COleVariant(HexDataBuf)); //发送十六进制数据
UpdateData(false); //更新编辑框内容
}
自动发送和停止发送按钮
void CMFCcktestDlg::OnBnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1, 2000, NULL);//启动定时器1,定时时间是1秒
}
void CMFCcktestDlg::OnBnClickedButtonStop()
{
// TODO: 在此添加控件通知处理程序代码
KillTimer(1);//关闭定时器1。
}