zoukankan      html  css  js  c++  java
  • 简单的串口通信程序控制光源

    本程序采用简单的同步串行通信,分为几个阶段:

    1、打开串口

    2、配置串口

    3、设置串口输入输出缓存区大小

    4、设置串口读写超时(若不设置超时,读写时会等待读写函数返回)

    5、发送字符串(每次发送前清空发送缓存区)

    6、接收字符(每次接收前清空接收缓存区)

    7、关闭串口

    bmLightComm.h

     1 #pragma once
     2 #include "stdio.h"
     3 #include "stdbool.h"
     4 #include "windows.h"
     5 #include "tchar.h"
     6 
     7 class bmLightComm
     8 {
     9 public:
    10     bmLightComm();
    11     ~bmLightComm();
    12     bool openPort(const char* portNum);
    13     bool setupPort(DWORD baudrate, BYTE bytesize, BYTE stopbits, DWORD fparity, BYTE parity);
    14     bool setBufferAreaSize(DWORD inQueue, DWORD outQueue);
    15     bool setComTimeout(DWORD readinttim, DWORD readToltimM, DWORD readToltimC,DWORD writeToltimM, DWORD writeToltimC);
    16     bool purgePort(DWORD flags);
    17     bool closePort();
    18 
    19     bool sendBuff(const char* datas, unsigned int len);
    20     char readBuff();
    21 
    22 private:
    23     HANDLE mCom;
    24 };

    bmLightComm.cpp

      1 #include "bmLightComm.h"
      2 #include <iostream>
      3 
      4 
      5 bmLightComm::bmLightComm()
      6 {
      7 }
      8 
      9 
     10 bmLightComm::~bmLightComm()
     11 {
     12 }
     13 
     14 bool bmLightComm::openPort(const char* portNum)
     15 {
     16     printf("open the com %s
    ", portNum);
     17 
     18     mCom = CreateFileA(portNum, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
     19     std::cout << GetLastError() << std::endl;
     20     if (mCom == INVALID_HANDLE_VALUE)
     21     {
     22         printf("failed to open com %s %d
    ", portNum,  GetLastError());
     23         return false;
     24     }
     25     else
     26     {
     27         printf("cam %s opened
    ", portNum);
     28         return true;
     29     }
     30 }
     31 
     32 bool bmLightComm::setupPort(DWORD baudrate, BYTE bytesize, BYTE stopbits, DWORD fparity, BYTE parity)
     33 {
     34     printf("set up port
    ");
     35 
     36     DCB mDcb;
     37     if (!GetCommState(mCom, &mDcb))
     38     {
     39         printf("get com state failed %d
    ", GetLastError());
     40         return false;
     41     }
     42 
     43     mDcb.BaudRate = baudrate;
     44     mDcb.fParity = fparity;
     45     mDcb.Parity = parity;
     46     mDcb.StopBits = stopbits;
     47     mDcb.ByteSize = bytesize;
     48 
     49     if (!SetCommState(mCom, &mDcb))
     50     {
     51         printf("failed to set up com state %d
    ", GetLastError());
     52         return false;
     53     }
     54     else
     55     {
     56         printf("com set up complete
    ");
     57         return true;
     58     }
     59 }
     60 
     61 bool bmLightComm::setBufferAreaSize(DWORD inQueue, DWORD outQueue)
     62 {
     63     if (!SetupComm(mCom, inQueue, outQueue))
     64     {
     65         printf("failed to set the buffer size %d
    ", GetLastError());
     66         return false;
     67     }
     68     else
     69     {
     70         printf("com set buffer size complete
    ");
     71         return true;
     72     }
     73 }
     74 
     75 bool bmLightComm::setComTimeout(DWORD readinttim, DWORD readToltimM, DWORD readToltimC, DWORD writeToltimM, DWORD writeToltimC)
     76 {
     77     COMMTIMEOUTS TimeOuts;
     78     TimeOuts.ReadIntervalTimeout = readinttim;
     79     TimeOuts.ReadTotalTimeoutMultiplier = readToltimM;
     80     TimeOuts.ReadTotalTimeoutConstant = readToltimC;
     81     TimeOuts.WriteTotalTimeoutMultiplier = writeToltimM;
     82     TimeOuts.WriteTotalTimeoutConstant = writeToltimC;
     83 
     84     if (!SetCommTimeouts(mCom,&TimeOuts))
     85     {
     86         printf("failed to set time out %d
    ", GetLastError());
     87         return false;
     88     }
     89     else
     90     {
     91         printf("set time out complete
    ");
     92         return true;
     93     }
     94 }
     95 
     96 bool bmLightComm::purgePort(DWORD flags)
     97 {
     98     //PURGE_TXCLEAR,清空发送缓冲区;PURGE_RXCLEAR,清空接收缓冲区;
     99     if (!PurgeComm(mCom, flags))
    100     {
    101         printf("failed to purge com %d
    ", GetLastError());
    102         return false;
    103     }
    104     else
    105     {
    106         printf("purge com complete
    ");
    107         return true;
    108     }
    109 }
    110 
    111 bool bmLightComm::closePort()
    112 {
    113     this->purgePort(PURGE_TXCLEAR | PURGE_RXCLEAR);
    114 
    115     if (!CloseHandle(mCom))
    116     {
    117         printf("failed to close port %d
    ", GetLastError());
    118         return false;
    119     }
    120     else
    121     {
    122         printf("close port complete
    ");
    123         return true;
    124     }
    125 }
    126 
    127 bool bmLightComm::sendBuff(const char* datas, unsigned int len)
    128 {
    129     this->purgePort(PURGE_TXCLEAR);
    130 
    131     DWORD pWrite;
    132     if (!WriteFile(mCom, datas, sizeof(const char)*len, &pWrite, NULL))
    133     {
    134         printf("failed to write buff %d
    ", GetLastError());
    135         return false;
    136     }
    137     else
    138     {
    139         printf("write buff complete
    ");
    140         return true;
    141     }
    142 }
    143 
    144 char bmLightComm::readBuff()
    145 {
    146     this->purgePort(PURGE_RXCLEAR);
    147 
    148     char buffl;
    149     DWORD pRead;
    150     if (!ReadFile(mCom, &buffl, sizeof(buffl), &pRead, NULL))
    151     {
    152         printf("failed to read buff %d
    ", GetLastError());
    153         return '';
    154     }
    155     else
    156     {
    157         printf("read buff complete
    ");
    158         return buffl;
    159     }
    160 }

    bmLightManage.h

     1 #pragma once
     2 #ifndef BMLIGHTMANAGE_h
     3 #define BMLIGHTMANAGE_H
     4 
     5 #include "bmLightComm.h"
     6 #include <string>
     7 #include <strstream>
     8 #include <iostream>
     9 #include <vector>
    10 
    11 typedef struct LightSetting
    12 {
    13     int deviceID;  //0~2
    14     int channelID;   //0~3
    15     bool turn;
    16     int bright;
    17 
    18     LightSetting(int dID, int cID, bool tID, int bID)
    19     {
    20         deviceID = dID;
    21         channelID = cID;
    22         turn = tID;
    23         bright = bID;
    24     }
    25 }LightSetting;
    26 
    27 class bmLightControl
    28 {
    29 public:
    30     bmLightControl();
    31     ~bmLightControl();
    32     void Init(const char* portNum);
    33     void setBright(LightSetting ligtemp);
    34     void sendBright();
    35 
    36 private:
    37     bmLightComm mCtrl;
    38     std::string ch[4];
    39 };
    40 
    41 class bmLightManage
    42 {
    43 public:
    44     bmLightManage();
    45     ~bmLightManage();
    46     void Init(const char* portNum0, const char* portNum1, const char* portNum2);
    47     void setBright(std::vector<LightSetting> ligtemp);
    48 
    49 private:
    50     bmLightControl mCon[3];
    51 };
    52 
    53 
    54 #endif

    bmLightManage.cpp

     1 #include "bmLightManage.h"
     2 
     3 bmLightControl::bmLightControl()
     4 {
     5     ch[0] = ch[1] = ch[2] = ch[3] = "000F";
     6 }
     7 
     8 bmLightControl::~bmLightControl()
     9 {
    10     mCtrl.closePort();
    11 }
    12 
    13 void bmLightControl::Init(const char* portNum)
    14 {
    15     mCtrl.openPort(portNum);
    16     mCtrl.setupPort(19200, 8, ONESTOPBIT, FALSE, NOPARITY);
    17     mCtrl.setBufferAreaSize(1024, 1024);
    18     //mCtrl.setComTimeout(5, 5, 5, 5, 5);
    19 }
    20 
    21 void bmLightControl::setBright(LightSetting ligtemp)
    22 {
    23     std::strstream ss;
    24     std::string str;
    25     ss << ligtemp.bright;
    26     ss >> str;
    27     if (str.length() == 1)
    28     {
    29         str = "00" + str;
    30     }
    31     else if (str.length() == 2)
    32     {
    33         str = "0" + str;
    34     }
    35 
    36     ch[ligtemp.channelID] = str + (ligtemp.turn ? "T" : "F");
    37 }
    38 
    39 void bmLightControl::sendBright()
    40 {
    41     std::string all = "S" + ch[0] + ch[1] + ch[2] + ch[3] + "C#";
    42     mCtrl.sendBuff(all.c_str(), all.length() + 1);
    43 
    44     std::cout << mCtrl.readBuff() << std::endl;
    45 }
    46 
    47 bmLightManage::bmLightManage()
    48 {
    49 }
    50 
    51 
    52 bmLightManage::~bmLightManage()
    53 {
    54 }
    55 
    56 void bmLightManage::Init(const char* portNum0, const char* portNum1, const char* portNum2)
    57 {
    58     mCon[0].Init(portNum0);
    59     mCon[1].Init(portNum1);
    60     mCon[2].Init(portNum2);
    61 }
    62 
    63 void bmLightManage::setBright(std::vector<LightSetting> ligtemp)
    64 {
    65     for (int i = 0; i < ligtemp.size(); i++)
    66     {
    67         mCon[ligtemp[i].deviceID].setBright(ligtemp[i]);
    68     }
    69 
    70     for (int i = 0; i < 3; i++)
    71     {
    72         mCon[i].sendBright();
    73     }
    74 }

    qttestcomm.h

     1 #ifndef QTTESTCOMM_H
     2 #define QTTESTCOMM_H
     3 
     4 #include <QtWidgets/QWidget>
     5 #include "ui_qttestcomm.h"
     6 #include "bmLightManage.h"
     7 #include <QSlider>
     8 #include <QVBoxLayout>
     9 #include <QDebug>
    10 
    11 class qttestcomm : public QWidget
    12 {
    13     Q_OBJECT
    14 
    15 public:
    16     qttestcomm(QWidget *parent = 0);
    17     ~qttestcomm();
    18 
    19 private:
    20     Ui::qttestcommClass ui;
    21     QSlider mslider;
    22     bmLightManage m;
    23 
    24     public slots:
    25     void slot1(int va);
    26 };
    27 
    28 #endif // QTTESTCOMM_H

    qttestcomm.cpp

     1 #include "qttestcomm.h"
     2 
     3 qttestcomm::qttestcomm(QWidget *parent)
     4     : QWidget(parent)
     5 {
     6     ui.setupUi(this);
     7     
     8     mslider.setMinimum(0);
     9     mslider.setMaximum(255);
    10     QVBoxLayout *lay1 = new QVBoxLayout;
    11     lay1->addWidget(&mslider);
    12     this->setLayout(lay1);
    13     m.Init("COM1","COM2","COM3");
    14 
    15     connect(&mslider, SIGNAL(valueChanged(int)), this, SLOT(slot1(int)));
    16 }
    17 
    18 qttestcomm::~qttestcomm()
    19 {
    20 
    21 }
    22 
    23 void qttestcomm::slot1(int va)
    24 {
    25     qDebug() << va;
    26     mslider.setToolTip(QString::number(va));
    27     
    28     std::vector<LightSetting> ll;
    29     ll.push_back(LightSetting(0, 0, true, va));
    30     ll.push_back(LightSetting(0, 1, true, va));
    31     ll.push_back(LightSetting(1, 0, true, va));
    32     ll.push_back(LightSetting(1, 1, true, va));
    33     ll.push_back(LightSetting(1, 2, true, va));
    34     ll.push_back(LightSetting(1, 3, true, va));
    35     ll.push_back(LightSetting(2, 0, true, va));
    36     ll.push_back(LightSetting(2, 1, true, va));
    37     ll.push_back(LightSetting(2, 2, true, va));
    38     ll.push_back(LightSetting(2, 3, true, va));
    39 
    40     m.setBright(ll);
    41 }

    main.cpp

     1 #include "qttestcomm.h"
     2 #include <QtWidgets/QApplication>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication a(argc, argv);
     7     qttestcomm w;
     8     w.show();
     9     return a.exec();
    10 }

    第一次写串口通信程序,特此记录

    参考:http://www.cnblogs.com/zahxz/archive/2012/12/24/2830535.html

    附一个比较全面的串口通信程序:http://blog.csdn.net/wujian53/article/details/4090554

  • 相关阅读:
    CodeForces 567C. Geometric Progression(map 数学啊)
    【 D3.js 高级系列 — 7.0 】 标注地点
    我的家乡:三河古镇已经登上央视CCTV-1新闻联播啦!
    自考--初读
    微信支付v2开发(6) 发货通知
    微信支付v2开发(7) 告警通知
    微信支付v2开发(8) 维权通知
    微信公众平台注册
    微信公众平台开发(95) 世界杯赛程
    微信公众平台开发(96) 多个功能整合
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/6187892.html
Copyright © 2011-2022 走看看