分类: C/C++
2008-03-13 17:08:10
该类还有两个辅助的结构体 WIN_ARG 和 tagPackage。WIN_ARG 是窗体描述结构体,该结构体包含了窗体指针、自定义消息和位置ID。
typedef struct WIN_ARG { UINT winId; CWnd* pWin; DWORD msg; }WINARG, *pWINARG;tagPackage 是数据包描述结构体,该结构体包含了数据长度、数据类别和数据值。CSuperSerialPort利用这个结构体来分解大块数据然后发送。
typedef struct tagPackage { enum emMaxSize { emMAX_SIZE = 1024 }; UINT iLen; UINT iType; BYTE pData[emMAX_SIZE]; }PACKAGE, * pPACKAGE;在串口程序的开发过程中,最麻烦的问题就是需要事先确定缓存区的大小。如果传输时按协议传输这个一般没什么问题,但是如果按一个字节一个字节的进行传输,那么在收数据的时候就很麻烦。解决这一问题时我利用了串口中cbInQue这一属性,同时为了提高程序的性能启用了一个接收线程,并将收下来的数据都发往指定的窗体对象然后再进行处理。如:
pPACKAGE pPack = new PACKAGE; DWORD rdLen = pCom->m_comState.cbInQue; pPack->iLen = rdLen;为了协同串口的收发,在初始化串口的时候要启用FILE_FLAG_OVERLAPPED这一属性,如
CreateFile(m_com.com, GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);当然在接收的线程中还加入了互斥对象和临界区用于控制线程和数据统计。如果你直接使用CSuperSerialPort类,程序已经替你完成了这些任务。如:
m_pSSP->Open(m_comName, m_uComRate, m_uComParity, m_uComDataBits, m_fComStopBits); m_pSSP->StartReceive(m_pSSP)详细情况可以参照TestSerialPort2Dlg.cpp中的代码。
如果还有问题可以发邮件给我i_mlibin@163.com。由于水平有限有错误的地方欢迎指正,最后祝大家工作、学习顺利。