目前遇到一个问题:下位机从SD卡里给我上位机发送大概10K或者更大的数据。我想把接收到的数据保存成TXT文档,方便查看。但是我保存的时候经常有遗漏,而且只能保存3K左右的数据。希望大家给点意见,这个程序要怎么写?
------解决思路----------------------
串行口本来就是一两个字节接收的,谈不是“接收缓冲区不够大”的概念。
.net框架并不会每一次只给你返回一个字节(而且返回一个字节也不可能保证就是一个文字),而是会给你返回一堆字节。这一堆字节字节,不是全部字节。你应该在多次事件调用之后,接收到(判断到)结束标志时(或者至少是接收到回车换行符时)才把它转换为文本,不能提前转换。也不能只往文件中写第一次事件接收到数据。
------解决思路----------------------
而且串口通信也根本不存在什么"一次性"发过来
它是一个字节一个字节发的,你也是一个字节一个字节收的
只不过你用了SerialPort自带的回调函数,这个函数到底什么时候触发并不是很确定,但是保证不是100K的数据都发完了它才执行
------解决思路----------------------
在串口接收里面将数据收到内存中,可以用List或者Queue来实现,在串口里面只往里面添加数据。
开另一个线程去处理List或者Queue里面的数据将其取出来写入文本,写的时候可以注意当缓存达到一定数量级之后写一次或者是超过一定时间写一次,防止内存被挤爆,也减少了不断开关文件引起的效率和资源问题。
------解决思路----------------------
串口是以中断方式通知操作系统数据到来的。中断发生在数据传输结束,或缓冲区将满的时刻
所以 DataReceived 事件中你应读空缓冲区。注意,缓冲区不可能无限增大(太浪费资源了)通常都维持在一个较小的水平(比如几k、几十k)
因此 DataReceived 事件会被不断的触发
于是你需要将若干次接收到的数据拼装在一起
你是以写模式打开的文件,这样会在下一次写的时候覆盖掉上一次的内容。达不到拼装数据的目的
你应该以 追加模式 打开文件(FileMode.Append)