16,466
社区成员
发帖
与我相关
我的任务
分享
/***************以下是打开串口的代码**********************/
void C串口通信Dlg::OnBnClickedButtonOpen()
{
CString str, str1, n;
GetDlgItemText(IDC_BUTTON_OPEN,str);
CWnd *h1;
h1 = GetDlgItem(IDC_BUTTON_OPEN);
if (!m_mscom.GetPortOpen())
{
m_mscom.SetCommPort(m_comb1.GetCurSel() + 1);//选择串口
if (!m_mscom.GetPortOpen())
m_mscom.SetPortOpen(TRUE);//打开串口
else
MessageBox(_T("cannot open serial port"));
m_comb2.GetLBText(m_comb2.GetCurSel(), str1);//获取所选择到的波特率将其放入到str1中
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//这句话很关键
m_mscom.SetSettings(str1);//设置波特率
m_mscom.SetInputMode(1);//设置输入方式1 为二进制输入方式
m_mscom.SetRThreshold(1);//缓冲区》=1个字符触发事件
m_mscom.SetInputLen(0);//设置当前接收缓冲区数据长度为1024
//m_mscom.SetRTSEnable(1);//设置RT允许
if (m_mscom.GetPortOpen())
{
str = "关闭串口";
UpdateData(true);
h1->SetWindowText(str);
}
unsigned char InstStartRs[14] = { 238, 170, 01, 0, 01, 01, 0, 0, 01, 0, 0, 0, 0, 187 };
SendDataToCom(InstStartRs);
m_mscom.GetInput();//先预读缓冲区以清除残留数据
}
else
{
m_mscom.SetPortOpen(false);
if (str != "打开串口")
{
str = "打开串口";
UpdateData(true);
h1->SetWindowText(str);
}
}
}
/*****************发送数据的代码*************************/
void C串口通信Dlg::OnBnClickedButtonSend()//发送数据的按钮
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_mscom.SetOutput(COleVariant(m_Editsend));
}
/***********************接收到数据触发OnCommMscomm1()事件***********************/
void C串口通信Dlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
VARIANT InputData;
COleSafeArray fs;
BYTE rxdata[1024] = {0};
long len,k;
if (m_mscom.GetCommEvent() == 2)
{
InputData = m_mscom.GetInput();//读缓冲区
fs = InputData;//VARIANT型变À量转换为COleSafeArray型变量
len = fs.GetOneDimSize();
for (k = 0; k < len; k++)
fs.GetElement(&k, rxdata + k);//转换为BYTE型数组
BYTE bt;
for (k = 0; k < len; k++)//将数组转化为CString型变量
{
bt = *(rxdata+k);
OnComByte(bt);
}
UpdateData(false);
}
}
void C串口通信Dlg::OnComByte(byte data)
{
if (data == 0xee && End_RData_Flag)
{
HeadFlag = true; // 文件头收到
m_nRxDataLength = 0;
m_strRXDataCOM[0] = data & 0xff;
End_RData_Flag = false;
}
else if (HeadFlag && data == 0xff)
{
Start_Rece_Flag = true;// 可以接收数据了
m_strRXDataCOM[1] = data & 0xff;
m_nRxDataLength = 2;
HeadFlag = false;
}
else if (Start_Rece_Flag && (!HeadFlag))
{
m_strRXDataCOM[m_nRxDataLength] = data & 0xff;
m_nRxDataLength++;
}
if (m_nRxDataLength == 18)
{
End_RData_Flag = true;
m_nRxDataLength = 0;
HeadFlag = false;
Start_Rece_Flag = false;
START_FLAG = true;
}
}
void C串口通信Dlg::SendDataToCom(unsigned char InstSend[14])
{
CByteArray hexdata;
for (int k = 0; k <= 14; k++)
hexdata.Add(InstSend[k]);
hexdata.SetSize(14);
m_mscom.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}