【问题标题】:Writing an API to communicate with a device connected on Serial port编写 API 以与串行端口上连接的设备进行通信
【发布时间】:2010-08-31 08:20:46
【问题描述】:

恐怕我的问题中有几个术语是错误的。请多多包涵并纠正我的错误。

我必须编写一个库/程序,该库/程序将提供一组功能来操作连接在串行端口上的读卡器。就像弹出插入其中的卡一样,用户只需调用他的代码,例如,

cardEject(); // or
track2Data( response); // to read data of track 2 of magnetic stripe.

cardEject() 和其他函数将自己处理打开串行端口,向其写入数据,检查确认,检查错误代码,在失败时重新发送命令等。我很清楚与串行设备通信港口。

我的问题是,在编写完所有这些函数并对其进行测试之后,我应该如何将它们提供给用户。
我应该给他一个头文件(.h)和一个目标文件(.o)吗?这样他就可以在编译他的实际程序时链接到该对象。
我应该提供一个静态库(.a)吗?

哪个更好?

每个函数打开串口然后关闭它是不是一个好主意?或者initCardReader() 打开它,设置它的属性,closeCardReader() 应该关闭它?所有其他函数只能在initCardReader()之后调用?

现在是一个愚蠢但真实的问题 :-) 用于此类程序的术语是什么?它是驱动程序、库还是设备接口?此类项目的正确标签是什么?

感谢您的宝贵时间。

编辑
感谢大家对我的指导。非常感谢。
这个 API 必须成为更大项目的一部分。事实上,我也会从事那个项目。但是这个 API 很有可能会在有我或没有我的其他项目中使用。我认为,考虑到可能在其他项目中使用,图书馆更有意义。如果我错了,请纠正我。

【问题讨论】:

  • 读卡器的 API,虽然定义可能因人而异 :-)
  • 离题,但我看不到你的名字就不会想到'肖申克的救赎':)

标签: c serial-port linux-device-driver api-design


【解决方案1】:

我会接受 Anders K 的回答。您正在为您的读卡器编写 API。

关于更一般的问题我的两分钱:

关于打开/关闭连接的问题,您必须牢记两个方面。让我们假设您按照将其留给用户来打开和关闭连接的方式进行。如果他完成后忘记关闭它怎么办,当多个进程访问读卡器时怎么办?在这些情况下,您可能希望在每次写入/读取后将端口释放给其他进程。最后,这取决于将要完成的操作,使用您的 API 的过程通常总是会多次调用您的 read 方法,您可能希望将其保持打开状态,或者您可以再次在 API 中实现读取多个记录,以避免出现以下情况的可能性连接保持打开状态。

如果它主要用于其他项目,我会制作一个库。它还使您处于在一个地方更改库以供所有人实施的位置。同样取决于您将在何处实现它,在许多情况下添加代码是更好的选择。

【讨论】:

  • 关于用户忘记关闭连接的好处!
  • @espais: 有一点在学习过程中不会很快忘记 ;-)
【解决方案2】:

我认为你应该尽可能简单,一个静态库和一个头文件应该是一个好的开始。

一种方法是将读卡器与任何其他资源(如文件)一样对待,这意味着您打开/初始化读卡器并返回一些标识读卡器的句柄。然后在访问读卡器时在所有功能中使用它。

【讨论】:

  • 共享库更好 - 这样,如果您在库中发现错误,应用程序可以利用固定代码而无需重新编译。
【解决方案3】:

我的两分钱:

我认为您如何提供输出取决于用户。此人是否与您在同一公司/项目中密切合作,还是要通过外部来源?

如果它的外部化肯定使它成为一个库...在另一种情况下创建一个库也可能更容易,因为这意味着其他用户担心的事情更少。

您的代码是否会集成到更大的项目中?如果是这样,您应该将您的代码构建到该项目的子文件夹中,并为他提供所需的功能。我认为这部分比任何东西都更主观。

关于打开/关闭端口,同样取决于它的工作方式。如果您只是提供 API 供其他程序员使用(并且不知道它将如何工作),我会说将其抽象为 initCardReader/closeCardReader 函数调用。这样,如果用户想要进行多笔交易,他就不必担心每次调用都会浪费处理时间……他可以根据自己的判断简单地打开/关闭。

在我看来,您正在为读卡器设备驱动程序编写 API 调用;)

【讨论】:

    【解决方案4】:

    您可以将这组函数放在共享库中(如:libCardReader.so),并将头文件赠送给程序员,以便在他/她的代码中引用和使用它。以下链接提供了关于构建 SO 文件的非常好的介绍 (http://www.network-theory.co.uk/docs/gccintro/)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2013-11-02
      • 2014-12-22
      相关资源
      最近更新 更多