wince 6.0下串口接收数据有误

haxinglong   2009-10-30 11:28 楼主
s3c6410的板子,WINCE6.0下我从串口读取数据时总是发生接收的数据不准确现象,我调试的时候看每次串口缓冲没有满,应该没有溢出,但是根据接收的数据画出来的图形看,数据不准确现象是周期性的。

现在不知道什么原因,如何解决好.

恳请大家帮帮忙!

回复评论 (18)

怎么没人帮忙啊!?
点赞  2009-10-30 11:54
不能用异步通信吧,你读串口线程时间要设置一下
点赞  2009-10-30 13:00
跟异步通信有啥关系
点赞  2009-10-30 13:53
是不是串口设置的不正确
int open_com(int nPort, int nBaud)
{
        if(m_bOpened==TRUE)//如果串口已被打开,则返回
        {
                RETAILMSG(1,(TEXT("the com2 is opened already...")));
                return(TRUE);
        }
        char szPort[15];
        DCB dcb;

//        wsprintf(szPort,"COM%d",nPort);
        CString tempstr;
        tempstr.Format(_T("%d"),nPort);
        CString str_port;
        str_port=_T("COM")+tempstr;
        memcpy(szPort,str_port,str_port.GetLength()*2);
        for(int i=0;i         {
                if(i%2==0)
                        szPort[i/2]=szPort;
        }

//        //打开串口,不支持重叠操作,所以倒数第二个参数要设置成0
//        CreateFile ((LPCTSTR)("com2:"), GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);

//        m_hComDev=CreateFile((LPCTSTR)szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
//                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
        m_hComDev=CreateFile(TEXT("com1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
                0, NULL);

//        const WCHAR *g_szDrvRegPath = L"HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\SER2410_com2";
//        m_hComDev=ActivateDevice(g_szDrvRegPath,0);
        if(m_hComDev==0 || m_hComDev==INVALID_HANDLE_VALUE ){
//                CString str;
//                str.Format(_T("com1 open. lasterror=%d"),GetLastError());
                RETAILMSG(1,(TEXT("open error=%d\r\n"),GetLastError()));
                RETAILMSG(1,(TEXT("the com1 opened fail\r\n")));
                return (FALSE);
        }
        else
        {
//                CString str;
//                str.Format(_T("com1 open. lasterror=%d"),GetLastError());
//                RETAILMSG(1,(TEXT("the com1 opened ")));
        }



        memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
        memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));

        //串口超时参数设置
        COMMTIMEOUTS CommTimeOuts;
        CommTimeOuts.ReadIntervalTimeout = 10;
        CommTimeOuts.ReadTotalTimeoutMultiplier = 10;
        CommTimeOuts.ReadTotalTimeoutConstant = 50;
        CommTimeOuts.WriteTotalTimeoutMultiplier = 1000;
        CommTimeOuts.WriteTotalTimeoutConstant = 0;
        if(!SetCommTimeouts(m_hComDev, &CommTimeOuts))
        {
                MessageBox(NULL,_T("can not setcommtimeout"),TEXT("Error"),MB_OK);
        }

        //hEvent读写事件,因为串口是异步通讯,操作可能被其他进程堵塞,程序可以通过检查该时间
        //来得知是否读写完毕。事件将在读写完成后,自动设置为有效。
//        m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
//        m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

        //配置串行端口
        //得到端口的默认设置信息
        GetCommState (m_hComDev, &dcb);
        //改变DCB结构设置
        dcb.DCBlength = sizeof( DCB );
        GetCommState( m_hComDev, &dcb );
        dcb.BaudRate = nBaud;//设置串口的通讯速度
        dcb.ByteSize = 8;//设置字节位数
        dcb.StopBits = ONESTOPBIT; //每字节一位停止位

        //初始化缓冲区中的信息 清除
        PurgeComm(m_hComDev,PURGE_TXCLEAR|PURGE_RXCLEAR);

        //SetupComm设置串口的读写缓冲区大小
        if( !SetCommState( m_hComDev, &dcb ) ||
        !SetupComm( m_hComDev, 10000, 10000 ) )//||
//                m_OverlappedRead.hEvent == NULL ||
//                m_OverlappedWrite.hEvent == NULL )
        {
//                if( m_OverlappedRead.hEvent != NULL )
//                        CloseHandle( m_OverlappedRead.hEvent );
//                if( m_OverlappedWrite.hEvent != NULL )
//                        CloseHandle( m_OverlappedWrite.hEvent );
                CString str;
                str.Format(_T("SetupComm error. lasterror=%d"),GetLastError());
                MessageBox(NULL,str,TEXT(" Error"),MB_OK);
                CloseHandle( m_hComDev );
                return FALSE;
        }

        //设置端口上指定信号的状态
        // SETDTR: 发送DTR (data-terminal-ready)信号
        // SETRTS: 发送RTS (request-to-send)信号
//        EscapeCommFunction (m_hComDev, SETDTR);
//        EscapeCommFunction (m_hComDev, SETRTS);

        m_bOpened = TRUE;
        return m_bOpened;
}
点赞  2009-10-30 16:36
如果串口的Fifo没有溢出,那么有可能是你定义的存放数据的Buffer溢出了。
点赞  2009-10-31 00:23
可以先不画图形,让6410跟PC机通信,保证你的6410串口是好的,一步步测试
点赞  2009-10-31 08:57
dcb.BaudRate = nBaud;//设置串口的通讯速度

波特率匹配否?
点赞  2009-11-2 13:52
也为通信数据丢问题困扰.
点赞  2009-11-2 15:10
我也在为接收数据丢失问题烦恼.看了上面的代码,自己设置的也没什么问题,就是大批量数据到达时收不全.请高手一起指点一下.
点赞  2009-11-4 23:17
引用: 引用 5 楼 heyme 的回复:
如果串口的Fifo没有溢出,那么有可能是你定义的存放数据的Buffer溢出了。

我觉得这个应该是重点
点赞  2009-11-5 08:37
引用: 引用 3 楼 programmerno1 的回复:
跟异步通信有啥关系
请问CE6.0里串口能用异步通信了吗?
点赞  2009-11-5 10:52
读串口那边SLEEP一下,跟SLEEP时间长度有关系
点赞  2009-11-5 10:56
引用: 引用 11 楼 zhangwenlang 的回复:
引用 3 楼 programmerno1 的回复:
跟异步通信有啥关系
请问CE6.0里串口能用异步通信了吗?

仅供参考。。
点赞  2009-11-5 11:08
非常感谢各位的帮忙!
波特率是对的。我采用的就是异步接收的方式。是我的接受缓冲中的数据溢出了!
点赞  2009-11-6 08:46
lz你是怎么解决的,我也遇上了这个拦路虎,
点赞  2009-12-9 11:21
还有能不能给我把InterruptDone函数的源文件发一份,我的email; xixi319322@yahoo.com.cn
非常感谢
点赞  2009-12-9 11:23
给你回复了!
点赞  2009-12-10 08:50
多谢了,受到
点赞  2009-12-18 11:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复