今天,我给大家带来一些关于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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。