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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:01:03