| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6847 人关注过本帖
标题:如何用程序关闭一个已经打开的串口
只看楼主 加入收藏
jdvschor
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-11-3
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:4 
如何用程序关闭一个已经打开的串口
调用 C++ 的API 封装了一个串口函数 只能正常打开串口关闭串口
想请教下如果串口已经被打开,我如何在程序里判断,并把他关闭 ,然后在打开


#include "stdafx.h"
#include "Uart.h"
#include <windows.h>
#include <stdio.h>

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 
2011-11-09 12:11
jdvschor
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-11-3
收藏
得分:0 
顶上去 求高手解答
2011-11-09 14:34
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:20 
初始化一个全局的HANDLE(为该串口的句柄) 初始值为零
打开前 判断HANDLE是否为零 为零打开 反之调用closehandle关闭 再打开
2011-11-09 15:01
jdvschor
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-11-3
收藏
得分:0 
没用啊 句柄是要通过 CreateFile 函数得到的 而且 我调试过 不正常的时候句柄值是0xffffffff  正常的时候句柄也不为0啊   按楼上说的 为0时打开 岂不是永远打不开
2011-11-09 15:37
jdvschor
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-11-3
收藏
得分:0 
   if(hCom==(HANDLE)-1)
    {
        if(CloseHandle(hCom))
        {   
            printf("success!!!\n");
        }
    }

    if(hCom == INVALID_HANDLE_VALUE)
    {
         if(CloseHandle(hCom))
        {   
            printf("success!!!\n");
        }

    }

串口占用后 ,程序可以进到INVALID_HANDLE_VALUE和(HANDLE)-1  不过(CloseHandle(hCom))执行不了
2011-11-09 15:49
快速回复:如何用程序关闭一个已经打开的串口
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016525 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved