如何在Windows Forms应用中通过C#读取Arduino串口数据?
问题根因与解决方法
你当前的代码存在串口参数配置缺失、握手规则与Arduino Micro不兼容的问题,按以下方案调整即可正常读取数据:
核心调整点
- 移除RequestToSend硬件握手配置,Arduino Micro的USB虚拟串口不需要硬件握手,开启后会导致串口等待握手信号,无法接收数据
- 补全串口核心参数:串口通信要求两端参数完全一致,必须显式配置8位数据位、无校验、1位停止位,和Arduino默认串口参数匹配
- 开启DTR、RTS信号:Arduino Micro的USB虚拟串口需要这两个信号激活才会向外发送数据
- 打开串口后增加短延迟,等待Arduino初始化完成,避免漏掉前几帧数据
修改后可运行代码
using System.IO.Ports; using System.Threading; class Program { static SerialPort SP; static void Main(string[] args) { SP = new SerialPort(); SP.PortName = "COM7"; SP.BaudRate = 9600; // 显式设置和Arduino匹配的串口参数 SP.DataBits = 8; SP.Parity = Parity.None; SP.StopBits = StopBits.One; // 禁用不必要的硬件握手 SP.Handshake = Handshake.None; // 适配Arduino Micro的USB虚拟串口要求 SP.DtrEnable = true; SP.RtsEnable = true; SP.Open(); // 打开串口后等待1秒让Arduino准备就绪 Thread.Sleep(1000); while (true) { // 临时测试可替换为ReadExisting读取所有缓冲区内容,排除换行符匹配问题 Console.WriteLine(DateTime.Now.ToString() + " : " + SP.ReadLine()); } } }
排查补充说明
如果调整后仍无法读取,按以下步骤验证:
- 确认Arduino代码中使用
Serial.println()输出数据,确保每段数据末尾带换行符,匹配ReadLine()的读取逻辑 - 运行C#代码前必须关闭Arduino IDE的串口监视器,同一个COM口无法被两个程序同时占用
- 确认代码中波特率和Arduino代码里
Serial.begin()传入的参数完全一致
内容的提问来源于stack exchange,提问作者Sylence
相关产品推荐
相关产品推荐

