编程爱好者联盟 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
背景在工业上,当设备之间不能通过网络联通时,通常设备上有串口可以用于传输数据,该系统是利用设备的串口来达到传输文件的目的.enum {REQ = 1, DATA, ACK, FINISH, ERR};