class-Cserialport类编写的串口助手,如何实现接受两个字节的数据,这是Cserialport类中的接受数据处理函数

问题描述

Cserialport类编写的串口助手,如何实现接受两个字节的数据,这是Cserialport类中的接受数据处理函数

void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
{
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
unsigned char RXBuff;

for (;;)
{
    // Gain ownership of the comm port critical section.
    // This process guarantees no other part of this program
    // is using the port object. 

    EnterCriticalSection(&port->m_csCommunicationSync);

    // ClearCommError() will update the COMSTAT structure and
    // clear any other errors.

    bResult = ClearCommError(port->m_hComm, &dwError, &comstat);

    LeaveCriticalSection(&port->m_csCommunicationSync);

    // start forever loop.  I use this type of loop because I
    // do not know at runtime how many loops this will have to
    // run. My solution is to start a forever loop and to
    // break out of it when I have processed all of the
    // data available.  Be careful with this approach and
    // be sure your loop will exit.
    // My reasons for this are not as clear in this sample
    // as it is in my production code, but I have found this
    // solutiion to be the most efficient way to do this.

    if (comstat.cbInQue == 0)
    {
        // break out when all bytes have been read
        break;
    }

    EnterCriticalSection(&port->m_csCommunicationSync);

    if (bRead)
    {
        bResult = ReadFile(port->m_hComm,       // Handle to COMM port
                           &RXBuff,             // RX Buffer Pointer
                           1,                   // Read one byte
                           &BytesRead,          // Stores number of bytes read
                           &port->m_ov);        // pointer to the m_ov structure
        // deal with the error code
        if (!bResult)
        {
            switch (dwError = GetLastError())
            {
                case ERROR_IO_PENDING:
                    {
                        // asynchronous i/o is still in progress
                        // Proceed on to GetOverlappedResults();
                        bRead = FALSE;
                        break;
                    }
                default:
                    {
                        // Another error has occured.  Process this error.
                        port->ProcessErrorMessage("ReadFile()");
                        break;
                    }
            }
        }
        else
        {
            // ReadFile() returned complete. It is not necessary to call GetOverlappedResults()
            bRead = TRUE;
        }
    }  // close if (bRead)

    if (!bRead)
    {
        bRead = TRUE;
        bResult = GetOverlappedResult(port->m_hComm,    // Handle to COMM port
                                      &port->m_ov,      // Overlapped structure
                                      &BytesRead,       // Stores number of bytes read
                                      TRUE);            // Wait flag

        // deal with the error code
        if (!bResult)
        {
            port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");
        }
    }  // close if (!bRead)

    LeaveCriticalSection(&port->m_csCommunicationSync);

    // notify parent that a byte was received
    ::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);
} // end forever loop

}

解决方案

贴出你的代码看看。

你现在是自己给自己发消息?用spy++看看收到的消息是什么。

时间: 2024-11-01 15:40:42

class-Cserialport类编写的串口助手,如何实现接受两个字节的数据,这是Cserialport类中的接受数据处理函数的相关文章

class-用serialport类写的串口助手在接受到4K左右的数据时会发生丢包现象,怎么解决

问题描述 用serialport类写的串口助手在接受到4K左右的数据时会发生丢包现象,怎么解决 用serialport类写的串口助手在接受到4K左右的数据时会发生丢包现象,接收数据发生丢包现象的原因是什么,怎么解决呢 解决方案 整包都丢了?还是只丢了一部分? 解决方案二: 丢了一部分,接收聂小孟的传输数据没问题,可是接受蓝牙数据就会出错,而聂小孟的接受蓝牙数据又不会出错,我也是醉了,你知道怎么办嘛 解决方案三: 不确定你的问题,显然你给的信息太少. 但你就算全给出来我也不会,毕竟我没用过seri

数据-自己写的串口助手程序,在不同电脑运行,有的不丢包,有的丢包的,这么一个神奇的问题,你们有遇到过吗

问题描述 自己写的串口助手程序,在不同电脑运行,有的不丢包,有的丢包的,这么一个神奇的问题,你们有遇到过吗 串口助手程序,在我的电脑上正常运行,不丢包,可是在其他同事的电脑上就会丢包,数据出错,急急急,求解答 解决方案 我也遇到过不知怎么回事

怎么样写一个事件来完成同时对两个表的数据的更改呢!

问题描述 我是VB新手,各位怎么样写一个事件来完成同时对两个表的数据的更改呢! 解决方案 解决方案二:不晓得你是什么意思,计算机中没有同时的概念解决方案三:如果不会问问题,那么就描述你的具体问题,甚至是项目要求.解决方案四:应该是指两个表的数据需要同步更新吧.你可以通过对事务的管理,在一个事件做分别对两个表进行更新就可以了(分两条SQL更新语句):或是做个存储过程,调用存储过程:或是在其中一个表中做个触发器也行.解决方案五:OnErrorResumeNextErr.Clear()Conn.Beg

mfc-MFC用serialport写的串口通信助手,接收的是一个字节?

问题描述 MFC用serialport写的串口通信助手,接收的是一个字节? 接收数据的处理函数OnCommunication(WPARAM ch,LPARAM port),WPARAM ch接受的是一个字节吗,如果是,怎么能变成两个字节呢,拜托大神解答下,求代码,急急急 解决方案 不是,是缓冲区中所有的数据. 解决方案二: ch指向这个数据的首地址.http://wenku.baidu.com/link?url=P94cAhiJrnGH1ShHNnSAiGFU7MqUuQWHvuFP6WRxhN

指针-vc基于对话框的串口助手绘制波形图闪烁问题

问题描述 vc基于对话框的串口助手绘制波形图闪烁问题 在ontimer函数中进行了这样的双缓冲处理为什么settimer(1,50,NULL),还闪烁特别厉害呢,需要怎么修改 //双缓冲技术 CWnd *pWnd; CRect rc; CDC *m_pDC; CDC memDC; pWnd=GetDlgItem(IDC_STATIC_GWAVE); //把控件地址赋给窗口类指针 //定义一个控件尺寸结构体 pWnd->GetClientRect(&rc); //获取空间指针赋值给rc CRe

串口调试助手-C#串口助手接收数据的问题

问题描述 C#串口助手接收数据的问题 在通过串口给单片机发送读SARM时,返回接收的数据都是"??????"这样转换成十六进制后显示的数据也不正确,其他指令都能调的通,只有这种读SRAM的指令显示错误,是还要对数据进行一些特殊处理么?求指导

c#-C#串口通信问题,串口助手调试和真机测试不一样

问题描述 C#串口通信问题,串口助手调试和真机测试不一样 我用的两台电脑装串口助手来测试发送信息,发送的是16进制信息.通过串口调试助手测试发送的信息是没有问题的.然后链接机器发送信息,机器没反映,用串口助手发送信息机器能正常运行,大神能指出哪里可能出问题? 解决方案 C# 串口通信调试助手1编程练习:串口通信调试助手 解决方案二: 串口助手发送能正常,那就建议看看你的串口初始化吧.

对象-用C++组合类编写汽车模拟程序

问题描述 用C++组合类编写汽车模拟程序 从发动机.变速器和悬挂等三个方面出发模拟汽车.发动机包含发动机排量属性,变速器主要有变速器的类型(自动和手动)与及几档变速器两个属性,悬挂主要是独立悬挂和非独立悬挂两种类型: 发动机.变速器除了初始化和做清理工作的函数外 ,还有两个行为运行和停止. 运用组合写出汽车类,并在main()中申明对象调用. 解决方案 class 悬挂 { public: char 悬挂类型[20]; } class 变速器 { public: 类型 type; int 档;

串口助手发送中文乱码的问题

问题描述 串口助手发送中文乱码的问题 当发送连续字符的时候,显示乱码,i 当每四个字空一格时,显示正常, 当每四个字加字符时,也显示正常,谁知道这是什么原因? 解决方案 乱码基本就是编码不统一,或者你解析时,字节错位 解决方案二: 建议你直接看十六进程下的数据,这可能只是显示的问题. 解决方案三: 当发送连续字符,接收缓冲区空间不够了吧.然后解析出错 解决方案四: 你加空格解析为单双字节混合,不加空格时无法解析UTF-8