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

VC如何使用串口传文件

来源:互联网 2023-02-21 18:15:06 版权归原作者所有,如有侵权,请联系我们

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

工具/原料

  • vs2010
  • 电脑
  • 串口设备

方法/步骤

  • 1

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

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

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

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

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

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

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

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

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

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

  • 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 4

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

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

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

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

  • 5

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

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

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

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

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

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

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

  • 7

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

  • 注意事项

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

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


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

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