c# 串口接收数据并保存

sdfgrtyu 2017-05-22 09:32:59
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//long qwe = 0;
int n = serialPort1.BytesToRead;
if (n > 0)
{

byte[] data = new byte[n];
serialPort1.Read(data, 0, n);
foreach (byte item in data)
{
asdd1 = asdd1 + item.ToString("X2");
wr1++;
}
//for (qwe = (0); qwe < data.Length; qwe++)
//{
// asdd1 = asdd1 + serialPort1.ReadByte().ToString("X2");
// wr1++;
//}
if ((asdd1 != "FF") && (asdd1 != "FE") && (asdd1 != "FFFE") && (asdd1 != "FEFF"))
{
save_file(asdd1, aaaa1, "COM1");
//textBox1.Text = textBox1.Text + asdd;
}
asdd1 = "";
}
}

private void save_file(string aa, string times, string xiang)
{
//counttime1();
Directory.CreateDirectory(@"D:\" + "串口调试信息");
StreamWriter swww = new StreamWriter(@"D:\" + "串口调试信息" + "\\" + year1 + month1 + day1 + hour1 + minute1 + "_" + xiang + ".txt", true, Encoding.UTF8);
swww.Write(aa);
swww.Flush();
swww.Close();
}

请问这段可以速度更快一点吗?怎么修改?
...全文
1980 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdfgrtyu 2017-05-24
  • 打赏
  • 举报
回复
引用 11 楼 oysy 的回复:
楼主,是我,一定会把保存这个函数写成委托 方式调用 。
为啥,我觉得#6的思路可以啊,就是不知道怎么写,
飞天凤凰601 2017-05-24
  • 打赏
  • 举报
回复
楼主,是我,一定会把保存这个函数写成委托 方式调用 。
niegu9132 2017-05-22
  • 打赏
  • 举报
回复
串口传输速度本身就有限,这点代码并不需要优化。
Mooyi_水 2017-05-22
  • 打赏
  • 举报
回复

 private StringBuilder sb = new StringBuilder();
        StreamWriter swww = StreamWriter.Null;

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //long qwe = 0;
            int n = serialPort1.BytesToRead;
            swww = new StreamWriter(@"D:\" + "串口调试信息" + "\\" + year1 + month1 + day1 + hour1 + minute1 + "_" + xiang + ".txt", true, Encoding.UTF8);
            if (n > 0)
            {

                byte[] data = new byte[n];
                serialPort1.Read(data, 0, n);
                foreach (byte item in data)
                {
                    //asdd1 = asdd1 + item.ToString("X2");
                    sb.Append(item.ToString("X2"));
                    wr1++;
                }
                //for (qwe = (0); qwe < data.Length; qwe++)
                //{
                //    asdd1 = asdd1 + serialPort1.ReadByte().ToString("X2");
                //    wr1++;
                //}
                //if ((asdd1 != "FF") && (asdd1 != "FE") && (asdd1 != "FFFE") && (asdd1 != "FEFF"))
                if ((sb.ToString() != "FF") && (sb.ToString() != "FE") && (sb.ToString() != "FFFE") && (sb.ToString() != "FEFF"))
                {
                    //save_file(asdd1, aaaa1, "COM1");
                    save_file(sb.ToString(), aaaa1, "COM1");

                    //textBox1.Text = textBox1.Text + asdd;
                }
                //asdd1 = "";
                sb.Clear();
            }
            swww.Close();
        }

        private void save_file(string aa, string times, string xiang)
        {
            //counttime1();
            if (!Directory.Exists(@"D:\" + "串口调试信息"))
            {
                Directory.CreateDirectory(@"D:\" + "串口调试信息");
            }
           
            //StreamWriter swww = new StreamWriter(@"D:\" + "串口调试信息" + "\\" + year1 + month1 + day1 + hour1 + minute1 + "_" + xiang + ".txt", true, Encoding.UTF8);
            swww.Write(aa);
            swww.Flush();
            //swww.Close();
        }
by_封爱 版主 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_32661557 的回复:
这么点代码能多慢
其实我也想这么问.. LZ最近可能是被谁感染了 动不动就"快速.高效...." 更是动不动就"别说话,上代码"的心态,. 首先你了解串口吗? 你在牛逼的串口 一秒能发几十万个字符??? 而且你说 你要:"快速" 那么你知道 你是哪里慢了? 有多慢?瓶颈在哪? 做了多少次试验得出的结论? 而且我针对你的代码简单的看了一下. 你的"思路"本身或许就有问题. 在你的判断中

 if ((asdd1 != "FF") 
其中你的asdd1是来自串口的数据并且是累加的.. 那么如果他有循环了 他怎么可能等于单个字符串? 所以你这地方难道不是直接判断n!=1不就好了吗? 另外关于写日志的部分..我看你也编程不少了.. 难道你连log4.net都没听过??
sdfgrtyu 2017-05-22
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
lz可以考虑这几点 1. 把数据接收和数据解析、保存分离。 也就是在接收事件中把数据放到线程安全的容器中,立即返回。 数据解析通过另外一个线程或者线程池来完成。 2.不要每次都去打开文件,写文件,IO开销太大。 可以把数据放在MemoryStream中,等到达到一定长度后,一次性写入。 当然如果追求文件的实时性,在程序初始化的时候,生成文件并打开, 后续只要不报错,直接写文件就行。 3.使用stringbuilder代替string+string这种操作 在数据较多时,差异非常大。
来点代码啊?不会写
xian_wwq 2017-05-22
  • 打赏
  • 举报
回复
lz可以考虑这几点 1. 把数据接收和数据解析、保存分离。 也就是在接收事件中把数据放到线程安全的容器中,立即返回。 数据解析通过另外一个线程或者线程池来完成。 2.不要每次都去打开文件,写文件,IO开销太大。 可以把数据放在MemoryStream中,等到达到一定长度后,一次性写入。 当然如果追求文件的实时性,在程序初始化的时候,生成文件并打开, 后续只要不报错,直接写文件就行。 3.使用stringbuilder代替string+string这种操作 在数据较多时,差异非常大。
本人QQ-554433626 2017-05-22
  • 打赏
  • 举报
回复
引用 4 楼 u010941149 的回复:
[quote=引用 2 楼 qq_32661557 的回复:] 这么点代码能多慢
v[/quote] 他是让你把StreamWriter swww =null;放全局。保存文件方法里直接swww = new StreamWriter ()
sdfgrtyu 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_32661557 的回复:
这么点代码能多慢
v
sdfgrtyu 2017-05-22
  • 打赏
  • 举报
回复
引用 1 楼 qq_34266409 的回复:
1.创建目录跟streamwriter可以放外面去,每读一个都是创建流不太靠谱,反正都在写你弄个全局变量一直写就好了 2.大量字符串拼接请用StringBuilder
具体怎么改?来点代码
本人QQ-554433626 2017-05-22
  • 打赏
  • 举报
回复
这么点代码能多慢
Mooyi_水 2017-05-22
  • 打赏
  • 举报
回复
1.创建目录跟streamwriter可以放外面去,每读一个都是创建流不太靠谱,反正都在写你弄个全局变量一直写就好了 2.大量字符串拼接请用StringBuilder

110,477

社区成员

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

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

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