提问人:Inq 提问时间:11/2/2023 更新时间:11/2/2023 访问量:28
在 C#.NET 项目和 Arduino C++ 项目中共享源代码(简单结构)
Sharing source code (simple structs) in a C#.NET project and an Arduino C++ project
问:
我正在处理一个项目,其中我使用 TCP 在计算机上运行的 Visual Studio C#.NET 程序和在微控制器上运行的 Sketch/C++ 程序之间进行通信。我已经使用结构设置了一个协议。它们仅包含两个环境都可识别的普通变量类型。目前,它可以说完全正常......在桌面上填写一个结构,它就会出现在 Sketch 中。下面是两者上的一条消息的示例。
#pragma once
// CommonComms.h on the ESP8266.
struct VelocityChange
{
const static char ID = 'V';
float LeftVelocity;
float RightVelocity;
};
using System;
// CommonComms.cs on the Desktop
namespace Inq.Utils
{
public struct VelocityChange
{
const char ID = 'V';
float LeftVelocity;
float RightVelocity;
};
}
我想制作一个两个项目都可以使用的文件。只是为了在添加消息时,我只将它们放在一个地方,然后重新编译两端。我可以解决语法问题......就像隐藏使用系统一样;在ESP8266上使用时。我遇到的麻烦是......我无法在 C#.NET 程序中包含 *.h 文件,也无法在 Arduino IDE 中包含 *.cs 文件。我在互联网上做了一些搜索,但没有找到任何有用的东西。我得到的每一次命中都是关于将管理传递到/从非管理、编组等......在同一台计算机上。我的问题只是能够在两个项目中包含相同的文件。
有谁知道我该怎么做?
谢谢。
Visual Studio 似乎需要 *.cs 扩展名才能识别代码。Arduino IDE编译器(在本例中为gcc)无法识别 #include“CommonComss.cs”。我只是得到编译时错误。在Arduino IDE上,它根本看不到同一文件夹中的命名文件。在 VS 上,除非它具有 cs 文件扩展名,否则它不会确认文件和语法。
答:
您发布的两个文件具有不同的内容(对于相似的概念,c++ 与 c# 的语法不同),因此无法在两个编译器中重用其中一个文件。
如果你想重用定义,那么我认为你需要找到一种方法来自动生成源文件(例如,通过读取json文件并写入.h和.cs文件)
评论
实际上,解决方案是从另一个论坛提供给我的。主要问题是我假设当Arduino IDE找不到CommonComms.cs文件时,这是因为cs扩展名。事实证明,如果使用绝对路径,它可以找到并使用包含的 CS 文件。这是上面的相同示例,经过修改,允许在Arduino C++项目和C#.NET项目中使用它。它还显示了在 C++ 项目中使用 C# 语法所需的宏。
下面是 CommonComms.cs 文件
#if ARDUINO
#pragma once
#define public
#endif
namespace InqSim
{
struct VelocityChange
{
public char ID;
public float LeftVelocity;
public float RightVelocity;
};
}
#if ARDUINO
#undef public
#endif
MyArdinoSketch.ino 修改
// The following include is shared in both the Arduino Sketch
// and the VS C#.NET project. The Arduino IDE must use
// an absolute path when the extension is "cs". Also, must
// include the using namespace statement for visibility.
#include "X:\InqEgg\CommonComms.cs"
using namespace InqSim;
评论