0

恐怕我的问题中有几个术语是错误的。请容忍我,并在我错的地方纠正我。

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

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

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

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

哪个是更好的主意?

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

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

谢谢你的时间。

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

4

4 回答 4

3

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

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

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

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

于 2010-08-31T08:41:15.447 回答
2

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

一种方法是以与文件等任何其他资源相同的方式处理读卡器,这意味着您打开/初始化读卡器并返回一些标识读卡器的句柄。然后在访问读卡器时在所有功能中使用它。

于 2010-08-31T08:32:54.990 回答
1

我的两分钱:

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

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

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

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

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

于 2010-08-31T08:32:29.900 回答
1

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

于 2010-09-01T01:41:28.603 回答