首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

Wince 串口通讯 发送文件和接发文件的有关问题

2012-03-18 
Wince 串口通讯 发送文件和接发文件的问题我是用C#开发的,平台是WINCE6.0, 工具是VS2008发数据都没有问题,

Wince 串口通讯 发送文件和接发文件的问题
我是用C#开发的,平台是WINCE6.0, 工具是VS2008

发数据都没有问题,问题出在文件上。

发文件也没有问题,具体实现就是把文件做为文件流,写到串口去。

问题出在接收文件上面
我是用这个函数来读串口缓冲区的数据
string a4 = Form1.comm.ReadExisting();
每次只能读2407个字符,其余的都没有。而我发的文件大约有2万个字符。

首先我在串口触发事件中读
  //添加事件注册
  //comm.DataReceived += new SerialDataReceivedEventHandler(comm_DataReceived);

 void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
  string msg = "";
  for (int i = 0; i < 40;i++ )
  {
  string msg1 = comm.ReadExisting();//读取缓冲数据

  msg += msg1 ;
  MessageBox.Show(msg1);
  }
  MessageBox.Show(msg);
  }
// 即当有数据到串口后,触发comm_DataReceived函数,我在函数里面循环读,把数据读出来,结果不行,程序总是死。

后来我又用一个按钮 private void button4_Click(object sender, EventArgs e)
  {
  /////////做一个循环来接收串口中的数据
  int a = Form1.comm.ReadBufferSize;
  int b = Form1.comm.WriteBufferSize;
  string a8 = "";
  for (int i = 0; i < 10;i++ ) 
  {
  string a4 = Form1.comm.ReadExisting();
  a8 += a4;

  }
     }
还是不行,当i = 0时,a4的字符数是2047, 当再次进入循环,即i = 1时,a4就为空了,即串口的数据已经全部读出了,那我要发大于2047个字符的文件怎么办呢,还有2047是怎么回事啊,我没有设这个值啊,也就是说串口缓冲区默认的大小是2047


现在请教各位高手,怎么把这个大文件用串口读全啊。不能每次只读2047个字符吧。谢谢啊,

[解决办法]
发送和接收缓冲区的大小是可以设置的,LZ 试试
[解决办法]
改变缓冲区大小以及超时的设置
[解决办法]
缓冲区是在你来不及处理数据的时候保留数据的一块内存,其大小应该根据你的数据传输速率和处理数据的能力大小来设置。如果一直来不及处理数据,又没有合适的纠错方法,就会导致数据丢失。
数据量大的话一般的做法是做数据拼接
楼主可以参考以下帖子
http://topic.csdn.net/u/20111212/10/edb73482-a906-4b6d-9736-4cc2e0bec0a5.html
[解决办法]
根据楼主说的情况,应该是设置的缓冲区大小受限了,一次最多只能接受那么多。这里涉及到一个串口通信的大数据量问题,有两种情况:可以丢失一部分数据和不可丢失。可以丢失的话被动接受,不加控制是可以的,比如说gprs数据。不可丢失的话,像楼主这样的,发送的数据量还比较大,这时候就应该添加对串口通信的控制,不然无法保证一方不断发送的数据,另一方可以完全接受而不丢失。
[解决办法]
流控就是用来处理数据大于缓存的问题的, 两端都有硬流控的话打开来就ok了

不过你传送一个文件,程序上也应该分包传,万一有误码怎么办,还是要分包校验的
[解决办法]
是的,一般都是这样传的。

发一包,接收端校验,正确就回个ok,发送端接着发下一包;错误就回个er,发送端重发上一包
[解决办法]
流控的原理是,如果缓存满了,会通知对方,对方就会暂停发送

串口协议本身有硬件流控和软件流控。你传送文件,肯定不能用软流控。如果硬件支持硬流控,只要打开就可以了
[解决办法]
这个我还真没试过,我只知道,c#的话,如果你读缓存设的2047,读一次后会清空,如果发送端这时候还在发送,就会继续接收,这中间可能会丢数据

但如果你是发送端设置缓存2047,我不清楚发送的时候是不是会超出缓存的部分都丢失。这你需要自己验证一下
[解决办法]
发送方分侦发送,每帧自己定个长度,侦间应有延时,延时控制好,保证接收方有足够的处理速度。
接收方用事件接收方式=1 ,按字节接收,保险没你说的问题。

热点排行