学习笔记(六):C++串口连接

第一次使用markdown编辑器,很有意思,整理一下使用串口时的资料。写的不够全面,但用于简单的RS485串口连接足够用了。如有错误,请大家指正。

  • 1 建立串口连接
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,            //将要打开的串口号,如“COM1”
_In_ DWORD dwDesiredAccess,         //指定串口访问的类型,读取、写入或二者并列;
_In_ DWORD dwShareMode,             //指定共享属性,串口要设置为0 独占方式
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,    //缺省NULL
_In_ DWORD dwCreationDisposition,   //创建方式,串口为打开OPEN_EXISTING
_In_ DWORD dwFlagsAndAttributes,    //文件属性:设置同步或异步,一般使用同步,设置0
_In_opt_ HANDLE hTemplateFile       //对串口而言该参数必须置为NULL
);
    HANDLE m_hCom; //需申请为全局变量
    m_hCom=CreateFile(m_charPort,   //COM口 m_charPort申请的为cstring类型
        GENERIC_READ|GENERIC_WRITE, //允许读和写
        0,                          //独占方式
        NULL,
        OPEN_EXISTING,              //打开而不是创建
        NULL,                       //同步方式
        NULL);
    if(m_hCom==INVALID_HANDLE_VALUE)
    {
        LOG("打开PIS COM失败!");//LOG为日志文件输出库
        return false;
    }
  • 2 配置串口
    SetupComm(m_hCom,1024,1024); //hCom为打开串口返回的句柄,输入缓冲区和输出缓冲区的大小都是1024 
    COMMTIMEOUTS TimeOuts; 
    TimeOuts.ReadIntervalTimeout=MAXDWORD;  //读间隔超时。接收时,两字符间最大的时延。
    TimeOuts.ReadTotalTimeoutMultiplier=0;  //读时间系数。读取每字节的超时。
    TimeOuts.ReadTotalTimeoutConstant=0;    //读时间常量。读串口数据的固定超时。
    TimeOuts.WriteTotalTimeoutMultiplier=100;//写时间系数。写每字节的超时。
    TimeOuts.WriteTotalTimeoutConstant=500; //写时间常量。写串口数据的固定超时。
    //注:总超时 = 时间系数 * 字节数 + 时间常量;
    SetCommTimeouts(m_hCom,&TimeOuts); //设置超时
    DCB dcb; 
    GetCommState(m_hCom,&dcb); //获取串口设备的初始状态
    dcb.BaudRate=9600;   //波特率为9600,串口设备的波特率、字节位数、奇偶校验位、停止位
    dcb.ByteSize=8;      //每个字节有8位
    dcb.Parity=NOPARITY; //无奇偶校验位
    dcb.StopBits=ONESTOPBIT; //1个停止位
    SetCommState(m_hCom,&dcb);  //将信息配置串口
    PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//读写串口前要清空读写缓冲区
  • 3 读数据
BOOL ReadFile(
    HANDLE hFile,                   //文件的句柄
    LPVOID lpBuffer,                //用于保存读入数据的一个缓冲区
    DWORD nNumberOfBytesToRead,     //要读入的字节数
    LPDWORD lpNumberOfBytesRead,    //指向实际读取字节数的指针
    LPOVERLAPPED lpOverlapped       //OVERLAPPED结构体指针
);
    DWORD dwBytesRead=DACU_SIZE; //申请的存储所读缓冲区大小
    COMSTAT ComStat;
    DWORD dwErrorFlags;
    BOOL bReadStat;
    ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    //unsigned char m_byteDACU[DACU_SIZE]; 变量申请
    bReadStat=ReadFile(m_hCom,m_byteDACU,dwBytesRead,&dwBytesRead,NULL);
    if(!bReadStat)
    {
        LOG("写串口失败!");
        dwErrorFlags = GetLastError();
    }
  • 4 写数据
BOOL WriteFile(
HANDLE  hFile,                  //文件句柄
LPCVOID lpBuffer,               //数据缓存区指针
DWORD   nNumberOfBytesToWrite,  //你要写的字节数
LPDWORD lpNumberOfBytesWritten, //用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped       //OVERLAPPED结构体指针
);
  写数据格式同读数据格式;

* 5 关闭串口连接

BOOL CloseHandle(HANDLE hObject);
关闭创建串口连接返回的句柄;
    if (m_hCom != INVALID_HANDLE_VALUE)
    {
        CloseHandle(m_hCom);
    }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值