将用于串行通信的消息存储为c++可行的成员变量

Storing a message meant for serial communication as a member variable in c++ viable solution?

本文关键字:c++ 成员 变量 消息存储 用于 通信      更新时间:2023-10-16

我正在从一些简单的C函数创建一些c++库,这些函数主要与USB串行通信有关。我是用visual studio 2010编写的,目的是移植到mac和linux。

我目前有一个SerialCommunication类和一个PumpComm子类。目前,有一个C函数creatatemessage (uint8 msg[]), SendMessage(uint8 msg[]), ReadSerial(uint8 readmsg[])等。

我的问题是:将msg[]更改为成员变量而不是函数参数是否有任何缺点?(伪代码):

int main() 
{
    SerialPort sp;
    sp.OpenSerial("COM19");
    sp.CreateMessage("Messagetosend1234");
    sp.SendMsg();
}
class SerialPort 
{
private:
    uint8 msg[];
public:
    int32 OpenSerial();
    int32 CreateMessage(uint8 msg[]);
}

我看到的优点包括:1)msg由它要发送到的串行端口明确拥有,2)msg的范围是串行端口的范围,3)msg的实现可以隐藏(当我添加getter/setter时)。所以基本上是OOP的优点。我对c++和OOP相当陌生,所以我可能遗漏了一些东西,特别是在串行通信方面。谢谢你的宝贵时间。

消息是否是COM通道的一部分?我会说你通过频道发送消息。您的设计是将"如何"(通道)与"什么"(消息)紧密耦合。此外,您还隐式地向代码中添加了许多状态依赖关系——例如,您必须在调用SendMsg之前调用CreateMessage。

总而言之,有些事情可能会在你以后适得其反:

  • 如果需要从多个线程访问通道
  • 如果您的消息超过一个字节缓冲区
  • 如果你重构你的代码并错误地交换了一些调用

因此,我将message和channel保持为两个独立的类:

class Message {
private:
  uint8 *buffer;
  size_t length;
public:
  Message(uint8 *buf, size_t len) : buffer(buf), length(len) { }
  size_t getLength() const { return length; }
  const uint8 *getData() const { return buffer; }
};
class SerialPort 
{
public:
    int32 OpenSerial();
    int32 SendMsg(const Message& msg);
}