C++ 串口通讯

#pragma once
class CComHelper
{
private:
	HANDLE hCom;
public:
	bool Open();
	void Set();
	DWORD Read(char str[], int length);
	bool Write(char* data, int length);
	bool Close();
};

#include "pch.h"
#include "CComHelper.h"

bool CComHelper::Open()
{
    hCom = CreateFile(_T("COM5"), GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
	if (hCom==(HANDLE)-1)
	{
		return false;
	}
	return true;

}

void CComHelper::Set()
{
	SetupComm(hCom, 100, 100);
	COMMTIMEOUTS TimeOuts; //设定读超时
	TimeOuts.ReadIntervalTimeout = MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier = 0;
	TimeOuts.ReadTotalTimeoutConstant = 0;

	
	TimeOuts.WriteTotalTimeoutConstant = 500;//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier = 100;
	SetCommTimeouts(hCom, &TimeOuts);

	DCB dcb;
	GetCommState(hCom, &dcb);
	dcb.BaudRate = 9600; //波特率为9600
	dcb.ByteSize = 8; //每个字节有8位
	dcb.Parity = NOPARITY; //无奇偶校验位
	dcb.StopBits = TWOSTOPBITS; //两个停止位
	SetCommState(hCom, &dcb);
	PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
}

DWORD CComHelper::Read(char* data, int length)
{
	
	DWORD dwCount = (DWORD)length;
	bool bReadStat = ReadFile(hCom, data, dwCount, &dwCount, NULL);
	return dwCount;

}

bool CComHelper::Write(char* data, int length)
{
	DWORD dwWrite = (DWORD)length;
	COMSTAT ComStat;
	DWORD  dwError;
	ClearCommError(hCom, &dwError, &ComStat);
	bool bWriteStat = WriteFile(hCom, data, dwWrite, &dwWrite, NULL);
	if (!bWriteStat)
	{
		return false;
	}
	PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR | PURGE_RXCLEAR);
	return true;
}

bool CComHelper::Close()
{
	bool result = CloseHandle(hCom);
	return result;
}

// SerialPortTestDlg.h: 头文件
//

#pragma once
#include "CComHelper.h"


// CSerialPortTestDlg 对话框
class CSerialPortTestDlg : public CDialogEx
{
// 构造
public:
	CSerialPortTestDlg(CWnd* pParent = nullptr);	// 标准构造函数

	CComHelper com;

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_SERIALPORTTEST_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedBtnInit();
	afx_msg void OnBnClickedBtnOpen();
	afx_msg void OnBnClickedBtnWrite();
	afx_msg void OnBnClickedBtnRead();
};

// SerialPortTestDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "SerialPortTest.h"
#include "SerialPortTestDlg.h"
#include "afxdialogex.h"
#include "resource.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CSerialPortTestDlg 对话框



CSerialPortTestDlg::CSerialPortTestDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SERIALPORTTEST_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSerialPortTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSerialPortTestDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_INIT, &CSerialPortTestDlg::OnBnClickedBtnInit)
	ON_BN_CLICKED(IDC_BTN_OPEN, &CSerialPortTestDlg::OnBnClickedBtnOpen)
	ON_BN_CLICKED(IDC_BTN_WRITE, &CSerialPortTestDlg::OnBnClickedBtnWrite)
	ON_BN_CLICKED(IDC_BTN_READ, &CSerialPortTestDlg::OnBnClickedBtnRead)
END_MESSAGE_MAP()


// CSerialPortTestDlg 消息处理程序

BOOL CSerialPortTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CSerialPortTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSerialPortTestDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CSerialPortTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CSerialPortTestDlg::OnBnClickedBtnInit()
{
	com.Set();
}


void CSerialPortTestDlg::OnBnClickedBtnOpen()
{
	bool bResult = com.Open();
}


void CSerialPortTestDlg::OnBnClickedBtnWrite()
{
	char buffer[1024];
	CString input;
	GetDlgItemText(IDC_EDIT_WRITE,input);
	char* p = input.GetBuffer(0);
	strcpy_s(buffer, p);
	bool bResult = com.Write(buffer, strlen(p));
}


void CSerialPortTestDlg::OnBnClickedBtnRead()
{
	char buffer[1024];
	DWORD length = com.Read(buffer, 1024);
	CString str = CString(buffer,length);
	SetDlgItemText(IDC_EDIT_READ, str);
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 串口通讯程序是一种特定的软件,用于在计算机和外部设备之间进行数据传输和通信。串口通讯程序实现了串行接口的通信协议,并提供了一种可靠的数据传输机制。 串口通讯程序主要用于与各种设备进行通信,例如微控制器、传感器、打印机、条码扫描仪等。通过串口通讯程序,计算机可以通过串口与这些设备进行数据交换和控制。 在串口通讯程序中,首先需要设置串口的通信参数,如波特率、数据位、停止位和校验位等。这些参数将决定数据的传输速率和数据的完整性。 接下来,串口通讯程序可以实现数据的发送和接收。发送数据时,将需要发送的数据按照一定的协议进行封装,并通过串口发送到目标设备。接收数据时,串口通讯程序会监听串口,接收设备发送过来的数据,并进行解析和处理。 在串口通讯程序中,常用的数据传输协议有ASCII码、二进制码、Modbus等。这些协议规定了数据的格式和传输规则,保证了数据的可靠性和正确性。 串口通讯程序在工业自动化领域广泛应用,例如在生产线上,通过串口通讯程序可以实现计算机对各种设备的控制和监控。它也可以用于数据采集和传输,实现数据在计算机和外部设备之间的同步和交换。 总之,串口通讯程序是一种专门用于实现计算机与外部设备之间数据传输和通信的软件,它通过合适的配置和协议,实现可靠的数据传输和控制。 ### 回答2: 串口通讯程序是一种用于在计算机和外部设备之间进行数据传输的软件。它主要用于通过串行接口连接计算机和外部设备,例如串口打印机、串口摄像头、串口传感器等。 串口通讯程序的功能包括数据发送和接收。它通过串口将计算机发送的数据传输给外部设备,或者接收外部设备发送的数据,并将其传输给计算机。通常,串口通讯程序会提供可视化界面,方便用户操作和监控数据传输过程。 串口通讯程序通常使用串口通讯协议来确保数据传输的可靠性和准确性。常见的串口通讯协议有RS-232和RS-485等,这些协议规定了数据传输的格式和通讯规则,确保计算机和外部设备之间能够正常通讯。 在实际应用中,串口通讯程序广泛应用于各种领域。例如,工业控制系统中常常使用串口通讯程序与各种设备进行数据交互,以实现自动化控制;电子设备维修测试过程中,使用串口通讯程序与设备进行通讯,获取设备状态和执行控制命令。 总之,串口通讯程序是一种非常重要的软件,它实现了计算机与外部设备的数据传输功能,广泛用于各种应用场景中。 ### 回答3: C串口通讯程序是一种用于实现串口通信的软件。串口通信是一种广泛应用于电子设备之间的数据传输方式,特点是可靠、稳定,并能够长距离传输。C串口通讯程序使用C语言开发,具有高效、灵活和可扩展的特点。 C串口通讯程序主要有以下功能: 1. 串口初始化:程序会设置串口的波特率、数据位、停止位、奇偶校验等参数,以确保正确的数据传输。 2. 数据发送:程序可以向串口发送数据,通过发送特定的数据帧来与其他设备进行通信。发送数据的方式可以是同步或异步的方式。 3. 数据接收:程序可以监听串口接收到的数据,并进行处理。接收到的数据可以用于处理其他设备的请求,或者作为输入数据进行进一步的处理。 4. 错误处理:程序会处理串口通信过程中出现的错误,例如数据丢失、传输超时等。对于不正常的情况,程序会进行错误处理,以确保通信的可靠性。 5. 扩展性:C串口通讯程序具有良好的扩展性,可以根据需要添加其他功能模块,如协议解析、错误检测等。 总的来说,C串口通讯程序是一种用于实现串口通信的软件,通过发送和接收数据来实现设备之间的通信。它具有高效、灵活和可扩展的特点,并能够处理通信过程中出现的错误,确保数据的可靠传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值