,,总结Python连接CS2000的详细步骤

,,总结Python连接CS2000的详细步骤

今天,我给大家带来一些关于Python的知识。本文重点介绍将Python连接到CS2000的详细步骤。文中有非常详细的介绍和代码示例,有需要的可以参考一下。

前言

记录CS2000设备的串口连接和相关控制。

CS2000是一种光谱辐射计,可以测量光源的亮度。详细规格请参考CS2000/CS-2000A。所有信息以柯尼卡美能达官网参数和用户手册为准。

使用目的及环境

目前使用PC控制的CS2000的目的是测量屏幕的亮度数据。

PC端使用Python,在Win10环境下开发;

要安装的附加模块:pySerial;

设备连接方法

该设备支持USB1.1全速和RS-232C。其支撑软件CS-S10是USB1.1接口。如果安装了软件,就相当于安装了相应的驱动。当然我这里用的是配置串口通讯口COM口(集群通讯口)。

CS2000支持的通信设置如下:

这里波特率为115200,数据长度为8位,没有校验,设置了1位的停止位;这里不考虑硬件(RTS/CTS),即要求发送和允许发送信号。

程序主体流程

1.获取计算机com的列表;

2.连接并打开CS2000的设备端口;

3.设备初始化(设置控制模式、关闭测试键操作、设置同步模式等。);

4.单次测量并获得测量值;

5.关闭串口;

接下来开始结合说明书进行操作。

获取端口

需要介绍Serial.tools.list_ports模块:

def端口列表():

'''

获取计算机端口列表

:return:端口列表

'''

pl=serial . tools . list _ ports . comports()

#打印(pl)

打印('端口列表:')

对于pl中的项目:

打印(' {}\t\t:\t{} ')。格式(item.usb_description()、item.manufacturer))

获得端口列表后,可以打印端口的描述和制造商,可以用来区分多个端口。

连接端口

需要引入串行模块:

def connect_com(port,baudrate=115200,timeout=0):

'''

配置串口参数并连接;

:param port:端口号," COM1 "

:param波特率:波特率,115200

:param timeout:超时,0

:return:连接的串行端口,ser

'''

# noinspection PyBroadException

尝试:

ser=串行。串行(端口、波特率、超时=超时)

print('Port\t\t:\t{} '。格式(服务名称))

print('Baudrate\t:\t{} '。格式(系列波特率))

print('Status\t\t:\t{}连接成功!'。格式(端口))

退货单

例外情况除外:

print(' Status \ t \ t:\ t \ t \ t connect COM失败!')

定义一个在打开串口后返回对象的函数。

发送格式

分隔符

当使用PC向测量设备发送命令时,需要使用以下分隔符:

0x0D和0x0A对应于Cr和LF的ASCII的;即在命令的末尾要加一个分隔符进行分段;

数据字符格式

在发送的数据中,发送的数字必须与数字的字符相同。例如,为了发送十进制数据886,需要发送相应的字符886。如果要输入的字符长度较短,则需要用空格填充。

超时

PC通信的超时设置至少应为10s。这里可以理解为设备测量亮度需要积分时间。比如测试暗图的时候需要很长时间的积分。因此,测量返回的数据需要相应地延迟很长时间,因此超时设置为至少10s。

在实际使用中,较暗的图片可能需要7秒以上的测量时间。

初始化

初始化包括以下步骤,包括设置远程模式(SCMS)、关闭测量键(MSWE)、设置同步模式(SCMS)等。在这里,仔细参考手册,很容易理解。把下面的代码贴出来就行了。

定义远程模式(ser):

'''

对cs2000进行远程控制设置。

:paramser:串行参数ser: cs2000

:返回:无

'''

data=b'RMTS,1\n '

tx_data(ser,data)

如果rx_data(ser)[0]=='OK00 ':

print(' Status \ t \ t:\ t远程模式设置正常!')

否则:

print(' Status \ t \ t:\ t远程模式设置错误!')

def meas_key_off(ser):

'''

关闭cs2000设备上的措施按键控制

:param ser: cs2000的串口

:返回:无

'''

data=b'MSWE,0\n '

tx_data(ser,data)

如果rx_data(ser)[0]=='OK00 ':

# print('状态\ t \ t:\ t测量键禁用成功!')

及格

否则:

打印('状态\ t \ t:\ t测量键禁用错误!')

定义同步模式设置(ser,freq):

'''

同步模式设定

:param ser: cs2000的串口

:参数频率:频率,单位赫兹

:返回:无

'''

模式=b'1 '

freq=freq.encode()

数据=b'SCMS,'模式频率b'00\n '

tx_data(ser,data)

如果rx_data(ser)[0]=='OK00 ':

打印('状态\ t \ t:\ t同步模式为{},频率为{}Hz!'。格式(模式,频率))

及格

否则:

打印('状态\ t \ t:\ t测量键禁用错误!')

定义同步模式读取(ser):

'''

同步模式读取

:param ser: cs2000的串口

:返回:无

'''

同步模式字典={'0 ':'不同步,

1 ':'内部同步,

2 ':'外部同步' }

data=b'SCMR\n '

tx_data(ser,data)

rdata=rx_data(ser)

if rdata[0]=='OK00 ':

打印('状态\ t \ t:\ t同步模式是{}。'。格式(同步模式字典[rdata[1]]))

if rdata[1]=='1 ':

打印('状态\ t \ t:\ t同步频率为{ }赫兹.格式(rdata[2][:-2])

及格

否则:

打印('状态\ t \ t:\ t同步模式读取错误!')

def dev_init(ser):

'''

cs2000设备进行初始化,包含设置为远程控制,关闭测量按键,设置同步模式,查询同步模式数据

:param ser: cs2000的串口

:返回:无

'''

远程模式

测量钥匙关闭(ser)

同步模式设置(ser,同步FREQ)

同步模式读取(ser)

注意:这里每次发送命令之后,设备均会返回数据。如若返回的是OK00,则说明命令发送和接收都没有出现问题,如果返回的指令有ERxx等字样,需要根据手册中的错误代码列表查询错误原因,并进行改正。

测量数据

测量数据需要先发送测量指令,等待返回测量时间,等待测量结束;

再发送测量数据读取指令。

定义测量(ser):

'''

向cs2000发出测量的命令

:param ser: cs2000的串口

:返回:无

'''

data=b'MEAS,1\n '

tx_data(ser,data)

rdata=rx_data(ser)

if rdata[0]=='OK00 ':

# print('状态\ t \ t:\ t测量时间为{}s .格式(rdata[1])

及格

否则:

打印('状态\ t \ t:\ t测量煤矿管理局错误代码{} '。格式(rdata[0])

rdata_1=rx_data(ser)

if rdata_1[0]=='OK00 ':

#打印('状态\ t \ t:\ t测量完成!')

及格

否则:

打印('状态\ t \ t:\ t测量等待错误代码{} '。格式(rdata_1[0])

def lv_read(ser):

'''

向cs2000发出测量的命令

:param ser: cs2000的串口

:返回:亮度值活动发射装置

'''

data=b'MEDR,2,0,101\n '

tx_data(ser,data)

rdata=rx_data(ser)

if rdata[0]=='OK00 ':

# print('状态\ t \ t:\ t照明为{} cd/m ' .格式(rdata[1])

返回数据[1]

否则:

打印('状态\ t \ t:\ t照明读取错误代码{} '。格式(rdata[0])

不返回

def get_lv(ser):

'''

获取亮度值

:param ser: cs2000的串口

:返回:亮度值,单位cd/m

'''

测量(ser)

返回lv_read(ser)

def xylv_read(ser):

'''

向cs2000发出测量的命令

:param ser: cs2000的串口

:返回:色坐标,X,Y,亮度,吕

'''

data=b'MEDR,2,0,2\n '

tx_data(ser,data)

rdata=rx_data(ser)

if rdata[0]=='OK00 ':

打印('状态\t\t:\tX,Y,LV是{} {} {} '。格式(rdata[1],rdata[2],rdata[3])

返回rdata[1:]

否则:

打印('状态\ t \ t:\ t测量错误!')

不返回

def get_xylv(ser):

'''

获取色坐标x,Y和亮度吕。

:param ser: cs2000的串口

:返回:色坐标,X,Y,亮度,吕

'''

测量(ser)

返回xylv_read(ser)

其中,返回数据的格式需要根据发送的指令进行解析,数据表中也有介绍。

串口收发数据的函数

对于串口收发数据,还封装了一层函数,方便调用:

def tx_data(ser,data):

# noinspection PyBroadException

尝试:

串行写入(数据)

# print('状态\ t \ t:\ t发送确定!')

例外情况除外:

print(' Status \ t \ t:\ t发送错误!')

def rx_data(ser):

# noinspection PyBroadException

尝试:

rdata=ser.readline()。解码(' utf-8 ')。替换(' \n ',' ')。拆分(',')

# print(' Status \ t \ t:\ t received { } '。格式(rdata))

返回rdata

例外情况除外:

print(' Status \ t \ t:\ t接收错误!')

串口关闭

使用后必须合理关闭串口,防止多个程序运行和连接问题。

定义串行关闭(ser):

'''

关闭串行连接

:返回:无

'''

# noinspection PyBroadException

尝试:

ser.close()

print('端口{}已关闭!'。格式(服务名称))

例外情况除外:

打印('-串行关闭失败!')

主函数

的所有参数都是通过将串行端口对象作为参数传递来传递的。

if __name__=='__main__ ':

端口列表()

cs2000=connect_com('COM1 ',timeout=5)

dev_init(cs2000)

获取_lv(cs2000)

获取_xylv(cs2000)

串行_关闭(cs2000)

写在后面

调试的重点是,一切操作要参考Datasheet:cs_2000_technicalnote_en,官网支持可以下载。等你熟悉了手册之后,在后期的调试过程中可以节省很多时间,调制过程也会非常流畅。下面是调试过程中遇到的一些问题示例:

1.合理设置超时(按最长测量时间设置),发送数据后可以等待接收数据;

2.这里用的分隔符是\n,转换成字节型,然后通过串口发送;

3.有些模式设置只能设置一次,没有必要每次开机都设置。为了安全起见,它们被放在初始化中;

4.在黑暗环境下测试暗光源需要很长时间。手动测试版本多达24s,亮光源测试时间1s左右;

5.程序中直接将串口作为参数传递是有问题的。您可以将此模块更改为类;

如果以后遇到其他问题,会在这里更新。

该项目的源代码地址:https://github.com/LJacki/CS2000

关于总结python连接CS2000的详细步骤的这篇文章到此为止。有关Python连接到CS2000的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: