MFC: 自制室内pm2.5检测仪

废话不说,直接上结果:
这是传感器连接图,采用一个激光传感器,通过串口连到电脑usb口上。
MFC: 自制室内pm2.5检测仪_第1张图片

这是传感器的风扇,类似气泵,用来通气的。
MFC: 自制室内pm2.5检测仪_第2张图片

这是程序最终的界面(挺丑的,汗),点击打开会打开串口设备,点击接受会显示通过串口采集到的数据,下面两个编辑框,左边这个根据采集到的数据显示PM2.5浓度,右侧的编辑框显示PM10的浓度。
MFC: 自制室内pm2.5检测仪_第3张图片

工程实现

打开visual studio 2015,新建一个MFC工程,命名为MFCSerial。创建完成后,首先制作界面:

  1. 添加打开按钮
    ID = IDC_BUTTON_OPEN, caption = 打开,其他都是默认的,添加消息处理函数如下:
void CMFCSerialDlg::OnBnClickedButtonOpen()
{
    // TODO: 在此添加控件通知处理程序代码
    // 这里的hCom定义成了全局变量
    if (hCom) {
        MessageBox(_T("COM already opened"), _T("WARNING"), MB_INACTIVE);
        return;
    }
    // 因为我的口是固定的,所以直接把COM4写在这里了,仅做实验
    LPCWSTR _T(Portname) = _T("COM4");
    DCB dcb = { 0 };
    //pm_data = _T(Portname);
    hCom = CreateFile(_T(Portname),
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,//0,//FILE_FLAG_OVERLAPPED, //同步方式 或 重叠方式 
        NULL
    );

    if (hCom == INVALID_HANDLE_VALUE)
    {
        DWORD dwError = GetLastError();
        //return -1;
        MessageBox(_T("Sorry, failed to open the serial\n The program will terminate in 3 seconds\n"), _T("Open Error"), MB_ACTIVE);
        Sleep(3000);
        exit(0);
    }
    else 
        MessageBox(_T("Open Successfully"), _T("打开串口"), MB_HELP);

    dcb.DCBlength = sizeof(DCB);

    if (!GetCommState(hCom, &dcb))
    {
        DWORD dwError = GetLastError();
        return;
    }

    dcb.BaudRate = 9600;        //波特率 
    dcb.ByteSize = 8;           //位数 
    dcb.Parity = NOPARITY;      //奇偶检验 
    dcb.StopBits = ONESTOPBIT;  //停止位数 

    if (!SetCommState(hCom, &dcb))
    {
        DWORD dwError = GetLastError();
        return;
    }
    if (!PurgeComm(hCom, PURGE_RXCLEAR))
        return;

    SetupComm(hCom, 1024, 1024);

    //return hCom;;
}
  1. 添加接收按钮
    ID = IDC_BUTTON_RECV, caption = 接收,其他默认,消息处理函数如下:
void CMFCSerialDlg::OnBnClickedButtonRecv()
{
    // TODO: 在此添加控件通知处理程序代码
    CEdit *e_obj = (CEdit *)GetDlgItem(IDC_EDIT_DATA);
    CEdit *pm25 = (CEdit *)GetDlgItemInt(IDC_EDIT_PM2);
    CEdit *pm10 = (CEdit *)GetDlgItemInt(IDC_EDIT_PM10);
    DWORD cnt = 0;
    char *OutBuf = (char *)malloc(1024);
    if (OutBuf == NULL)
        return;
    UINT size = 10;
    ReadFile(hCom, OutBuf, size, &cnt, 0);
    if (!cnt)
        MessageBox(_T("Cannot Get RX data"), _T("接收"), MB_OK);
    else {
        CString string;
        UINT8 val = 0;
        for (UINT index = 0; index < cnt; index++) {
            val = OutBuf[index]>>4 & 0xF;
            string.AppendChar(ToHex(val));
            val = OutBuf[index] & 0xF;
            string.AppendChar(ToHex(val));
            string.AppendChar(' ');
        }
        CString str_pm25;
        UINT8 low_byte = OutBuf[2];
        UINT8 high_byte = OutBuf[3];
        double pm25_val = (double)(high_byte*256+low_byte)/10;
        this->pm25 = pm25_val;
        UpdateData(false);

        low_byte = OutBuf[4];
        high_byte = OutBuf[5];
        double pm10_val = (double)(high_byte * 256 + low_byte) / 10;
        this->pm10 = pm10_val;
        UpdateData(false);
        e_obj->SetWindowTextW((LPCTSTR)string);
    }
    free(OutBuf);
}
  1. 添加第一个文本框
    用来显示串口原始数据,这是为了方便调试用的。
    ID = IDC_EDIT_DATA
  2. 添加第二个文本框
    用来显示PM2.5浓度,ID = IDC_EDIT_PM2
  3. 添加第三个文本框
    用来显示PM10浓度,ID = IDC_EDIT_PM10

上述文本框分别绑定了成员变量pm_data, pm10和pm25。

你可能感兴趣的:(mfc,串口,Visual,Studio,PM10,pm2-5)