编写API以与串行端口上连接的设备进行通信

时间:2010-08-31 08:20:47

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

我担心我的问题中的几个术语是错误的。无论我错在哪里,请耐心跟我纠正。

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

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

cardEject()和其他函数本身将负责打开串口,向其写入数据,检查确认,检查错误代码,在发生故障时重新发送命令等。我很清楚与设备通信在串口上。

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

哪个是更好的主意?

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

现在是一个愚蠢而又真实的问题:-)这些程序使用的术语是什么?它是驱动程序或库或设备接口吗?这些项目的正确标签是什么?

感谢您的时间。

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

4 个答案:

答案 0 :(得分:3)

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

关于更普遍的问题我的两分钱:

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

如果它主要用于其他项目,我会创建一个库。它还使您能够在一个地方更改lib以供每个人实施。再次取决于您将实现它的位置,在添加代码时有很多场景是更好的选择。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我的两分钱:

我认为你提供的输出取决于用户。这个人是否在同一家公司/项目中与您密切合作,或者这是一个外部来源?

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

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

关于打开/关闭端口,它又取决于它的工作方式。如果您只是为其他程序员提供API(并且不知道它将如何工作),我会说将其抽象为initCardReader / closeCardReader函数调用。这样,如果用户想要进行多次交易,他不需要担心每次打电话都会浪费处理时间......他可以自行决定是否开启/关闭。

对我来说,就像你正在为读卡器设备驱动程序编写API调用一样;)

答案 3 :(得分:1)

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

的非常好的介绍