文章目录

  • 1. 引言
  • 2. CameraLink串行口协议
  • 3. 串口通讯编程方法
    • 3.1 DLL技术
    • 3.2通用API
    • 3.3 编程流程
  • 4. CameraLink协议中串行通讯函数介绍
    • 4.1 初始化前
      • 4.1.1 clGetNumSerialPorts
      • 4.1.2 clGetManufacturerInfo
      • 4.1.3 clGetSerialPortIdentifier
    • 4.2 串口初始化和参数设置
      • 4.2.1 clSerialInit
      • 4.2.2.1 clGetSupportedBaudRates
      • 4.2.2.2 clSetBaudRate
      • 4.2.3 clSetFlowControlMode
      • 4.2.4 clSetParity
      • 4.2.5 clSetPortFeature
    • 4.3 串口读写
      • 4.3.1 clSerialRead
      • 4.3.3 clSerialWrite
      • 4.3.3 clGetNumBytesAvail
      • 4.3.4 clGetErrorText
    • 4.4 关闭串口
      • 4.4.1 clSerialClose

1. 引言

CameraLink是2002年10月由NI公司与其它图像采集公司联合推出的一种高速的、应用于视觉系统的接口协议,旨在简化数字相机同采集卡之间的连接。在扩展ChannelLink基本技术的基础上, CameraLink协议与以往的标准相比有更大的优势:减少了开发时间和成本;标准电缆支持增加的信号速度,且其结构允许根据流量定价来减少用户的费用;采用了更小的接插件,5对信号线可以传送多达28位的数据,从而可以制造体积更小的相机;高数据传输速率,ChannelLink芯片的数据传输速率高达2.38Gbits/s,支持目前传输速率的增长趋势。总体来说, CameraLink协议为高速高精度数字相机提供了简单灵活的连接。

标准CameraLink协议中、电缆包括电源信号、高速相机控制信号(即外部同步信号、重置信号、向前信号和保留信号)、低速串行通讯命令和高速图像数据信号,通过低速串行通讯命令,可以完成主机端对相机的配置和其它操作。

本文根据2004年1月的Camera Link v1.1协议,介绍了其中串行口通讯部分的编程方法,并在Visual C++编程环境下完成了对自主研发的CameraLink高速线扫描相机的通讯软件,成功对相机进行了设置。

2. CameraLink串行口协议

CameraLink协议提供了异步串行口通讯功能,允许相机制造者编写独立于采集卡的程序,通过CameraLink串行口与相机通讯,从而完成对相机的配置。在此协议下,相机制造者能够简单地操作串行口,而不用留意异步串行口通讯的实际执行方法。

CameraLink协议采用了动态链接库技术(DLL),定义了两个串行口通讯应用程序接口(API)。

  • 一个是通用API,提供给相机制造者来完成独立于采集卡的相机设置程序,其中的函数包含在clallserial.dl文件中。
  • 另一个API由采集卡制造者提供,完成特定采集卡的异步串行口通讯功能的执行方法,它的所有函数包含在clserxxx.d文件中。xxx为采集卡公司的英文简称,采集卡公司通过在AIA(自动化成像协会)注册,获得一个特定的名称(xxx)为它的DLL命名。

相机设置程序调用clallserial.dll的函数, clallserial.dll会自动加载与此工程应用相关的相应采集卡的特定DLL文件。它会发送所有命令至这个DLL,图1说明了这种关系。

通用API通过导入链接库(import library)支持C/C++程序,且在Visual Basic版的DLL中采用类型链接库(type library)资源,从而简化了应用程序之间的接口。当clallserial.dll被加载,它搜HKEY_LOCAL_MACHINE\software\cameralink注册表项中定义的CameraLink目录,并在此目录下寻找使用约定名称clserxxx.dll的文件。clallserial.dll自动加载找到的文件,并查询每一个文件的制造商名称和串行口名称。它会返回一个系统内所有CameraLink串行口列表。当所需的DLL文件加载后,clallserial.dll管理并传递应用程序的消息至指定串行口相应的DLL执行

当前CameraLink标准下的串行口通讯有以下特征:

  1. 支持同时多串行口(包括不同采集卡)通讯;
  2. 支持二进制数据和字符数据传输;
  3. 通用API、通用错误码、通用错误文本;
  4. 所有函数都有严格的定义和明确的行为;
  5. 开放具体供应商的错误码和错误文本;
  6. 可列举系统串行口;
  7. 可查询/调整串行口波特率;
  8. 支持Win32(向其它平台串行口开敬资源);
  9. 通过导入库支持C/C++;
  10. 通过类型库支持Visual Basic;
  11. 向下兼容2000年10月的Camera Link说明;
  12. 串行口标准默认通讯设置;
  13. 线程安全

3. 串口通讯编程方法

3.1 DLL技术

DLL是包含函数和数据的模块,它在需要调用它的模块(. EXE或. DLL)运行时加载DLL加载后,它映射到调用它的进程的地址空间。在DLL中可以定义两种函数:导出函数和内部函数。导出函数可以被其它模块调用;内部函数只能由定义它的DLL在内部调用。DLL提供了模块化的一种方式,它使一些功能可以更容易地被更新和重用,在多个工程同时使用同样的功能时,它通过每个工程使用自己数据的拷贝的同时共享同一段代码来减少所需的内存。

3.2通用API

在C/C++编程中,clallserial.dll文件及其导入库文件clallserial.lib和头文件clallserial.h使用了如表1所示的数据类型,表1同时列出了windows操作系统中其相应的数据类型。

clallserial.dll也提供了可以被C/C++程序调用的函数,如表2所示。利用这些函数我们可以编写独立于采集卡的程序,实现与Camera Link接口相机的通讯,从而完成对相机的配置。

3.3 编程流程

基本流程:

  1. 定义需要的数据类型和函数指针。
  2. 在程序中动态加载clallserial.dll文件,它会自动加载系统安装的采集卡的DLL链接库。
  3. 对CameraLink串口进行所需要的的操作。

4. CameraLink协议中串行通讯函数介绍

4.1 初始化前

4.1.1 clGetNumSerialPorts

此函数返回特定制造商在您系统中的串行端口数。

  1. 声明

    int clGetNumSerialPorts(unsigned int *numSerialPorts
    );
    
  2. 参数
    numSerialPorts:获得您可以使用当前DLL访问的系统中的串行端口数。
  3. 返回值
    CL_ERR_NO_ERR :函数成功返回。

4.1.2 clGetManufacturerInfo

此函数返回创建DLL的图像采集卡制造商的名称,以及DLL遵循的Camera Link规范的版本。

  1. 声明

    int clGetManufacturerInfo(char *manufacturerName, unsigned int *bufferSize, unsigned int *version
    );
    
  2. 参数
    manufacturerName 指向用户分配的缓冲区的指针,该函数将制造商名称复制到该缓冲区中。返回的名称以NULL终止。
    bufferSize 作为输入,此值应该是传递的缓冲区的大小。成功返回后,此参数包含写入缓冲区的字节数,包括NULL终止字符。在 CL_ERR_BUFFER_TOO_SMALL上,此参数包含写入数据文本所需的缓冲区大小。
    version 一个常量,说明此DLL遵循的Camera Link规范的版本。
  3. 返回值
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_BUFFER_TOO_SMALL #define CL_ERR_BUFFER_TOO_SMALL -10001:用户缓冲区不足以容纳数据。ManufacturerName太小,无法包含制造商名称,需要将其缩放为写入bufferSize的值。

4.1.3 clGetSerialPortIdentifier

此函数为系统中的每个串行端口返回制造商特定的标识符。

这将返回一个字符串,其中包含Silicon Software framegrabber SDK使用的板卡和端口索引.

  1. 声明

    int clGetSerialPortIdentifier(unsigned int serialIndex,char* portID,unsigned int* bufferSize
    );
    
  2. 参数
    serialIndex 从零开始的索引值。serialIndex的有效范围是0到(n–1),其中n是由clGetNumSerialPorts()返回的numSerialPorts的值。
    portID 串行端口的制造商特定标识符
    bufferSize 作为输入,此值应该是传递的缓冲区的大小。成功返回后,此参数包含写入缓冲区的字节数,包括NULL终止字符。在CL_ERR_BUFFER_TOO_SMALL上,此参数包含写入数据文本所需的缓冲区大小
  3. 返回值
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_INVALID_INDEX #define CL_ERR_INVALID_INDEX -10005:不是有效的索引。
    CL_ERR_BUFFER_TOO_SMALL #define CL_ERR_BUFFER_TOO_SMALL -10001:用户缓冲区不足以容纳数据。portID太小,无法包含端口标识字符串,因此需要将其缩放为写入bufferSize的值

4.2 串口初始化和参数设置

4.2.1 clSerialInit

该函数初始化由serialIndex引用的设备,并返回一个指向内部串行引用结构的指针。

串口将使用默认设置进行初始化。波特率将设置为9600,没有奇偶校验,并且任何高级端口功能都将设置为硬件默认值。如果串行端口同时支持UART和USART模式,它将被设置为UART模式。

  1. 声明

    int clSerialInit(unsigned int serialIndex, void **serialRefPtr
    );
    
  2. 参数

    erialIndex 从零开始的索引值。对于此库支持的系统中的n个串行设备,serialIndex的范围为0到(n-1)。
    serialRefPtr 成功调用时,指向一个值,该值包含指向当前会话的特定于供应商的引用的指针。
  3. 返回值

    返回值 意义
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_PORT_IN_USE #define CL_ERR_PORT_IN_USE -10003:端口有效,但由于正在使用中而无法打开。
    CL_ERR_INVALID_INDEX #define CL_ERR_INVALID_INDEX -10005:不是有效的索引。
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006 串口参数无效。

4.2.2.1 clGetSupportedBaudRates

此函数返回当前接口的有效波特率。

  1. 声明

    int clGetSupportedBaudRates(void *serialRef, unsigned int *baudRates
    );
    
  2. 参数
    serialRef 从clSerialInit()函数获得的值,该值描述要查询的波特率的端口。
    baudRates 用于描述串行端口支持的所有波特率,如serialRefPtr所述。
  3. 返回值
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006: 串口参数无效。

4.2.2.2 clSetBaudRate

此功能设置所选设备的串行端口的波特率。

使用clGetSupportedBaudRates()确定支持的波特率。串口将使用默认设置进行初始化。奇偶校验将被禁用,所有高级端口功能都将设置为硬件默认值。

  1. 声明

    int clSetBaudRate(void *serialRef,unsigned int baudRate
    );
    
  2. 参数

    serialRef 从clSerialInit()函数获得的值。
    baudRate 您要使用的波特率。此参数需要由CL_BAUDRATE常量表示的值。
  3. 返回值

    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_BAUD_RATE_NOT_SUPPORTED #defineCL_ERR_BAUD_RATE_NOT_SUPPORTED -10008:此接口不支持请求的波特率。
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006: 串口参数无效。

4.2.3 clSetFlowControlMode

此功能允许启用非对称RTS / CTS硬件流控制。

一些串行端口支持标准的非对称RTS / CTS硬件流控制。由于RTS和CTS信号需要额外的连接,因此必须组合两个UART模块。主端口用于通信,而使用硬件流控制时,次端口将被禁用。请参阅设备文档以获取硬件流控制的支持,以及必须组合哪些UART模块的详细信息。

  1. 声明

    int clSetFlowControlMode  (   void *      serialRef,void *        secondRef,unsigned int  flowControl
    )
    
  2. 参数

    serialRef 从clSerialInit()函数获得的主端口句柄
    secondRef 从clSerialInit()函数获得的辅助端口句柄。
    flowControl 0:关闭流控制,0x01使用硬件流控制
  3. 返回值

    返回值 意义
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_FUNCTION_NOT_FOUND #define CL_ERR_FUNCTION_NOT_FOUND -10099: 该功能在制造商的库中不存在。即主端口不支持USART模式。
    CL_ERR_INVALID_INDEX #define CL_ERR_INVALID_INDEX -10005: 辅助端口与主端口不匹配
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006 无效的串行句柄

4.2.4 clSetParity

此功能设置所选设备的串行端口的奇偶校验。

任何高级端口设置都将重置为硬件默认值。

  1. 声明

    int clSetParity(  void *  serialRef,unsigned int  parityOn
    )
    
  2. 参数

    serialRef 从clSerialInit()函数获得的值。
    parityOn 应使用的奇偶校验(0:关闭奇偶校验; 1:偶数奇偶校验)
  3. 返回值

    返回值 意义
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006 串口参数无效。

4.2.5 clSetPortFeature

此功能可以激活不同的增强设置。

这些功能特定于某些硬件和帧捕获器类型。该功能保留给Silicon Software硬件的将来版本使用。位掩码的每个位代表一个特定的开关。

  1. 声明

    int clSetPortFeature(void *   serialRef,unsigned int  feature,unsigned int    value
    )
    
  2. 参数

    serialRef 从clSerialInit()函数获得的值
    feature 特定功能的标识符
    value 为功能设置的值
  3. 返回值

    返回值 意义
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_FUNCTION_NOT_FOUND 无效的端口功能或不支持的功能
    CL_ERR_INVALID_ARG 端口功能的值无效
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006 串口参数无效。

4.3 串口读写

4.3.1 clSerialRead

此函数从serialRef引用的串行设备读取numBytes。

  1. 声明

    int clSerialRead( void *  serialRef,char *    buffer,unsigned int *   numBytes,unsigned int   serialTimeout
    )
    
  2. 参数

    erialRef 从clSerialInit()函数获得的值。
    buffer 指向用户分配的缓冲区。调用成功后,缓冲区包含从串行设备读取的数据。发生故障时,此缓冲区不受影响。调用方应确保缓冲区的大小至少为numBytes。
    numBytes 调用方请求的字节数。
    serialTimeout 表示超时(以毫秒为单位)。
  3. 返回值
    当在串行端口上有numBytes可用时,或当serialTimeout周期过去时,clSerialRead()将返回。

    • 成功后,将numBytes复制到缓冲区。
    • 如果发生任何错误(包括CL_ERR_TIMEOUT),则不会将任何数据复制到缓冲区中。
    返回值 意义
    CL_ERR_NO_ERR #define CL_ERR_NO_ERR 0:函数成功返回。
    CL_ERR_TIMEOUT #define CL_ERR_TIMEOUT -10004:在指定的超时时间内操作未完成。
    CL_ERR_INVALID_REFERENCE #define CL_ERR_INVALID_REFERENCE -10006 串口参数无效。

4.3.3 clSerialWrite

该函数将缓冲区中的数据写入由serialRef引用的串行设备。

  1. 声明

    int clSerialWrite(void *   serialRef,char *    buffer,unsigned int *   bufferSize,unsigned int     serialTimeout
    )
    
  2. 参数
    erialRef 从clSerialInit()函数获得的值。
    buffer 包含要写入串行端口的数据。
    numBytes 包含指示要写入的最大字节数的缓冲区大小。成功调用后,bufferSize包含写入串行设备的字节数。
    serialTimeout 表示超时(以毫秒为单位)。

    基于CameraLink的串行口通讯相关推荐

    1. 51单片机串行口程序c语言编程,单片机C语言编程串行口通讯.ppt

      单片机C语言编程串行口通讯 第7章 MCS-51单片机串行口 第7章 MCS-51单片机串行口 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举 ...

    2. 串行口发送子程序C语言,运用C语言对串行口进行操作.pdf

      运用C语言对串行口进行操作 第 27 卷第 5 期 唐山师范学院学报 2005 年 9 月 Vol. 27 No.5 Journal of Tangshan Teachers College Sep. ...

    3. 基于51的串行通讯原理及协议详解(uart)

      串行与并行通讯方式 并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难. 串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图: 同步与异步串行通讯方式 同步串行通讯方式:同步通 ...

    4. qj71c24n通讯实例_Q系列串行口通信模块用户参考手册QJ71C24N(基础篇).pdf

      您所在位置:网站首页 > 海量文档 &nbsp>&nbsp电子工程/通信技术&nbsp>&nbsp数据通信与网络 Q系列串行口通信模块用户参考手册QJ ...

    5. 单片机实验汇编案例---单片机串行口与PC机通讯实验

      一.实验要求 利用8031单片机串行口,实现与PC机通讯. 本实验实现以下功能,将从实验机键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到实验机的数码管上. 二.实验 ...

    6. 串行口发送子程序C语言,基于C语言的RS232串行接口通信实现

      摘要:串口通信是一种广泛使用且实用的通信方式,介绍RS232串行通信的联结方式,研究利用c语言编程实现RS232串行通信的过程.结合实际应用,在约定双方串行通信协议的基础上,运用C语言开发的串行通信软 ...

    7. 俩个PC机通过串行口互联,实现件的无差错传输。程序必须用中断方式来完成任务

        课程设计(论文)任务书 一.设计题目:1.题目名称      PC机通过串行口互联 2.题目来源               二.目的和意义 俩个PC机通过串行口互联,实现件的无差错传输.程序必须 ...

    8. setserial - 取得/设置 Linux 串行口的信息

      总览 setserial [ -abqvVWZ] 设备 [ 命令参数一 [ 设备变元参数 ] ] ... setserial -g [-abGv ] 设备一 ... 描述 setserial 是一个用 ...

    9. 单片机 串行口实验解数据流怎么到发光二极管来显示的

      [斯鹭]徐良军利用8031单片机串行口,实现与PC机通讯.本实验实现以下功能,将从实验机键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到实验机的数码管上.二.实验目的 ...

    10. 时间的定义,时间接口包括 1PPS+ToD、DCLS、IRIG-B、NTP、PTP、串行口 ASCII 字符串

      材料:https://www.docin.com/p-507231675.html 时间定义 在规划和设计时间同步网时,在时间概念方面经常提到以下术语:平均太阳日.世界时. 国际原子时.协调世界时.闰 ...

    最新文章

    1. 43.6% mAP! 阿里巴巴提出:用于一阶段目标检测的半锚式检测器
    2. torch The “freeze_support()” line can be omitted if the programis not going to be frozen to produce
    3. 又拍云上传文件后,如何访问?
    4. 每天学一点Scala之 高阶函数 flatten
    5. Java案例:泛型用法演示
    6. 教程,word导出为pdf既要书签和链接又要高清图片
    7. excel多元线性拟合_excel透视+多元线性回归
    8. photoshop7.0绿色迷你免安装版
    9. mysql rownum写法_mysql类似oracle rownum写法
    10. 2022年危险化学品经营单位安全管理人员考试题库及模拟考试
    11. 微信小程序之 收藏功能
    12. 【opencv4.3.0教程】04之基础结构及其常用功能介绍1
    13. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?
    14. 微商城分销系统的怎么选择_有没有免费开源支持多端的_OctShop
    15. php酷狗音乐json,酷狗音乐API
    16. python屏幕文字识别_python 图片文字识别 可截图识别
    17. Linux驱动开发-编写RFID-RC522射频刷卡模块驱动
    18. 程序员吐槽:四年被三家公司裁员补偿,网友:去BAT转转?
    19. 【try……catch】C++ try…… catch 笔记(C语言中也可以Try-Catch异常处理)
    20. 用顺序表求集合的交集、并集和差集

    热门文章

    1. 自定义 Bean 作用域
    2. PCB 设计的基本流程
    3. 设置idea类注释模板
    4. win10录屏_不为人知的win10隐藏功能,一键录屏,你还不知道?
    5. 目标跟踪 | 目标跟踪算法总结
    6. Linux小游戏——单机掷骰子
    7. 软件研发中也有5S 管理?
    8. c语言实现生成随机数
    9. linux打开cap文件,cap/pcap类文件无法用wireshark打开
    10. 微信公众号 | 适合程序员的公众号排版