与 UART API 的串行通信
目录
UART API 提供简单快速的功能,通过基于 UART 的控制器 (RS232/RS485) 实现串行通信,也具有硬实时要求。
简介
除了 USB 或以太网等更强大、更快速的通信接口外,串行通信仍然具有其优势。便宜的成本和较小的控制器空间以及简单性是串行通信仍在使用的一些原因。
Windows 下的串行通信
Windows API (Win32 API) 也支持 COM 接口的控制,但特别是对于工业应用,此功能效率极低,而且不是很方便。
-
简单的任务可能会导致复杂的编程
-
无法立即响应硬性实时要求
-
无法直接控制 UART 控制器,例如控制握手线
与 Kithara RealTime Suite 进行串行通信
在Kithara RealTime Suite中,可以控制任何受支持的基于UART的控制器,这些控制器具有硬实时要求。也可以使用控制器的全部功能,例如握手线或 9 位模式等。
支持的硬件
请查看以下页面:Serial/UART Module。
如何打开对 UART 硬件的访问
首先,有必要确保要使用的 UART 控制器与 Kithara 驱动程序一起安装。除了可以查看设备管理器并打开设备的属性外,还可以通过编程方式进行。在此处找到 如何查找设备并更改其驱动程序
打开对 UART 硬件的访问
为请求的 UART 控制器找到正确的 Kithara 设备实例字符串后,可以使用 KS_openUart 函数打开该设备。除了设备字符串之外,还需要确定一些其他参数。串行通信的参数将随 pProperties 一起提供,这是一个指向 KSUartProperties 实例的指针。参数 recvBufferLength 和 xmitBufferLength 确定接收和传输缓冲区的大小。这些可以有不同的大小。当访问处于打开状态时,无法更改缓冲区大小。
可以随时使用函数 KS_execUartCommand 和命令 KS_CHANGE_LINE_CONTROL’ 更改 UART 属性。
API 的工作原理和使用
打开 UART 控制器后,它将开始接收传入的数据。它将收集所有数据,直到接收缓冲区已满。从现在开始,最旧的数据将被转储以保护传入的新数据。
读取接收到的数据
有两种不同的方法可以从接收缓冲区读出数据。可以使用函数 KS_recvUart 逐字节读取。使用此函数,可以读出每个接收到的字节的行错误。函数 KS_recvUartBlock 可用于通过一次调用读出整个数据块。
逐字节读取
函数 KS_recvUart 接收一个字节并读取此接收字节的线路错误状态。读出的字节将传送到 pValue,行错误将传送到 pLineError。
读取数据块
在我们开始接收字节块之前,可能需要检查可以接收多少数据。为此,请在 pBuffer 中使用 NULL/NIL 指针调用 KS_recvUartBlock。该函数会将 avail 数据字节的计数返回为 pLength。
要立即接收数据块,请使用 pBytes 中的指针调用 ‘KS_recvUartBlock’ 数据缓冲区。提交应读出到数据缓冲区的数据量 length。参数 length 不得大于缓冲区的大小。
如果可用,该函数将读取 length 中给定的数据。实际复制的数据大小以 pLength 格式提供。
写入传输数据
当使用函数 ‘KS_openUart’ 打开 UART 控制器时,确定了传输缓冲区大小。此缓冲区可以填充数据。控制器将尽快发送此数据,直到缓冲区为空。
正如有两种读取数据的方法一样,也有两种写入数据的方法。
逐字节写入
函数 KS_xmitUart 就像看起来一样简单。调用 ‘KS_xmitUart’ 一次,一个字节将被写入传输缓冲区,并且传输该字节将立即开始。参数 value 是一个整数,但只会传输 value 中的最低字节。
写入数据块
要写入一堆数据字节,提供了函数 KS_xmitUartBlock。
要检查 transmit buffer 中的 avail 空间,也可以使用函数 ‘KS_xmitUartBlock’ 。在 pBytes 中使用 NULL/NIL 指针调用 ‘KS_xmitUartBlock’ 传输缓冲区中的空闲字节数将写回 pLength。
要写入整个数据块,pBytes 需要指向开头。应写入的数据长度必须在参数 length 中传递。该函数返回实际写入传输缓冲区的字节数,即使没有足够的空间容纳所有数据。
查询 UART 控制器状态
函数 KS_getUartState 将查询 UART 控制器的当前状态。
为此,需要创建 KSUartState 的实例,并且必须将成员 structSize 设置为 ‘KSUartState’ 的大小。完成此操作后,将 ‘KSUartState’ 对象的地址提供给 ‘KS_getUartState’ 函数的参数 pUartState。
"KSUartState"包含有关当前设置的 KSUartProperties、状态、错误等的信息。有关详细信息,请参阅 KSUartState 的定义。
通过命令使用 UART 控制器的所有功能
为了能够控制 UART 控制器的所有功能,给出了功能 KS_execUartCommand。请查看 ‘KS_execUartCommand’ 的描述以阅读有关 avail 命令的更多信息。大多数不需要 pParam 中的任何其他参数,这里可以给出 NULL/NIL 指针。对于所有其他命令,pParam 必须指向正确的数据。例如,应设置 KSUartProperties :
int command = KS_CHANGE_LINE_CONTROL;
KSUartProperties properties = { // KSUartProperties 的实例
9600, // 波特率
'n', // 奇偶校验
8, // 数据位数
1, // 停止位数
0 }; // reserved 应为零
int ksError = KS_execUartCommand(
hUart, // UART 控制器的句柄
command, // 要执行的具体命令
&properties, // 指向参数的指针,此处指向KSUartProperties
flags); // 标志,这里不给出标志
if (ksError != KS_OK) {
... // 错误处理
}
安装事件句柄
函数 KS_installUartHandler 为使用 event 给出的 eventCode 确定的特定事件安装回调处理程序。这意味着,在事件发生时,已安装的处理程序将调用 hSignal 给出的回调。
安装的回调函数应遵循此 创建和使用回调。
例如,将为每个接收到的字节发出 ‘KS_UART_RECV’ 事件信号。在这种情况下,建议在循环中轮询接收缓冲区中的所有 avail 字节,以减少通过向每个接收的字节发出信号而产生的开销。