简单的串口通信程序控制光源

编程爱好者联盟 2016-12-16

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

1、打开串口

2、配置串口

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

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

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

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

7、关闭串口

bmLightComm.h

#pragma once
 #include "stdio.h"
 #include "stdbool.h"
 #include "windows.h"
 #include "tchar.h"
 
 class bmLightComm
 {
 public:
     bmLightComm();
     ~bmLightComm();
     bool openPort(const char* portNum);
     bool setupPort(DWORD baudrate, BYTE bytesize, BYTE stopbits, DWORD fparity, BYTE parity);
     bool setBufferAreaSize(DWORD inQueue, DWORD outQueue);
     bool setComTimeout(DWORD readinttim, DWORD readToltimM, DWORD readToltimC,DWORD writeToltimM, DWORD writeToltimC);
     bool purgePort(DWORD flags);
     bool closePort();
 
     bool sendBuff(const char* datas, unsigned int len);
     char readBuff();
 
 private:
     HANDLE mCom;
 };

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\n", 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\n", portNum,  GetLastError());
 23         return false;
 24     }
 25     else
 26     {
 27         printf("cam %s opened\n", 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\n");
 35 
 36     DCB mDcb;
 37     if (!GetCommState(mCom, &mDcb))
 38     {
 39         printf("get com state failed %d\n", 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\n", GetLastError());
 52         return false;
 53     }
 54     else
 55     {
 56         printf("com set up complete\n");
 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\n", GetLastError());
 66         return false;
 67     }
 68     else
 69     {
 70         printf("com set buffer size complete\n");
 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\n", GetLastError());
 87         return false;
 88     }
 89     else
 90     {
 91         printf("set time out complete\n");
 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\n", GetLastError());
102         return false;
103     }
104     else
105     {
106         printf("purge com complete\n");
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\n", GetLastError());
118         return false;
119     }
120     else
121     {
122         printf("close port complete\n");
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\n", GetLastError());
135         return false;
136     }
137     else
138     {
139         printf("write buff complete\n");
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\n", GetLastError());
153         return '\0';
154     }
155     else
156     {
157         printf("read buff complete\n");
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

#include "qttestcomm.h"
 #include <QtWidgets/QApplication>
 
 int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
     qttestcomm w;
     w.show();
     return a.exec();
 }

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

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

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

相关推荐