You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C#中Serial.WriteLine()向Teensy传HEX文件比Tera Term慢很多?

你排除文件读取环节性能问题的测试是准确的,性能瓶颈完全出在Serial.WriteLine()的调用逻辑上,主要原因如下:

原因分析
  • 逐行调用的开销累积:你对3000多行的HEX文件逐行调用WriteLine(),每次调用都要完成字符串转字节编码、追加换行符、内部串口对象加锁、用户态到内核态的IO调用这一系列操作,几千次的开销累加后就会产生明显的耗时。从你提供的示波器波形也能看出来,C#发送的波形每段数据之间有明显的空闲间隙,这就是两次WriteLine()调用之间的等待时间,而Tera Term是将文件数据按大块连续写入串口,几乎没有空闲间隙,带宽利用率更高。
  • .NET SerialPort的默认写入策略问题:.NET的SerialPort类默认每次调用写入方法都会立刻将数据推送给串口硬件,不会自动攒批量数据再发送,导致频繁的上下文切换,进一步降低了传输效率。
优化方案

你可以直接替换核心传输逻辑,不要逐行写入,将整个HEX文件一次性读取为字节数组后批量写入串口,就能达到和Tera Term接近的传输速度:

Stopwatch stopwatch2 = Stopwatch.StartNew();
// 提前读取行数据保留行数用于后续校验
string[] lines = System.IO.File.ReadAllLines(hexfilename);
int numlines = lines.Length;
// 直接读取整个文件的原始字节批量发送,避免逐行调用开销
byte[] hexAllBytes = System.IO.File.ReadAllBytes(hexfilename);
_serport.Write(hexAllBytes, 0, hexAllBytes.Length);
Console.WriteLine("total lines = {0}, time = {1} mSec", numlines, stopwatch2.ElapsedMilliseconds);

如果你的业务逻辑要求必须逐行发送(比如需要等待每一行的校验应答),可以自行实现批量缓冲逻辑:攒够N行的数据后再调用一次Write()方法,减少调用次数,也能大幅提升效率。

另外还可以检查串口配置,补充开启_serport.RtsEnable = true和_serport.DtrEnable = true,部分串口驱动在未开启这两个选项时会存在传输限速的问题。


内容的提问来源于stack exchange,提问作者user3765883

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:57:02