5556|14

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于wince下图像传输的问题 [复制链接]

我使用的是eboxII,CE5.0,evc4.0+SP2
已经通过DeviceIOControl从摄像头上获得了当前拍摄的一帧图像(存储在一个unsigned char*类型的缓冲区中),并且在从YUV转换为RGB后本地显示正常。接下来我试图使用CSocket,通过有连接的套接字将这帧图像传输到用网线连接的一台笔记本上。
现在,字符串的传输我经过调试已经完全正常。可是当我进行图像数据的发送,接收和显示时出了问题,笔记本端既不现实任何图像,跟踪调试程序也不能观察到我需要看到的变量值,比如一些起计数器作用的整型变量都不显示。而且有时运行程序时还会死机。
因此,请教大家,对于缓冲区中的图像数据,应该如何进行传输和接收?在接收后又应如何进行图像的显示。注:使用的是evc下的mfc应用程序。
请大家不吝解答,如方便请给出相应的代码,在这儿先谢过了
我编写的ebox端的发送和本地显示的代码如下:
         PBYTE data = pBmpData;//获得的图像数据在这个缓冲区中,大小为2304字节,本地显示正常
        unsigned char* send = (unsigned char*)malloc(2304);//我试图每次发送2304字节,不知这样能实现否
        PBYTE shit = send;
        long int num=0;
        int i=0;
        CString inf;
        while(num<230400)
        {
                memmove(shit,data,2304);
                data+=2304;
                num+=2304;                           //发送,不知是否能够实现,问题应该就出在这块
                m_socketSend.Send(send,2304,0);      //但我没想出还可以怎样实现,请教大家
        }
       
        inf.Format(L"%ld Bytes sent!",num);
        AfxMessageBox(inf);

        //显示出来
        CBitmap bitmap;
       
        bitmap.CreateBitmap(320,240,1,24,pBmpData);//创建位图

        CWnd* pWnd=GetDlgItem(IDC_REMOTEVIDEO);//这个控件为picture control
        pWnd->UpdateWindow();
       
        CDC* pDC=pWnd->GetDC();//获得当前控件的设备上下文
        CDC bitmapDC;
       
        bitmapDC.CreateCompatibleDC(pDC);//创建与设备适配的设备上下文
        CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);//加载位图
        pDC->BitBlt(0,0,320,240,&bitmapDC,0,0,SRCCOPY);//拷贝到当前的设备上下文中
        bitmapDC.SelectObject(pOldBitmap);
        bitmapDC.DeleteDC();
        bitmap.DeleteObject();//使用后释放资源
此帖出自WindowsCE论坛

最新回复

如果我要传输的数据过大 那只能分成若干个包发送吧?那如何来保证传输过程中的数据包接收与发送时顺序的一致呢?唉 困扰  详情 回复 发表于 2007-12-31 14:08
点赞 关注
 

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
上面那个缓冲区的大小是230400字节,不好意思打错了呵呵
请教大家!
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
数据传输没有协议也可以?  根据协议来做吧。


while(num <230400)
{
memmove(shit,data,2304);
data+=2304;
num+=2304;                                   
m_socketSend.Send(send,2304,0);      //也不知道是不是发送成功了,就接着发送了。也不知道你的Socket程序是否有问题。  
}

此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
根据什么协议,请问能不能再说的详细一点?我对套接字没怎么使用过,不是很熟悉。而字符串的传输是可以实现的啊:
发送端:
CSocket socketListen;
socketListen.Create(5800,SOCK_STREAM,NULL);
socketListen.Bind(5800,_T("169.254.200.120"));
socketListen.Listen(5);
socketListen.Accept(m_socketSend);
socketListen.Close();

按下某按键后:
char szSend[20]="hello world";
m_socketSend.Send(szSend,20,0);

接收端:
m_socketReceive.Create();
int re = m_socketReceive.Connect(_T("169.254.200.120"),5800);
if(re == 0)
{
        AfxMessageBox(L"无法连接!");
}
else
{
        AfxMessageBox(L"连接成功!");       
}

按下某按键后:
char szRecv[20];
m_socketReceive.Receive(szRecv,20,0);
m_recv=szRecv;
UpdateData(FALSE);

经过调试是可以的啊...
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
socket一次发送有长度限制吧。

你可以改改下面的代码,send的返回值是实际发送的字符数量,根据这个来判断是否全部发送了。

int Send(char *buff, int len)
{
        if(!m_socket || !m_bLogin)
        {
                return FALSE;
        }
        int iSendedLen = 0;

        EnterCriticalSection(&m_SendCs);
        while(iSendedLen < len)
        {
                int ret = send(m_socket, &buff[iSendedLen], len-iSendedLen, 0);
                if( (ret == 0)||(ret== SOCKET_ERROR))
                {
                        LeaveCriticalSection(&m_SendCs);
                        return FALSE;
                }
                iSendedLen += ret;
        }
        LeaveCriticalSection(&m_SendCs);
        return TRUE;
}
此帖出自WindowsCE论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
实在感谢,我看看
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
简单的数据传输这样没问题的,我现在的疑问是,你的图片拆开,然后送过去,应该在接受端开个缓存的吧,你说你的笔记本会死机,很有可能是数据没有接受完全,然后运行会造成溢出,没看到你的接受端代码,只能猜测,,,
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
弹出的消息框中的数字正确,能说明数据的确发送和接收到了吗?如果能,那现在应该发送和接收都没有错误了。
发送端:
PBYTE data = pBmpData;
        char send[2304];
        long int num=0;
        int i=0;
        int count=0;
        int n=0;
        CString inf;
        while(num<230400)
        {
                send=data[num];
                i++;
                num++;
                if(i==2304)
                {
                        count=m_socketSend.Send(send,2304,0);
                        i=0;
                        n++;
                        //inf.Format(L"%d bytes sent!",count);
                        //AfxMessageBox(inf);
                }
        }
       
        inf.Format(L"%d rounds!",n); //100次
        AfxMessageBox(inf);
        inf.Format(L"%ld bytes sent altogether!",num); //230400字节
        AfxMessageBox(inf);

接收端:
unsigned char* data = (unsigned char*)malloc(230400);
        char receive [2304];
       
        long int num=0;
        int i=0;
        int count=0;
        int n=0;
        CString inf;

        while(num<230400)
        {
                count=m_socketReceive.Receive(receive,2304,0);
                n++;
                //inf.Format(L"%d bytes received!",count);
                //AfxMessageBox(inf);
                while(i<2304)
                {
                        data[num]=receive;
                        num++;
                        i++;       
                }
                i=0;
        }

        inf.Format(L"%d rounds!",n);//100次
        AfxMessageBox(inf);
        inf.Format(L"%ld bytes received altogether!",num);//230400字节
        AfxMessageBox(inf);
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
但是picture control控件未显示任何内容:

         CBitmap bitmap;
       
        bitmap.CreateBitmap(320,240,1,24,data);

        CWnd* pWnd=GetDlgItem(IDC_REMOTEVIDEO);
        pWnd->UpdateWindow();
        UpdateData(FALSE);
       
        CDC* pDC=pWnd->GetDC();
        CDC bitmapDC;
       
        bitmapDC.CreateCompatibleDC(pDC);
        CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
        pDC->BitBlt(0,0,320,240,&bitmapDC,0,0,SRCCOPY);
        bitmapDC.SelectObject(pOldBitmap);
        bitmapDC.DeleteDC();
        bitmap.DeleteObject();
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
我不明白的就是,如果发送和接收都没有问题,那么显示时和本地的显示会有什么不同之处啊,如果数据相同那为何无法显示...

此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
你的发送和接收代码中的图片在内存中数据可以拷贝出来,放在ultredit或其它可以看16进制的编辑器中,
比对一下是否接收完整。
此帖出自WindowsCE论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

12
 
接收端和发送端的接收缓冲区和发送缓冲区都是多大,不会比2304小吧。
是否有丢失数据的可能。
此帖出自WindowsCE论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

13
 
你每次接受完和传送完数据,把字符串用memset清空下试试看
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
应该不是数据传输的问题 是ddb设备依赖性的问题唉
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

15
 
如果我要传输的数据过大 那只能分成若干个包发送吧?那如何来保证传输过程中的数据包接收与发送时顺序的一致呢?唉 困扰
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表