windows中C语言关闭串口,如何用程序关闭一个已经打开的串口

已结贴√

问题点数:20 回复次数:4

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

如何用程序关闭一个已经打开的串口

调用 C++ 的API 封装了一个串口函数 只能正常打开串口关闭串口

想请教下如果串口已经被打开,我如何在程序里判断,并把他关闭 ,然后在打开

#include "stdafx.h"

#include "Uart.h"

#include

#include

HANDLE UART_Open(int nPort, int nBuadRate)

{

char nt_port[10]={0};

sprintf(nt_port,"COM%d",nPort);

hCom = CreateFile(nt_port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

//int ret = 0;

if(hCom==(HANDLE)-1)

{

AfxMessageBox("打开COM失败!!");

//TRACE("OPEN_PORT_FAIL\n");

//  return OPEN_PORT_FAIL;

}

if(hCom == INVALID_HANDLE_VALUE)

{

AfxMessageBox("打开COM失败!!");

//TRACE("OPEN_PORT_FAIL\n");

// return OPEN_PORT_FAIL;

}

DCB dcb;

if(!GetCommState(hCom,&dcb))    //获取COM口的设备控制块

{

CloseHandle(hCom);

AfxMessageBox("获取串口参数失败!!");

//    TRACE("GET_COM_STATA_FAIL\n");

//  return GET_COM_STATA_FAIL;

}

dcb.BaudRate=nBuadRate;

dcb.ByteSize=8;

dcb.Parity=NOPARITY;

dcb.StopBits=ONESTOPBIT;

if(!SetCommState(hCom,&dcb))      //设置COM口的设备控制块

{

CloseHandle(hCom);

AfxMessageBox("设置串口参数失败!!");

//    TRACE("SET_COM_STATA_FAIL\n");

//  return SET_COM_STATA_FAIL;

}

SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;

//设定读超时

TimeOuts.ReadIntervalTimeout=1000;

TimeOuts.ReadTotalTimeoutMultiplier=300;

TimeOuts.ReadTotalTimeoutConstant=2000;

//设定写超时

TimeOuts.WriteTotalTimeoutMultiplier=300;

TimeOuts.WriteTotalTimeoutConstant=2000;

if(!SetCommTimeouts(hCom,&TimeOuts)) //将超时参数写入设备控制

{

CloseHandle(hCom);

AfxMessageBox("设置串口超时失败!!");

//  TRACE("SET_COM_TIMEOUT_FAIL\n");

//   return SET_COM_TIMEOUT_FAIL;

}

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区

return hCom;

}

int  UART_Read(HANDLE hCom, char *buf, int buf_len)

{

int  ret = 0;

DWORD len;

ret = ReadFile(hCom,buf,buf_len,&len,NULL);

if(!ret)

{

//TRACE("RECV_DATA_FAIL\n");

AfxMessageBox("读取数据失败!!");

return RECV_DATA_FAIL;

}

if(len == 0)

{

//    TRACE("RECV_DATA_TIMEOUT\n");

AfxMessageBox("读取数据超时!!");

return RECV_DATA_TIMEOUT;

}

return  0;

}

int UART_Write(HANDLE hCom, char *buf, int buf_len)

{

int  ret = 0;

DWORD len;

//    ClearCommError(hCom,&dErrorflag,&comstat);

ret = WriteFile(hCom,buf,buf_len,&len,NULL);

if(!ret)

{

//TRACE("SEND_DATA_FAIL\n");

AfxMessageBox("写入数据失败!!");

return SEND_DATA_FAIL;

}

if(len==0)

{

//TRACE("SEND_DATA_TIMEOUT\n");

AfxMessageBox("写入数据超时!!");

return SEND_DATA_TIMEOUT;

}

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

return 0;

}

int UART_Close(HANDLE hCom)

{

int ret=0;

ret=CloseHandle(hCom);

if(!ret)

{

// TRACE("CLOSE_PORT_FAIL\n");

AfxMessageBox("关闭串口失败!!");

return CLOSE_PORT_FAIL ;

}

return 0;

}

搜索更多相关主题的帖子:

如何 include

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值