C#如何向Arduino发送JSON对象?串口传输JSON实现方法
核心原因
你代码里的Port是串口操作类实例,串口通信的底层只支持传输字节流,不存在直接发送内存中托管JSON对象的可能。所有跨设备传输的数据,最终都必须序列化为线性的字符串或者二进制字节数组才能发出。你直接传JObject触发报错的本质原因是串口的Write方法根本没有接收JObject类型参数的重载,传入不符合签名的参数必然抛出类型不匹配异常。
可行实现说明
你现在把JSON对象转成字符串再发送的思路是完全正确的,只需要做几个细节优化,就能避免乱码、接收端无法判断帧边界等常见问题:
- 不要用
Convert.ToString(data)做序列化,直接用Newtonsoft Json内置的ToString()方法输出标准JSON格式,避免特殊字符转义异常 - 明确指定传输编码,不要依赖系统默认编码,否则Arduino端解码时很容易出现乱码
- 按照你和Arduino约定的通信协议添加帧尾标识(最常用的是换行符
\n),方便Arduino端判断一整段JSON数据什么时候接收完成
优化后的稳定实现代码如下:
public static void SendInfo(JObject data) { try { if (Port != null && Port.IsOpen) { // 序列化为无格式的紧凑JSON字符串,减少传输体积 string jsonContent = data.ToString(Formatting.None); // 统一使用UTF8编码,追加换行符作为帧结束标识 byte[] sendBytes = Encoding.UTF8.GetBytes(jsonContent + "\n"); Port.Write(sendBytes, 0, sendBytes.Length); } } catch (Exception e) { Console.WriteLine("Exception information: {0}", e); } }
关于其他发送方式的说明
不存在所谓“不转格式直接发送JSON对象”的方案,所有其他实现本质都是序列化操作,区别只是序列化后的目标格式不同:
- 如果追求更高的传输效率,可以把
JObject序列化为MessagePack、Protobuf这类二进制格式后发送,相同数据的传输体积比JSON字符串小30%以上,但需要在Arduino端部署对应的二进制反序列化库,开发和调试成本更高 - 如果需要保持JSON格式易调试、兼容性强的优势,当前的字符串序列化方案就是成本最低、稳定性最好的选择
内容的提问来源于stack exchange,提问作者jminhal
相关产品推荐
相关产品推荐

