- 浏览: 353360 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
https://bbs.csdn.net/wap/topics/350150286
https://blog.csdn.net/wzmsltw/article/details/50723267
https://blog.csdn.net/henhen2002/article/details/4485186
https://www.cnblogs.com/chucks123/p/7545660.html
https://blog.csdn.net/alaseven/article/details/8875906
https://www.cnblogs.com/memset/archive/2012/12/24/common.html
https://www.cnblogs.com/wangweifeng/p/7599888.html
https://www.cnblogs.com/chucks123/p/7545660.html
https://blog.csdn.net/wzmsltw/article/details/50723267
https://blog.csdn.net/henhen2002/article/details/4485186
https://www.cnblogs.com/chucks123/p/7545660.html
https://blog.csdn.net/alaseven/article/details/8875906
https://www.cnblogs.com/memset/archive/2012/12/24/common.html
https://www.cnblogs.com/wangweifeng/p/7599888.html
https://www.cnblogs.com/chucks123/p/7545660.html
/*************************************************************************************************/ /*! \file SerialPort.h \attention Copyright (c) 2018 XXX. All Rights Reserved. \History [V1.00][2018-11-05][Jacky] - Init Version */ /*************************************************************************************************/ #ifndef SERIAL_PORT_H #define SERIAL_PORT_H /*** Include files *******************************************************************************/ #include <windows.h> #ifdef __cplusplus extern "C" { #endif /*** Defines/Macros/Constants/Typedefs ***********************************************************/ #define SERIAL_PORT_READ_BUFFER_SIZE 1024 typedef enum EM_SERIAL_PORT_PARITY { /*0-4=None,Odd,Even,Mark,Space*/ SerialPort_NoParity = NOPARITY, SerialPort_OddParity = ODDPARITY, SerialPort_EvenParity = EVENPARITY, SerialPort_MarkParity = MARKPARITY, SerialPort_SpaceParity = SPACEPARITY }SERIAL_PORT_PARITY; typedef enum EM_SERIAL_PORT_STOPBITS { /* 0,1,2 = 1, 1.5, 2 */ SerialPort_OneStopBit = ONESTOPBIT, SerialPort_OneFiveStopBits = ONE5STOPBITS, SerialPort_TwoStopBits = TWOSTOPBITS }SERIAL_PORT_STOPBITS; typedef enum EM_SERIAL_PORT_DATABITS {/* Number of bits/byte, 4-8 */ SerialPort_4DataBits = 4, SerialPort_5DataBits = 5, SerialPort_6DataBits = 6, SerialPort_7DataBits = 7, SerialPort_8DataBits = 8 }SERIAL_PORT_DATABITS; typedef enum EM_SERIAL_PORT_FLOWCONTROL {/* Number of bits/byte, 4-8 */ SerialPort_FlowControl_None = 0, SerialPort_FlowControl_HW = 1, SerialPort_FlowControl_SW = 2 }SERIAL_PORT_FLOWCONTROLS; typedef struct tag_SerialPortSetting { DWORD dwBaudRate; /* Baud rate at which running */ // The value should be equals followings which defined in WinBase.h //CBR_110/CBR_300/CBR_600/CBR_1200/CBR_2400/CBR_4800/CBR_9600 //CBR_14400/CBR_19200/CBR_38400/CBR_56000/CBR_57600/CBR_115200/CBR_128000/CBR_256000 SERIAL_PORT_DATABITS emDataBits; SERIAL_PORT_PARITY emParity; SERIAL_PORT_STOPBITS emStopBits; SERIAL_PORT_FLOWCONTROLS emFlowControl; DWORD dwIntervalTimeout; tag_SerialPortSetting() { dwBaudRate = CBR_115200; emDataBits = SerialPort_8DataBits; emParity = SerialPort_NoParity; emStopBits = SerialPort_OneStopBit; emFlowControl = SerialPort_FlowControl_None; dwIntervalTimeout = MAXDWORD; } }SerialPortSetting, *PSerialPortSetting; /*************************************************************************************************/ /*! \brief OpenSerialPort Opens a serial port(I/O). \param[in] strPort - The name of the file or device to be created or opened. You may use either forward slashes (/) or backslashes () in this name. \param[in] cSerialPortSetting - Detailed settings for the serial port. \return If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot. If the function fails, the return value is INVALID_HANDLE_VALUE. */ /*************************************************************************************************/ HANDLE OpenSerialPort(IN CONST CString strPortName, IN CONST SerialPortSetting cSerialPortSetting); /*************************************************************************************************/ /*! \brief CloseSerialPort Closes a serial port(I/O). \param[in] hSerialPort - Pointer to the handle of the serial port. \return Return TRUE if the function succeeds else return FALSE. */ /*************************************************************************************************/ BOOL CloseSerialPort(IN CONST HANDLE hSerialPort); /*************************************************************************************************/ /*! \brief WriteDataToSerialPort Send data to specific serial port. \param[in] hSerialPort - Pointer to the handle of the serial port. \param[in] pbyData - Pointer to the buffer that specifies the data you want to send. \param[in] dwSize - The size of data buffer. \return Return TRUE if the function succeeds else return FALSE. */ /*************************************************************************************************/ BOOL WriteDataToSerialPort(IN CONST HANDLE hSerialPort, IN CONST BYTE* pbyData, IN CONST DWORD dwSize); /*************************************************************************************************/ /*! \brief ReadDataFromSerialPort Stores received data into a destination buffer. \param[in] hSerialPort - Pointer to the handle of the serial port. \param[in] pbyBuffer - Pointer to the raw destination buffer. \param[in/out] dwSize - The total size of data buffer/Used data buffer size. \return Return TRUE if the function succeeds else return FALSE. */ /*************************************************************************************************/ BOOL ReadDataFromSerialPort(IN CONST HANDLE hSerialPort, OUT BYTE* pbyBuffer, IN OUT DWORD& dwSize); #ifdef __cplusplus } #endif #endif//SERIAL_PORT_H
/*************************************************************************************************/ /*! \file SerialPort.cpp \attention Copyright (c) 2018 XXX. All Rights Reserved. \History [V1.00][2018-11-05][Jacky] - Init Version */ /*************************************************************************************************/ /*** Include files *******************************************************************************/ #include "stdafx.h" #include "SerialPort.h" #ifdef __cplusplus extern "C" { #endif /*************************************************************************************************/ /*! \brief OpenSerialPort Opens a serial port(I/O). \param[in] strPort - The name of the file or device to be created or opened. You may use either forward slashes (/) or backslashes () in this name. \param[in] cSerialPortSetting - Detailed settings for the serial port. \return If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot. If the function fails, the return value is INVALID_HANDLE_VALUE. */ /*************************************************************************************************/ HANDLE OpenSerialPort(CONST CString strPortName, CONST SerialPortSetting cSerialPortSetting) { HANDLE hSerialPort = INVALID_HANDLE_VALUE; hSerialPort = CreateFile(strPortName, GENERIC_READ | GENERIC_WRITE, 0, // exclusive share NULL, OPEN_EXISTING, 0, NULL); if (INVALID_HANDLE_VALUE == hSerialPort) { #ifdef DEBUG OutputDebugString(_T("Failed to open serial port!\n")); #endif return hSerialPort; } //Get Current Settings ////////////////////////////////////////////////////////////////////////// DCB cPortDCB; cPortDCB.DCBlength = sizeof(DCB); if (!GetCommState(hSerialPort, &cPortDCB))// Get the default serial parameter. { #ifdef DEBUG OutputDebugString(_T("Failed to call GetCommState()!\n")); #endif CloseHandle(hSerialPort); return INVALID_HANDLE_VALUE; } else { //Apply serial port settings ////////////////////////////////////////////////////////////////////////// cPortDCB.BaudRate = cSerialPortSetting.dwBaudRate; cPortDCB.ByteSize = cSerialPortSetting.emDataBits; cPortDCB.Parity = cSerialPortSetting.emParity; cPortDCB.StopBits = cSerialPortSetting.emStopBits; switch(cSerialPortSetting.emFlowControl) { case SerialPort_FlowControl_HW: { cPortDCB.fOutxCtsFlow = 1; cPortDCB.fRtsControl = RTS_CONTROL_HANDSHAKE; cPortDCB.fOutX = 0; cPortDCB.fInX = 0; break; } case SerialPort_FlowControl_SW: { cPortDCB.fOutxCtsFlow = 0; cPortDCB.fRtsControl = 0; cPortDCB.fOutX = 1; cPortDCB.fInX = 1; break; } case SerialPort_FlowControl_None: default: { cPortDCB.fOutxCtsFlow = 0; cPortDCB.fRtsControl = 0; cPortDCB.fOutX = 0; cPortDCB.fInX = 0; break; } } if (!SetCommState(hSerialPort, &cPortDCB)) { //config the serial port failed. CloseHandle(hSerialPort); return (INVALID_HANDLE_VALUE); } } //Config the serial port timeout property. ////////////////////////////////////////////////////////////////////////// COMMTIMEOUTS CommTimeouts; if (!GetCommTimeouts(hSerialPort, &CommTimeouts))//Get the serial port default timeout. { CloseHandle(hSerialPort); return INVALID_HANDLE_VALUE; } else { CommTimeouts.ReadIntervalTimeout = cSerialPortSetting.dwIntervalTimeout; CommTimeouts.ReadTotalTimeoutMultiplier = 10; CommTimeouts.ReadTotalTimeoutConstant = 10; CommTimeouts.WriteTotalTimeoutMultiplier = 50; CommTimeouts.WriteTotalTimeoutConstant = 100; if (!SetCommTimeouts(hSerialPort, &CommTimeouts)) { //config the serial port timeout failed; CloseHandle(hSerialPort); return INVALID_HANDLE_VALUE; } } return hSerialPort; //Everything should be fine. (~v~) - Cheers!!! } /*************************************************************************************************/ /*! \brief CloseSerialPort Closes a serial port(I/O). \param[in] hSerialPort - Pointer to the handle of the serial port. \return Return TRUE if the function succeeds else return FALSE. */ /*************************************************************************************************/ BOOL CloseSerialPort(CONST HANDLE hSerialPort) { return CloseHandle(hSerialPort); } /*************************************************************************************************/ /*! \brief WriteDataToSerialPort Send data to specific serial port. \param[in] hSerialPort - Pointer to the handle of the serial port. \param[in] pbyData - Pointer to the buffer that specifies the data you want to send. \param[in] dwSize - The size of data buffer. \return Return TRUE if the function succeeds else return FALSE. */ /*************************************************************************************************/ BOOL WriteDataToSerialPort(CONST HANDLE hSerialPort, CONST BYTE* pbyData, CONST DWORD dwSize) { BOOL bRet = FALSE; DWORD nHasBeenSend = 0; DWORD dwRet = 0; while (TRUE) { DWORD dwSendBytes = 0; if (!WriteFile(hSerialPort, pbyData+nHasBeenSend, dwSize-nHasBeenSend, &dwSendBytes, NULL)) { #ifdef DEBUG OutputDebugString(_T("Failed to call WriteFile()!\n")); #endif dwRet = GetLastError(); bRet = FALSE; break; } else { if (dwSendBytes > 0) { nHasBeenSend += dwSendBytes; } if (nHasBeenSend > dwSize) { #ifdef DEBUG OutputDebugString(_T("OverStack!\n")); #endif bRet = FALSE; break; } else if (dwSize == nHasBeenSend) { bRet = TRUE; break; } } } return bRet; } /*************************************************************************************************/ /*! \brief ReadDataFromSerialPort Stores received data into a destination buffer. \param[in] hSerialPort - Pointer to the handle of the serial port. \param[in] pbyBuffer - Pointer to the raw destination buffer. \param[in/out] dwSize - The total size of data buffer/Used data buffer size. \return Return TRUE if the function succeeds else return FALSE. */ /*************************************************************************************************/ BOOL ReadDataFromSerialPort(CONST HANDLE hSerialPort, BYTE* pbyBuffer, DWORD& dwSize) { //SetCommMask (hSerialPort, EV_RXCHAR); DWORD dwHasBeenReadSize = 0; BYTE byTempBuffer = 0x00; BOOL bRet = FALSE; DWORD dwMask = EV_RXCHAR; #ifdef DEBUG DWORD dwError = 0; #endif if (!WaitCommEvent(hSerialPort, &dwMask, NULL)) { #ifdef DEBUG OutputDebugString(_T("Failed to call WaitCommEvent()!\n")); #endif dwError = GetLastError(); //return FALSE; } if (!SetCommMask(hSerialPort, EV_RXCHAR)) { #ifdef DEBUG OutputDebugString(_T("Failed to call SetCommMask()!\n")); #endif //return FALSE; } while (TRUE) { DWORD dwReadBytes = 0; if (ReadFile(hSerialPort, &byTempBuffer, 1, &dwReadBytes, 0)) { if (dwReadBytes > 0) { if (dwHasBeenReadSize+dwReadBytes > dwSize) { //out of bounds ? #ifdef DEBUG OutputDebugString(_T("out of bounds!\n")); #endif bRet = FALSE; break; } else { memcpy(&pbyBuffer[dwHasBeenReadSize], &byTempBuffer, dwReadBytes); dwHasBeenReadSize += dwReadBytes; } } else { bRet = TRUE; break; } } else { #ifdef DEBUG OutputDebugString(_T("Failed to call ReadFile!\n")); #endif bRet = FALSE; break; } } dwSize = dwHasBeenReadSize; return bRet; } #ifdef __cplusplus } #endif
//===========================SerialPort.H的开始========================= #pragma once #include <windows.h> #include <string> using namespace std; HANDLE OpenSerialPort(string & strPort, ULONG ulBaudrate); void CloseSerialPort(HANDLE hSerial); bool WriteSerial(char* btData, ULONG ulSize, HANDLE hSerial); bool ReadSerial(BYTE *btData, ULONG *ulSize, HANDLE hSerial); //===========================SerialPort.H的结束=========================
#include "SerialPort.h" HANDLE OpenSerialPort(string & strPort, ULONG ulBaudrate) { HANDLE hSerial; hSerial = CreateFile((strPort.c_str()), GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, NULL, NULL); if (hSerial == INVALID_HANDLE_VALUE)//Open serial port failed. { return hSerial; } //Config serial port DCB PortDCB; PortDCB.DCBlength = sizeof(DCB); // Get the default serial parameter. GetCommState(hSerial, &PortDCB); PortDCB.BaudRate = ulBaudrate; // baudrate PortDCB.ByteSize = 8; // Number of bits/byte, 4-8 PortDCB.Parity = NOPARITY; PortDCB.StopBits = ONESTOPBIT; if (!SetCommState(hSerial, &PortDCB)) { //config the serial port failed. CloseHandle(hSerial); return (INVALID_HANDLE_VALUE); } //Config the serial port timeout property. COMMTIMEOUTS CommTimeouts; GetCommTimeouts(hSerial, &CommTimeouts); //Get the serial port default timeout. CommTimeouts.ReadIntervalTimeout = MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier = 10; CommTimeouts.ReadTotalTimeoutConstant = 10; CommTimeouts.WriteTotalTimeoutMultiplier = 50; CommTimeouts.WriteTotalTimeoutConstant = 100; if (!SetCommTimeouts(hSerial, &CommTimeouts)) { //config the serial port timeout failed; CloseHandle(hSerial); return (INVALID_HANDLE_VALUE); } return (hSerial); }; void CloseSerialPort(HANDLE hSerial) { CloseHandle(hSerial); }; bool WriteSerial(char* btData, ULONG ulSize, HANDLE hSerial) { DWORD dwNumBytes, dwRet; dwRet = WriteFile(hSerial, //Handle btData, //Data buffer ulSize, //Buffer size &dwNumBytes, //written bytes NULL); //don't support return (dwRet != 0); }; bool ReadSerial(BYTE *btData, ULONG *ulSize, HANDLE hSerial) { //SetCommMask (hSerial, EV_RXCHAR); ULONG ulRdSize = 0; BYTE Byte; DWORD dwBytes; bool blRd = false; DWORD dwMask = EV_RXCHAR; //WaitCommEvent(hSerial,&dwMask,NULL); SetCommMask(hSerial, EV_RXCHAR); while (ReadFile(hSerial, &Byte, 1, &dwBytes, 0) != 0) { if (dwBytes>0) { btData[ulRdSize++] = Byte; if (ulRdSize == *ulSize) { blRd = true; break; } } else { blRd = true; break; } } *ulSize = ulRdSize; return (blRd); };
///////////////////////////////main.cpp//////////////////////////////////////// //使用代码示例: #include "SerialPort.h" #include <iostream> using namespace std; HANDLE hSerialPort; int main() { string portname = "COM4:"; string buff = "HELLO!"; char c[20]; strcpy_s(c, buff.c_str()); hSerialPort = OpenSerialPort( portname, 9600);//Open serial port com1 if (hSerialPort != INVALID_HANDLE_VALUE) { if (!WriteSerial(c, 7, hSerialPort))//Send data hello to com1 //MessageBox(0, "ERROR", "ERROR", MB_ICONWARNING);//show error message printf("ERROR!!"); //CloseSerialPort(hSerialPort); } system("pause"); }
- common-master.zip (340.3 KB)
- 下载次数: 1
- Configure_Virtual_Serial_Port_Driver破解版.7z (2.8 MB)
- 下载次数: 3
- vspd.rar (5.6 MB)
- 下载次数: 2
- Virtual_Serial_Port_Driver.rar (5.4 MB)
- 下载次数: 3
发表评论
-
FreeRTOS
2022-03-05 16:31 203Ref https://blog.csdn.net/weix ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1223https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 420https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 518// this function create a bmp ... -
[轉] android默认debug.keystore的密码
2017-12-12 11:14 973http://blog.csdn.net/leehong200 ... -
Android NDK搭建環境
2017-11-27 13:25 526https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5108583相关资料,整理中... -
Java反编译工具 - Java Decompiler
2017-06-21 20:14 416http://jd.benow.ca/ JD-GUI is ... -
JAVA环境变量配置
2017-06-19 13:56 305参考Link http://www.cnblogs.com/x ... -
Java高级应用之JNI
2017-06-19 09:00 538参考link http://www.cnblogs.com/l ... -
Windows7上使用VMWare搭建iPhone开发环境
2017-05-17 08:49 397Windows7上使用VMWare搭建iPhone开发环境 h ... -
C++实现ping功能
2017-04-18 11:21 2023基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 8501 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1505OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1833ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 810转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1808转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 997C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 924转自 http://www.cnblogs.com/zeroo ...
相关推荐
vc串口通讯相关论文,从学校网上下载的几篇关于如何用VC++6.0作串口开发的论文,很有参考价值。
嵌入式QT开发课题-车载多媒体界面程序(集游戏、音乐、串口通讯相关等).zip
OMRON串口通讯实例,通过简单的串口设置连接OMRON,进行数据通讯。可以扩展到其他相关程序
VB2005自带了一个串口通讯的控件SerialPort,该控件类似于VB6.0的串口Mscomm,但又有一定区别。 下面是对它们的一个比较: 1.串口的打开/关闭 2.参数的设置对比 3.向串行端口输出缓冲区写数据 4.从串行端口输入缓冲区...
Java串口通讯代码和工具: 导入相关 jar包到工程, 参看里面的 txt文件操作 (注意: 确认串口没有被占用。)
串口通讯 串口通讯的相关文献来自知网串口通讯的相关文献来自知网串口通讯的相关文献来自知网串口通讯的相关文献来自知网
用于纯MS-DOS6.22系统的串口通讯,包括interlnk.exe和intersvr.exe及相关说明
1.可建立串口通讯,前题是电脑需有串口可接。 2.可根据所需修改串口,波特率等相关信息。 3.可当demo来使用,程序亲测可用。 更多功能,可自行修改源码 优点: 1.方便设备之间的通讯 2.winform窗体显示串口接收的...
包含若干串口通讯相关文摘,内容设计单片机,VC和JAVA编程,多线程等技术
网上的很多相关的串口的源码是有问题的,至少有很多的bug,特别是死锁的问题大部分都没有解决,如果你也正好遇到这个问题,或许可以帮你解决燃眉之急,当然程序难免有些小错误,欢迎提出,谢谢。
dsp与labvIEW串口通讯,具有相关源码的说明,很值得一看哟!
[008]m68k手持机的通讯相关源码,适合串口通讯以及ic刷卡编程的使用者参考.zip上位机开发VC串口学习资料源码下载[008]m68k手持机的通讯相关源码,适合串口通讯以及ic刷卡编程的使用者参考.zip上位机开发VC串口学习...
该领域范围涉及到工业领域的自动化与控制技术,其中涉及到串口通讯、网络通讯以及控制模块等相关技术。C#作为一种面向对象编程语言,其语法简单易懂,易于开发。Modbus是一种在工业自动化领域广泛使用的通信协议,...
想要串口通信就必须事先配置好所需要的的3个文件.在这里我已经将这3个文件和相关的配置介绍做了详细的介绍.
RS232串口通讯传输的资料,有关串口通讯的东东
使用网页读取串口电子秤的重量,使用插件方式&JS方式实现, 在网页的特定地方显示当前通过RS232链接的电子秤上的重量数据。...我的博客 java RS232串口通讯上有对此有相关方法,希望能对大家有帮助。
串口通讯的小程序
串口通讯相关的例程,仅供参考,谢谢大家谢谢大家