1. 程式人生 > >c++串口使用類

c++串口使用類

system lpc return valid 正常 存在 nor namespace 數據

  1 #ifndef  _COMHANDLE_H_
  2 #define  _COMHANDLE_H_
  3 #endif
  4 #include<string>
  5 #include<windows.h>
  6 using namespace std;
  7 
  8 //string轉LPCWSTR
  9 LPCWSTR stringToLPCWSTR(std::string orig)
 10 {
 11     size_t origsize = orig.length() + 1;
 12     const size_t newsize = 100
; 13 size_t convertedChars = 0; 14 wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(orig.length() - 1)); 15 mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE); 16 return wcstring; 17 } 18 ///////////////////////// 19 //ComHandle.h 20 //串口收發 21 ///////////////////////// 22 #pragma once 23 24 class
COM 25 { 26 public: 27 void Send(string str); 28 void Receieve(); 29 static void GetCom(); 30 COM(unsigned int Com, unsigned int BaudRate, unsigned int ByteSize, BYTE StopBits, BYTE Parity); 31 COM(unsigned int Com); 32 private: 33 HANDLE hcom; 34 }; 35 36 //Com:端口號,如COM3
37 COM::COM(unsigned int Com) 38 { 39 string str = "COM" + to_string(Com); 40 hcom = CreateFile(stringToLPCWSTR(str), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING 41 , FILE_ATTRIBUTE_NORMAL, NULL); 42 if (hcom == INVALID_HANDLE_VALUE) 43 { 44 45 printf("打開串口失敗!\n"); 46 system("pause"); 47 exit(0); 48 } 49 SetupComm(hcom, 1024, 1024); 50 DCB dcb; 51 GetCommState(hcom, &dcb); 52 dcb.BaudRate = 115200; 53 dcb.ByteSize = 8; 54 dcb.Parity = 0; 55 dcb.StopBits = 1; 56 SetCommState(hcom, &dcb); 57 } 58 59 60 //Com:端口號例如COM1;BaudRate:波特率;ByteSize:數據位;StopBits:停止位;Parity:奇偶校驗 61 COM::COM(unsigned int Com, unsigned int BaudRate, unsigned int ByteSize, BYTE StopBits, BYTE Parity) 62 { 63 string str = "COM" + to_string(Com); 64 hcom = CreateFile(stringToLPCWSTR(str), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING 65 , FILE_ATTRIBUTE_NORMAL, NULL); 66 if (hcom == INVALID_HANDLE_VALUE) 67 { 68 69 printf("打開串口失敗!\n"); 70 system("pause"); 71 exit(0); 72 } 73 SetupComm(hcom, 1024, 1024); 74 DCB dcb; 75 GetCommState(hcom, &dcb); 76 dcb.BaudRate = BaudRate; 77 dcb.ByteSize = ByteSize; 78 dcb.Parity = Parity; 79 dcb.StopBits = StopBits; 80 SetCommState(hcom, &dcb); 81 } 82 83 //發送數據 84 void COM::Send(string str) 85 { 86 string Message = str; 87 //string Message = "dj1mcs(2,1)"; 88 string Wrap = Message + "\r\n"; 89 const char* data = Wrap.data(); 90 DWORD dwWrittenLen = 0; 91 if (!WriteFile(hcom, data, strlen(data), &dwWrittenLen, NULL)) 92 { 93 printf("發送數據失敗!\n"); 94 } 95 printf("往串口發送數據成功!"); 96 97 } 98 99 100 //接收數據 101 void COM::Receieve() 102 { 103 Sleep(500); 104 char Receive[1024] = {}; 105 DWORD wCount;//讀取的字節數 106 BOOL bReadStat; 107 bReadStat = ReadFile(hcom, Receive, 1024, &wCount, NULL); 108 if (!bReadStat) 109 { 110 printf("讀串口失敗!"); 111 112 } 113 else 114 { 115 printf(Receive); 116 printf("\n"); 117 } 118 119 } 120 //獲取端口狀態 121 void COM::GetCom() 122 { 123 HANDLE hcom; 124 //默認檢測COM端口的返回值 125 hcom = INVALID_HANDLE_VALUE; 126 BOOL ret = false; 127 //逐一進行COM 端口檢測 128 for (int i = 1; i <= 32; i++) 129 { 130 131 string comname = "COM" + to_string(i); 132 //打開COM端口,並返回檢測值 133 hcom = CreateFileA(comname.c_str(), // 打開串口 134 GENERIC_READ | GENERIC_WRITE, //讀寫方式 135 0, //不能共享 136 NULL, //安全屬性,一般不用設為NULL 137 OPEN_EXISTING, //打開已存在的設備 138 FILE_ATTRIBUTE_NORMAL, //普通文件屬性 139 0); //無模板 140 //若無法打開指定COM端口 141 if (hcom == INVALID_HANDLE_VALUE) 142 { 143 144 //取得錯誤信息 145 DWORD err = ::GetLastError(); 146 //若 err 為 2 ,即此COM端口尚未安裝 147 if (err != 2) 148 { 149 printf("端口%d未安裝", i); 150 } 151 } 152 else 153 { 154 printf("端口%d正常\n", i); 155 ret = CloseHandle(hcom); 156 if (!ret) 157 { 158 // TRACE("CLOSE_PORT_FAIL\n"); 159 printf("關閉串口失敗!!"); 160 } 161 //else 162 //{ 163 // printf("success"); 164 //} 165 } 166 167 } 168 }

使用例子 1 #include"ComHandle.h"

 2 using namespace std;
 3 
 4 
 5 
 6 int main()
 7 {
 8     COM::GetCom();  //查看端口狀態
 9     unsigned int com = 0;10     string str = {};
11     cout << "請輸入端口號:";
12     cin >> com;
13     COM com1(com);
14     cout << "請輸入要發送的命令,輸入list獲取命令列表\n";
15     while (1)
16     {
17         cin >> str;
18         com1.Send(str);
19         com1.Receieve();
20     }
21     
22     system("pause");
23     return 0;
24 }



c++串口使用類