c++串口使用类
程序员文章站
2022-04-11 22:17:50
使用例子 1 #include"ComHandle.h" ......
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 }