串口通信---创建串口Demo

用 WindowsAPI 编写串口程序;
简单的集成了一下串口最基本的创建,打开,参数设置,可根据实际需求进行增添和修改;
主要头文件:

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h>
 #define     PORTNAME                 L"COM1"
 #define     BAUDRATE                 115200
 #define     ReadInterval             0
 #define     ReadTotalconstant        0
 #define     ReadTotalMultiplierE     0
 #define     WriteTotalconstant       0
 #define     =WriteTotalMultiplier    0
 #define     INPUTBUFFSIZE            1024
 #define     OUTPUTBUFFSIZE           1024


HANDLE hCom = INVALID_HANDLE_VALUE;
/*
OVERLAPPED  m_overlappedRead;
OVERLAPPED  m_overlappedWrite;
*/

//通讯串口是否打开
bool IsOpen()
{
    return hCom != INVALID_HANDLE_VALUE;
}

//关闭串口
void ClosePort()
{
    if (IsOpen())
    {
        CloseHandle(hCom);
        hCom = INVALID_HANDLE_VALUE;
    }
    /*
    if (m_overlappedRead.hEvent != NULL)
    {
        CloseHandle(m_overlappedRead.hEvent);
    }
    if (m_overlappedWrite.hEvent != NULL)
    {
        CloseHandle(m_overlappedWrite.hEvent);
    }
    */
}

//打开串口
bool OpenPort()
{
    if (IsOpen())
    {
        ClosePort();
    }
    //打开串口;
    g_hComm = CreateFile(PORTNAME,  //串口号
        GENERIC_READ | GENERIC_WRITE, //允许读写 
        0, //通讯设备必须以独占方式打开 
        0, //无安全属性 
        OPEN_EXISTING, //通讯设备已存在 
        FILE_FLAG_OVERLAPPED, //异步 I/O 
        0); //通讯设备不能用模板打开 
    if (g_hComm == INVALID_HANDLE_VALUE) 
    { 
        CloseHandle(g_hComm);
        AfxMessageBox(L"打开串口失败");
        return false; 
    }

    //设置DCB
    DCB dcb;
    dcb.BaudRate = BAUDRATE;//串口号设置;
    dcb.ByteSize = 8;//数据宽度;
    dcb.Parity = NOPARITY;//校验位
    dcb.StopBits = ONESTOPBIT;//停止位;
    bool portStat = SetCommState(g_hComm, &dcb);
    if (!portStat)
    {
        AfxMessageBox(L"DCB设置失败");
        return false;
    }

    //超时设置;
    COMMTIMEOUTS timeouts; 
    //以毫秒为单位指定通信线上两个字符到达之间的最大时间,0 值表示不用间隔限时
    timeouts.ReadIntervalTimeout=ReadInterval;

    /*以毫秒为单位指定一个常数,用于计算读操作的总限时时间。 每个操作的总限时时间等于 ReadTotalTimeoutMultiplier 
    成员乘以读操作所需字节数再加上该值的和。成 员的值为0表示读操作不使用限时时间。*/
    timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;

    /*以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间。每个读操作的总限时时间等于
    读操作所需的字节数与该值的乘积。成 员的值为0表示读操作不使用限时时间。*/
    timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;

     //与读操作的意义相似;
    timeouts.WriteTotalTimeoutConstant=WriteTotalconstant; 
    timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;
    portStat = SetCommTimeouts(g_hComm, &timeouts);
    if (!portStat)
    {
        AfxMessageBox(L"串口超时设置失败");
        return false;
    }

    //缓冲区大小 
    portStat = SetupComm(g_hComm, INPUTBUFFSIZE, OUTPUTBUFFSIZE);
    if (!portStat)
    {
        AfxMessageBox(L"串口缓冲区大小设置失败");
        return false;
    }

    //设置事件(接收事件)
    portStat = SetCommMask(g_hComm, EV_RXCHAR);
    if (!portStat)
    {
        AfxMessageBox(L"串口事件设置失败");
        return false;
    }

    //清空缓冲区
    PurgeComm(g_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

    return true;
}

猜你喜欢

转载自blog.csdn.net/sazass/article/details/82259616