首页 > 电脑专区 > windows >

VC如何使用串口传文件

来源:互联网 2023-02-20 17:15:04 99

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

工具/原料

  • vs2010
  • 电脑
  • 串口设备

方法/步骤

  • 1

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

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

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

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

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

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

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

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

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

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

  • 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 4

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

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

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

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

  • 5

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

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

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

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

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

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

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

  • 7

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

  • 注意事项

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

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


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

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