串口传输文件,接收端文件为空的问题

hufangzhe 2014-09-19 11:07:56
下面是我写的串口传输文件的代码,使用FileStream将文件读取为byte,然后用串口发送,接收端接收byte,然后用FileStream直接写入文件。
发送端(VC++):

FileStream^ fileStream = nullptr;
try
{
String^ path ="c:\\FINISH.doc";
fileStream = gcnew FileStream(path, FileMode::Open);
array<Byte>^ dataArray = gcnew array<Byte>(fileStream->Length);
for (int i = 0; i < fileStream->Length; i++)
{
dataArray[i] = fileStream->ReadByte();
}
_serialPort119->Write(dataArray, 0, dataArray->Length);
}
finally
{
if (fileStream!=nullptr)
{
fileStream->Close();
}
}


接收端(C#):

int length = serialPort1.BytesToRead;
byte[] rec_byte = new byte[length];
int bytesRead = 0;
bytesRead = serialPort1.Read(rec_byte, 0, length);
MessageBox.Show(System.Text.Encoding.Default.GetString(rec_byte));
if (rec_byte != null)
{
FileStream fs = null;
try
{
string path = @"D:\FINISH.doc";
fs = new FileStream(path, FileMode.Create, FileAccess.Write);
fs.Write(rec_byte, 0, length);
}
finally
{
if (fs != null)
{
fs.Close();
}
}
}


注:执行完之后,接收端生成的文件为空(是一个0字节的doc文件),请帮我看一下问题在哪里。
在接收端加入MessageBox,将接收到的byte转化为string查看了一下,证明接收到数据了。
...全文
356 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hufangzhe 2014-09-19
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
你当串口是什么? 即使你采用tcp协议,也不可能把一个大文件整个一个包发出去,接收端直接收一个文件 如果是tcp,你需要将文件拆成许多个包,接收后再重新拼接 而如果是串口,你也需要先将文件拆成许多个包,然后每个包依次发送字节,接收端收到字节,重新组包,再收下一组 不管用哪种方式,都不要想发送一次,接收一次,就可以.
多谢您指点,实际应用起来您的建议很对。目前我只是测试用byte写入文件的原理,测试的doc文件只有9k(内容只有18个字符),麻烦您看下,为什么我这样不能在接收端成功生成文件?
於黾 2014-09-19
  • 打赏
  • 举报
回复
你还是先从串口聊天软件开始研究吧 从你的代码上看,串口到底是个什么东西你都没研究明白
於黾 2014-09-19
  • 打赏
  • 举报
回复
你当串口是什么? 即使你采用tcp协议,也不可能把一个大文件整个一个包发出去,接收端直接收一个文件 如果是tcp,你需要将文件拆成许多个包,接收后再重新拼接 而如果是串口,你也需要先将文件拆成许多个包,然后每个包依次发送字节,接收端收到字节,重新组包,再收下一组 不管用哪种方式,都不要想发送一次,接收一次,就可以.
effun 2014-09-19
  • 打赏
  • 举报
回复
看不出有什么问题,在fs.Write后面加上一句fs.Flush()试下。
hufangzhe 2014-09-19
  • 打赏
  • 举报
回复
您的建议很受用,我再试试。
於黾 2014-09-19
  • 打赏
  • 举报
回复
或者你给串口接收挂一个回调事件,等串口接到数据后会自动调用你的receive事件 这样不用另开线程阻塞等待 但是也不能保证只接收一次就接收到完整的信息
於黾 2014-09-19
  • 打赏
  • 举报
回复
如果你是tcp,9k确实可以一个包直接传过去 底层已经封装好方法,直接读取就可以把缓冲区中的数据一次性读取出来 但是你是串口,串口是一个字节一个字节发送的,你也要循环接收,直到一定时间内串口缓冲区不再有数据为止

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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