如何发送bin文件

zhaoghldj 2007-12-04 05:16:11
想把2M多大的bin文件,通过串口发送出去,
通过open文件后,如何读出文件内容(一次要读多大),然后放到缓冲区buffer[],
通过WriteFile(handlePort_, // 文件句柄
buffer, // 数据缓冲区指针
sizeBuffer, // 字节数
&length,NULL)
buffer这些变量要用什么类型,
请高手们指点,谢谢

...全文
1165 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoghldj 2008-01-02
  • 打赏
  • 举报
回复
请各位多指点下,
zhaoghldj 2007-12-12
  • 打赏
  • 举报
回复
WriteFile()中同步,异步处理都会出现以上问题
zhaoghldj 2007-12-12
  • 打赏
  • 举报
回复
在发送按钮的处理函数中(此函数在主线程中)

若按以下那样处理
pf= fopen();
nReadByte = fread(buffer,1,1024,pf);
//如果读出1024字节,则表示文件未完
while ( 1024 == nReadByte ){
WriteFile()
//AfxMessageBox((char*)buffer);
nReadByte = fread(buffer,1,1024,pf);
}
if( 1024 < nReadByte )
WriteFile()
//还要处理一次
fclose();
若文件小,10K左右,那基本上没有问题。
但若文件大的话,就会死机,程序没有反映。
请问各位高手:
是否要开个线程来专门来处理发送?
或则有什么方法可以避免。
谢谢
zhaoghldj 2007-12-06
  • 打赏
  • 举报
回复
在OPEN串口的处理函数中,启动一个线程,线程的RUN函数中调用
ReadFile(handlePort_, inputData, sizeBuffer, &length, NULL) 从串口中读数据,
int
SerialThread::Run()
{
// Check signal controlling and status to open serial communication.
while(1)
{
ReadFile()
}
}
收到一堆乱吗?只收到一部分。请问这什么原因?

ReadFile()一般怎么来调用,即怎么触发接收数据。
谢谢

jsphuang 2007-12-05
  • 打赏
  • 举报
回复
呵呵!方法当然很多了,这种方式比一次全读入buffer,
然后分多次发送,个人感觉容易处理。
zhaoghldj 2007-12-05
  • 打赏
  • 举报
回复
谢谢楼上各位的解答,
这样发送大数据的文件是否要考虑用新线程来发送(也就是在新线程中RUN函数中来发送,接收),若需要,应该如何编写?
接收方是ARM芯片的设备, 数据校验如何进行?
jsphuang:
你好!
多次发送是不是一定要那样处理
nReadByte = fread(buffer,1,1024,pf);
//如果读出1024字节,则表示文件未完
while ( 1024 == nReadByte ){
WriteFile()
//AfxMessageBox((char*)buffer);
nReadByte = fread(buffer,1,1024,pf);
}
if( 1024 < nReadByte )
WriteFile()
//还要处理一次
mr.zhoux 2007-12-05
  • 打赏
  • 举报
回复
串口本身就是个慢速设备,使用多线程不能提高什么性能的吧...
zaodt 2007-12-04
  • 打赏
  • 举报
回复

凡是通讯的东西都要考虑两方或多方。

不知道接收方是什么情况,不好说缓冲区设置多大。

就发送方而言,你把这个操作看成两大部分:

1、读文件、取数据,为发送准备数据;

2、写串行口,发送数据;

也就是说,你首先要会读文件,并且会写串行口,只有这两点都熟悉后,才能把它们结合起来做这个程序。

另外,楼主应该说说接收方是什么情况,也是计算机吗?还是设备?

其实还有一个更重要的,这就是数据校验了。

因为串行口发送数据有可能会出错,你又是发送2MB的大数据,所以校验也是很重要的。

所以,要结合发送和接收方的情况,还有如何校验接收到的数据,来考虑一次发送多少数据。

补充一下,你网上搜搜看,串行口发送文件是有现成协议的。
jsphuang 2007-12-04
  • 打赏
  • 举报
回复
	byte buffer[1025];  
int nReadByte;
//"b" flag表示二进制读
FILE *pf=fopen("file.txt","rb");
if ( NULL == pf){
return ;
}
nReadByte = fread(buffer,1,1024,pf);
//如果读出1024字节,则表示文件未完
while ( 1024 == nReadByte ){
//WriteFile()
//AfxMessageBox((char*)buffer);
nReadByte = fread(buffer,1,1024,pf);
}
// WriteFile()
//还要处理一次
AfxMessageBox((char*)buffer);
jsphuang 2007-12-04
  • 打赏
  • 举报
回复
byte buffer[1024];
int nReadByte;
FILE *pf=fopen("file.txt","rb");
if ( NULL == pf){
return ;
}
nReadByte = fread(buffer,1,1024,pf);
//如果没有读完,则继续读
while ( 1024 == nReadByte ){
/* WriteFile(handlePort_,
buffer,
sizeBuffer,
*/
AfxMessageBox((char*)buffer);
nReadByte = fread(buffer,1,1024,pf);
}
/* WriteFile(handlePort_, // •¶Œ‹å•¿
buffer, // ”˜?™t‹æŽw?
sizeBuffer, // Žš?”
&length,NULL)
*/
//最后读的一次,还要处理
AfxMessageBox((char*)buffer);
awperpvip 2007-12-04
  • 打赏
  • 举报
回复
BYTE*
BBirdlyh 2007-12-04
  • 打赏
  • 举报
回复
WriteFile 本身就是WRITE 二进制文件,你的BIN文件里面别管是什么,只要用OPENFILE打开,以二进制形式读到内存,就可以用WRITEFILE向串口发
mr.zhoux 2007-12-04
  • 打赏
  • 举报
回复
和文本一样,一次读一点 char buffer[size] 或者 BYTE buffer[size] 一样的吧...

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧