首页 > 电脑专区 > 电脑教程 >

VC如何使用串口传文件

来源:互联网 2023-02-21 18:15:06 449

如题介绍一下,VC下如何使用串口传文件kd9办公区 - 实用经验教程分享!

工具/原料

  • vs2010
  • 电脑
  • 串口设备

方法/步骤

  • 1

    1、打开串口设备,使用CreateFile来打开串口设备进行操作,视例代码如下kd9办公区 - 实用经验教程分享!

    kd9办公区 - 实用经验教程分享!

    HANDLE m_hComm = CreateFile("COM1",kd9办公区 - 实用经验教程分享!

    GENERIC_READ | GENERIC_WRITE,// read/write typeskd9办公区 - 实用经验教程分享!

    0,// comm devices must be opened with exclusive accesskd9办公区 - 实用经验教程分享!

    NULL,// no security attributeskd9办公区 - 实用经验教程分享!

    OPEN_EXISTING,// comm devices must use OPEN_EXISTINGkd9办公区 - 实用经验教程分享!

    FILE_FLAG_OVERLAPPED,// Async I/Okd9办公区 - 实用经验教程分享!

    0); // template must be 0 for comm deviceskd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

  • 2

    2、初始化打口串口的参数和配置,代码如下,如果不明白函数的使用方法,可以查看msdnkd9办公区 - 实用经验教程分享!

    // set the timeout valueskd9办公区 - 实用经验教程分享!

    m_CommTimeouts.ReadIntervalTimeout= 1000;kd9办公区 - 实用经验教程分享!

    m_CommTimeouts.ReadTotalTimeoutMultiplier= 1000;kd9办公区 - 实用经验教程分享!

    m_CommTimeouts.ReadTotalTimeoutConstant= 1000;kd9办公区 - 实用经验教程分享!

    m_CommTimeouts.WriteTotalTimeoutMultiplier= 1000;kd9办公区 - 实用经验教程分享!

    m_CommTimeouts.WriteTotalTimeoutConstant= 1000;kd9办公区 - 实用经验教程分享!

    kd9办公区 - 实用经验教程分享!

    // configurekd9办公区 - 实用经验教程分享!

    if (FALSE == SetCommTimeouts(m_hComm, &m_CommTimeouts))kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ProcessErrorMessage(_T("SetCommTimeouts()"));kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    if (FALSE == SetCommMask(m_hComm, dwCommEvents))kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ProcessErrorMessage(_T("SetCommMask()"));kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    if (FALSE == GetCommState(m_hComm, &m_dcb))kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ProcessErrorMessage(_T("GetCommState()"));kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    m_dcb.fRtsControl = RTS_CONTROL_ENABLE;// set RTS bit high!kd9办公区 - 实用经验教程分享!

    if (FALSE == BuildCommDCB(szBaud, &m_dcb))kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ProcessErrorMessage(_T("BuildCommDCB()"));kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    if (FALSE == SetCommState(m_hComm, &m_dcb))kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ProcessErrorMessage(_T("SetCommState()"));kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    kd9办公区 - 实用经验教程分享!

    // flush the portkd9办公区 - 实用经验教程分享!

    if(FALSE == PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT))kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ProcessErrorMessage(_T("PurgeComm()"));kd9办公区 - 实用经验教程分享!

    //break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

  • 3

    3、因为串口通迅要独立于界面操作,需要单独创建线程,监测串口的读写等事件,进行数据的收发操作,要多查阅文档熟悉这些事件操作kd9办公区 - 实用经验教程分享!

    bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);kd9办公区 - 实用经验教程分享!

    if (!bResult) kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    switch (dwError = GetLastError())kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    case ERROR_IO_PING:kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    case 87:kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    default:kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    port->ProcessErrorMessage(_T("WaitCommEvent()"));kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    elsekd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    kd9办公区 - 实用经验教程分享!

    bResult = ClearCommError(port->m_hComm, &dwError, &comstat);kd9办公区 - 实用经验教程分享!

    if (comstat.cbInQue == 0)kd9办公区 - 实用经验教程分享!

    continue;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);kd9办公区 - 实用经验教程分享!

    switch (Event)kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    case 0:kd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    AfxEndThread(100);kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    case 1:// read eventkd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    ReceiveChar(port, &comstat);kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    } kd9办公区 - 实用经验教程分享!

    case 2: // write eventkd9办公区 - 实用经验教程分享!

    {kd9办公区 - 实用经验教程分享!

    kd9办公区 - 实用经验教程分享!

    WriteChar(port);kd9办公区 - 实用经验教程分享!

    break;kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    }kd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

  • 4

    4、实现往串口发送的函数PurgeComm 和WriteFilekd9办公区 - 实用经验教程分享!

    PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);清除发送缓冲区kd9办公区 - 实用经验教程分享!

    WriteFile往串口发送数据kd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

  • 5

    5、因为串口发送比较缓慢,数据发送的缓存区需要加锁保护,不然数据会错误,导致文件不能正常打开,需要熟悉锁和事件的使用函数,kd9办公区 - 实用经验教程分享!

    EnterCriticalSectionLeaveCriticalSectionSetEvent等函数的使用方法kd9办公区 - 实用经验教程分享!

    注:要等待发送缓冲区的数据发送完全,才能继续发送kd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

  • 5该信息未经授权抓取自百度经验
  • 6

    6、因为串口通迅数据并不可靠,最好还要加上收发确认功能,或者由接收方主动请求比较好,涉及到串口读操作的函数ReadFilekd9办公区 - 实用经验教程分享!

    VC如何使用串口传文件kd9办公区 - 实用经验教程分享!

  • 7

    7、由于文章篇幅限制,只提供解决的思路流程和用到的函数,自行查阅函数的使用方法,函数文档非常详细kd9办公区 - 实用经验教程分享!

  • 注意事项

    • 仅供学习参考,感谢阅读本经验

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!kd9办公区 - 实用经验教程分享!


    标签: 操作系统使用文件口传

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码