你好
我目前正在尝试使用串行流将Gill Windmaster Pro Sonic风速计的数据记录到CR3000。我知道Gill正在输出一个恒定的串行流,因为我可以在超级终端中查看该流。
我将Gill的发送和接收线连接到Com3的Tx/Rx端口,我已经编写了以下程序来从Gill检索数据:
'-------------------------------------------
'声明Windmaster变量
公共原始数据字符串*52
公共字节以浮点形式返回
'rmc变量
公用查找为字符串(u_W)
公用字符串形式(_v)
公用w_wind为字符串
公共Ts为字符串
数据表(gill,True,-1)
数据间隔(0100,毫秒,10)
示例(1,u_wind,字符串)
示例(1,v_vind,字符串)
示例(1,w_wind,字符串)
样本(1,Ts,字符串)
床头柜
'主程序
开始进度
SerialOpen(Com319200,0,0500)'打开com端口
扫描(100,毫秒,0,0)
串行输入记录(Com3,原始数据,2,0,3,字节返回,01)
'分析Gill数据
u_wind=中间(原始数据,4,8)
v_vind=中间(原始数据,13,8)
w_wind=中间(原始数据,22,7)
Ts=中间(原始数据,40,7)
CallTable鳃
下一次扫描
结束程序
'-------------------------------------
不幸的是,我的CR3000上没有显示任何数据!字符串变量保持为空,一个数字变量(BytesReturned)位于0。
有人知道我做错了什么吗?
其他一些注意事项:
-我确信波特率是正确的
-我不知道如何计算SerialOpen命令的最后一个参数需要多少字节
-Gill手册指出,输出ASCII字符串的起始字符和结束字符分别为2和3,所以这就是我在SerialInRecord参数中放置数字的地方。
任何帮助都将不胜感激!
谢谢
-布伦特。
嗨,布伦特,
几周前,我也不得不从一位鳃管测风仪那里读取数据。
以较慢的速率和不同的格式,我让它在CR1000上工作(通过设备配置工具设置ComPort)。
以下是一些我无法再测试的代码,但我认为它应该经过一些调整(baudrate、com端口、定时?)。
'//////////////////////////////////////////////////
Const STX=CHR(2)'ASCII文本开头
Const ETX=CHR(3)'ASCII文本结尾
构造USA_PORT=组件4
Const usa_string_expected_length=39'重要信息:GILL发送具有恒定长度的字符串。检查格式
公用公用事业_公用事业(5)作为浮动
别名usa_token(1)=usa_Dir
别名usa_token(2)=美国速度
别名usa_token(3)=usa_W
别名usa_token(4)=usa_Temp
别名usa_token(5)=美国状态
公共用途字符串*50
公用事业_总成功率为长期
公用事业失败时间为长
公用usa_num_bytes_in_buffer为长
将usa_buffer标注为字符串*100
以布尔值标注成功
'///检查缓冲区>;读取直到STX>;读取直到ETX>;检查长度>;标记化>;检查NAN
函数usa_read_data_from_gill()为布尔值
Dim USA_有效为布尔值
调暗启动为长
变暗为长
调暗i为长
USA_Valid=错误
usa_ buffer=“usa_";
usa_num_bytes_in_buffer=SerialInChk(usa_PORT)'是否收到任何字符?
如果usa_num_bytes_in_buffer>;0然后
SerialIn(usa_buffer,usa_PORT,50,STX,200)'读取缓冲区直到STX
SerialIn(usa_buffer,usa_PORT,50,ETX,200)'读取直到ETX>;完整字符串
结束如果
USA_Valid=IIF(Len(USA_buffer)=USA_string_expected_length,true,false)
如果USA_Valid然后
iStart=InStr(1,usa_buffer,“Q”,2)+2
iEnd=InStr(1,usa_buffer,ETX,2)-1
usa_string=中间(usa_buffer、iStart、iEnd iStart)
分割tr(usa_token(),usa_string,“&”;,5,0)
对于i=1至5'检查值
如果usa_token(i)=NAN或usa_toke(i)>;998然后
USA_Valid=false'如果一个值有腥味,则丢弃所有值
结束如果
下一个i
Else'标记为无效
对于i=1至5步骤1
usa_token(i)=-1
下一个i
结束如果
返回USA_有效
结束函数
'///
数据表(Gill_Table,11000)
数据间隔(0,1,秒,10)
样品(5,usa_token(1),FP2)
床头柜
'///
开始进度
SerialOpen(USA_PORT,9600,0100512)'保持打开状态
扫描(1,秒,0,0)
成功=usa_read_data_from_gill()
如果成功,那么
usa_num_success=usa_num_success+1
其他的
usa_num_failure=usa_num_failure+1
结束如果
呼叫表Gill_Table
下一次扫描
结束程序
'//////////////////////////////////////////////////
对STX/ETX的双重读取;Q”;现在,当我看到这两个字符串缓冲区时,它看起来有点笨拙,但这是在接近工作的最终代码时退出的。
我记得我甚至用过SerialFlush。
希望这能有所帮助。
向artmann致意
*最后更新者:artmann于2009年4月17日下午3:01*