c++ windows串口传输数据

本文介绍了一个串口通信的实现案例,包括串口打开、配置、读写操作等关键步骤,并提供了一个简单的测试程序示例。

用虚拟串口软件 测试

//////////////////////////////////////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);
};
//===========================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的结束=========================
///////////////////////////////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");
}

转载于:https://www.cnblogs.com/chucks123/p/7545660.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值