牧夫天文网

 找回密码
 加入牧夫(请注明天文爱好者,否则无法通过审核)

QQ登录

只需一步,快速开始

[DIY咨询] 关于stellarium软件用lx200协议通过串口控制望远镜的问题

[复制链接]
Timelysnow 发表于 2017-6-4 08:55 | 显示全部楼层 |阅读模式 来自: 湖北省武汉市 电信

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?加入牧夫(请注明天文爱好者,否则无法通过审核)

x
diy之路上遇见了一个难题,不知道为什么我的stellarium0.15.1串口监听的sd命令格式是这样子的

(文本结果:Sd -29?7:24#,hex监听结果3A 53 64 20 2D 32 39 DF 33 37 3A 32 34 23)

与前辈们监听结果不一样,正确的格式应该是:Sd -29*37:24#,开始分析是监听软件ASII码显示问题,但是hex监听的结果确实是多一个DF,退一步说DF显示也出现了问题,我就换了几种监听软件查看,都是同样的结果,最后从程序入手反回串口接收值,接收到的Sd命令后的参数部分是这个样子的
-2937:24,也就是说DF把*符吃掉了,这下问题大概清楚了,stellarium0.15.1输出的参数貌似就有问题,但是别人为什么没这个问题呢,是我的版本不对吗?疑惑中。也问过大师兄diy群里的大神们,问题暂时还没解决,主要就是DF导致我的命令解析出现诸多问题,特来求其他大神帮忙分析指点。
我相信有人遇见过同样的问题,请问如何解决呢?萌新在此先行谢过。
野草 发表于 2017-6-4 12:00 | 显示全部楼层 来自: 江苏省南京市 电信
我用的是stellarium0.15.2。也是用LX200协议调了一个EQ3D双电跟的GOTO,需要的话可以把源码给你,已经调通了,没有遇到问题
if (command[1]=='S'&&command[2]=='d')  //收到Sd回复 1
        {
                dec_in[0]=command[4];
                dec_in[1]=command[5];
                dec_in[2]=command[6];
                dec_in[3]=command[8];
                dec_in[4]=command[9];
                dec_in[5]=command[11];
                dec_in[6]=command[12];
                command[0]='1';
                DMA_SEND_DATA((u32)command ,1);
                dec_get_flag=1;
        }                               
回复 支持 反对

使用道具 举报

野草 发表于 2017-6-4 12:06 | 显示全部楼层 来自: 江苏省南京市 电信
本帖最后由 野草 于 2017-6-4 12:08 编辑

void LX200(void)
{
        u8 command[20] ;
        u8 i=0,a;
        
        static u8 ra_get_flag=0,dec_get_flag=0;
        static u8 b;
        
        while(data!=':') //look FOR HEAD
        {
                i++;   
                if(i>20)
                {
                        break;
                }
        }
        for(a=0;a<19;a++)         //转存
        {
                command[a]=data;
                i++;
        }
        
        /*ANALYZE AND REPLY*/
        if (command[1]=='G'&&command[2]=='R')   //GR 回复赤经 24h60m60s
        {
                current_ra=CURRENT_POS_RA(target_ra,ra_step);
                CURRENT_RA();
                DMA_SEND_DATA((u32)ra_out ,9);
        }
        
        if (command[1]=='G'&&command[2]=='D')  //GD 回复赤纬 +-90:60:60
        {
                current_dec=CURRENT_POS_DEC(target_dec,dec_step);
                CURRENT_DEC();
                DMA_SEND_DATA((u32)dec_out ,10);
        }
        
        if (command[1]=='Q'&&command[5]=='r')  //Sr 回复1
        {
                ra_in[0]=command[7];
                ra_in[1]=command[8];
                ra_in[2]=command[10];
                ra_in[3]=command[11];
                ra_in[4]=command[13];
                ra_in[5]=command[14];
                command[0]='1';
                DMA_SEND_DATA((u32)command ,1);
                if(b<2)
                {
                        current_ra=RA_DEG_INTO_ARCSEC(ra_in);
                        target_ra=current_ra;
                        ra_step=0;
                        b++;
                }
                ra_get_flag=1;
        }
        
        if (command[1]=='S'&&command[2]=='d')  //Sd 回复1
        {
                dec_in[0]=command[4];
                dec_in[1]=command[5];
                dec_in[2]=command[6];
                dec_in[3]=command[8];
                dec_in[4]=command[9];
                dec_in[5]=command[11];
                dec_in[6]=command[12];
                command[0]='1';
                DMA_SEND_DATA((u32)command ,1);
                if(b<2)
                {
                        current_dec=DEC_DEG_INTO_ARCSEC(dec_in);
                        target_dec=current_dec;
                        dec_step=0;
                        b++;
                }
                dec_get_flag=1;
        }                                
        
        if (command[1]=='M'&&command[2]=='r')  //自定义命令Mr 回复1
        {
                ra_in[0]=command[4];
                ra_in[1]=command[5];
                ra_in[2]=command[7];
                ra_in[3]=command[8];
                ra_in[4]=command[10];
                ra_in[5]=command[11];
                command[0]='1';
                DMA_SEND_DATA((u32)command ,1);
                current_ra=RA_DEG_INTO_ARCSEC(ra_in);
                target_ra=current_ra;
                ra_step=0;
        }
        
        if (command[1]=='M'&&command[2]=='d')  //自定义命令Md 回复1
        {
                dec_in[0]=command[4];
                dec_in[1]=command[5];
                dec_in[2]=command[6];
                dec_in[3]=command[8];
                dec_in[4]=command[9];
                dec_in[5]=command[11];
                dec_in[6]=command[12];
                command[0]='1';
                DMA_SEND_DATA((u32)command ,1);
                current_dec=DEC_DEG_INTO_ARCSEC(dec_in);
                target_dec=current_dec;
                dec_step=0;
        }        
        
        if (command[1]=='M'&&command[2]=='S')  //Ms 回复0
        {
                command[0]='0';
                DMA_SEND_DATA((u32)command ,1);
        }
        
        if (ra_get_flag==1&&dec_get_flag==1)   //ra dec目标更新后进行解算
        {
                ra_get_flag=0;   //清除更新标志
                dec_get_flag=0;
                goto_flag=1;
                target_ra=RA_DEG_INTO_ARCSEC(ra_in);
                target_dec=DEC_DEG_INTO_ARCSEC(dec_in);
                ra_step=CALCULATE_RA(current_ra,target_ra);
                dec_step=CALCULATE_DEC(current_dec,target_dec);
        }
}

点评

嗯,十分感谢您的支援,向前辈致敬,我比较懒,是直接用标准输入输出函数进行命令回复的,没有自己编写发送函数,缺点是会慢一些,但是也够用了。不知道您用哪个单片机?  详情 回复 发表于 2017-6-4 14:50
回复 支持 反对

使用道具 举报

ccqhms 发表于 2017-6-4 12:31 | 显示全部楼层 来自: 浙江省杭州市 联通
看不懂,顶高手。
回复 支持 反对

使用道具 举报

蝶梦 发表于 2017-6-4 12:46 | 显示全部楼层 来自: 陕西省西安市 电信
我只看过SkyWatcher Synscan协议。不过我觉得要解决这个问题,可以看看Stellarium的源代码。

点评

看源码对我来说就是大海捞针,不知道这个对lx200协议的描述部分在哪个目录下,但是确实有必要刨根问底。因为有其他前辈也遇见了同样的问题说这个是显示问题不影响,我的实验监听结果我暂时还无法接受这种说法,因为  详情 回复 发表于 2017-6-4 14:55
回复 支持 反对

使用道具 举报

 楼主| Timelysnow 发表于 2017-6-4 14:50 来自手机 | 显示全部楼层 来自: 湖北省 移动数据上网公共出口
野草 发表于 2017-6-4 12:06
void LX200(void)
{
        u8 command[20] ;

嗯,十分感谢您的支援,向前辈致敬,我比较懒,是直接用标准输入输出函数进行命令回复的,没有自己编写发送函数,缺点是会慢一些,但是也够用了。不知道您用哪个单片机?

点评

我用的是STM32F103C8,因为要产生定时器中断和串口接收中断,所以时序要求比较高,输入输入全部用DMA,不占CPU时间。 用STM32在线仿真和我用串口助手监听都没有遇到你说的不能正常读取的问题,唯一一个有乱码的地方  详情 回复 发表于 2017-6-4 17:20
回复 支持 反对

使用道具 举报

 楼主| Timelysnow 发表于 2017-6-4 14:55 来自手机 | 显示全部楼层 来自: 湖北省 移动数据上网公共出口
蝶梦 发表于 2017-6-4 12:46
我只看过SkyWatcher Synscan协议。不过我觉得要解决这个问题,可以看看Stellarium的源代码。 ...

看源码对我来说就是大海捞针,不知道这个对lx200协议的描述部分在哪个目录下,但是确实有必要刨根问底。因为有其他前辈也遇见了同样的问题说这个是显示问题不影响,我的实验监听结果我暂时还无法接受这种说法,因为尝试了各种监听,包括从接收缓存器直接读数据都是不符合协议格式的。感谢您的建议。

点评

其实这部分源代码我以前也没看过。今天看了一下,应该在源代码的plugins/TelescopeControl/src下。  详情 回复 发表于 2017-6-4 18:04
回复 支持 反对

使用道具 举报

野草 发表于 2017-6-4 17:20 | 显示全部楼层 来自: 江苏省南京市 电信
本帖最后由 野草 于 2017-6-4 18:16 编辑
Timelysnow 发表于 2017-6-4 14:50
嗯,十分感谢您的支援,向前辈致敬,我比较懒,是直接用标准输入输出函数进行命令回复的,没有自己编写发 ...

我用的是STM32F103C8,因为要产生定时器中断和串口接收中断,所以时序要求比较高,输入输出全部用DMA,不占CPU时间。
用STM32在线仿真和我用串口助手监听都没有遇到你说的不能正常读取的问题,唯一一个有乱码的地方就是有一个地方“:”变成了“?”。但是这个地方根本不影响我读其他位的数据,所以你看我程序里面也把那些没用的冒号全部忽略了。其次,因为LX200用的是ASCII明码,所以不需要看HEX接收,就看ASCII字符接收就行了。

点评

感谢!问题已解决,我的程序搞复杂了些。  详情 回复 发表于 2017-6-5 16:09
回复 支持 反对

使用道具 举报

野草 发表于 2017-6-4 17:36 | 显示全部楼层 来自: 江苏省南京市 电信
本帖最后由 野草 于 2017-6-7 19:36 编辑

兄弟,刚才又手动监听了一次,我把我用到的对话信息全部发给你
建立连接时
Stellarium发送 “#:GR#”      下位机回复 “00:00:01#”        //下位机回复当前赤经值
Stellarium发送 “#:GD#”     下位机回复 “+00:00:01#”      //下位机回复当前赤纬值

按CTRL1指向目标时
Stellarium发送“#:Q#:Sr 11:36:05#”    下位机回复“1”        //上位机发送目标赤经值,下位机回复1表示收到
Stellarium发送“:Sd -47?28:13#”        下位机回复“1”        //上位机发送目标赤纬值,下位机回复1表示收到
Stellarium发送“:MS#”                      下位机回复“0”        //上位机询问下位机是否能转到该位置,下位机回复0表示可以

这就是我GOTO用到的全部命令字,没别的啦。



点评

感谢!前辈+高手+热心肠,请+大师兄DIY群,一起讨论。  详情 回复 发表于 2017-6-5 16:46
高手有空加群指导一下 欢迎加入DIY天文望远镜GOTO,群号码:562140617  详情 回复 发表于 2017-6-5 16:41
回复 支持 反对

使用道具 举报

蝶梦 发表于 2017-6-4 18:04 | 显示全部楼层 来自: 陕西省西安市 电信
Timelysnow 发表于 2017-6-4 14:55
看源码对我来说就是大海捞针,不知道这个对lx200协议的描述部分在哪个目录下,但是确实有必要刨根问底。 ...

其实这部分源代码我以前也没看过。今天看了一下,应该在源代码的plugins/TelescopeControl/src下。
回复 支持 反对

使用道具 举报

蝶梦 发表于 2017-6-4 18:10 | 显示全部楼层 来自: 陕西省西安市 电信
本帖最后由 蝶梦 于 2017-6-4 18:14 编辑
(文本结果:Sd -29?7:24#,hex监听结果3A 53 64 20 2D 32 39 DF 33 37 3A 32 34 23)

这段16进制按ASCII应该是“:Sd -29?37:24#”,只有星号不正确。后面的3消失应该是字符编码的问题。

点评

正解  详情 回复 发表于 2017-6-4 18:21
回复 支持 1 反对 0

使用道具 举报

野草 发表于 2017-6-4 18:21 | 显示全部楼层 来自: 江苏省南京市 电信
蝶梦 发表于 2017-6-4 18:10
这段16进制按ASCII应该是“:Sd -29?37:24#”,只有星号不正确。后面的3消失应该是字符编码的问题。
...

正解
回复 支持 反对

使用道具 举报

蝶梦 发表于 2017-6-4 18:24 | 显示全部楼层 来自: 陕西省西安市 电信
刚才看了Stellarium的源代码,发现代码里写的确实是'\xDF',而不是'*'。不知为什么要这样写。

点评

其实无关紧要,这一位数据忽略掉也不参与解码,不影响收数据  详情 回复 发表于 2017-6-5 09:44
回复 支持 反对

使用道具 举报

野草 发表于 2017-6-5 09:44 | 显示全部楼层 来自: 江苏省南京市 电信
蝶梦 发表于 2017-6-4 18:24
刚才看了Stellarium的源代码,发现代码里写的确实是'\xDF',而不是'*'。不知为什么要这样写。 ...

其实无关紧要,这一位数据忽略掉也不参与解码,不影响收数据
回复 支持 反对

使用道具 举报

v2500 发表于 2017-6-5 12:36 | 显示全部楼层 来自: 广东省深圳市 电信
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

 楼主| Timelysnow 发表于 2017-6-5 16:05 来自手机 | 显示全部楼层 来自: 湖北省武汉市 移动
嗯,我也看了源码,现在问题解决了,谢谢大家。

点评

请问stellarium的源代码在那个文件夹?  详情 回复 发表于 2017-7-14 17:09
回复 支持 反对

使用道具 举报

 楼主| Timelysnow 发表于 2017-6-5 16:09 来自手机 | 显示全部楼层 来自: 湖北省武汉市 移动
野草 发表于 2017-6-4 17:20
我用的是STM32F103C8,因为要产生定时器中断和串口接收中断,所以时序要求比较高,输入输出全部用DMA,不 ...

感谢!问题已解决,我的程序搞复杂了些。
回复 支持 反对

使用道具 举报

弼马温1984 发表于 2017-6-5 16:41 来自手机 | 显示全部楼层 来自: 广东省东莞市 电信IDC机房
野草 发表于 2017-6-4 17:36
兄弟,刚才又手动监听了一次,我把我用到的对话信息全部发给你
建立连接时
Stellarium发送 “#:GR#”       ...

高手有空加群指导一下
欢迎加入DIY天文望远镜GOTO,群号码:562140617
回复 支持 反对

使用道具 举报

 楼主| Timelysnow 发表于 2017-6-5 16:46 来自手机 | 显示全部楼层 来自: 湖北省武汉市 移动
野草 发表于 2017-6-4 17:36
兄弟,刚才又手动监听了一次,我把我用到的对话信息全部发给你
建立连接时
Stellarium发送 “#:GR#”       ...

感谢!前辈+高手+热心肠,请+大师兄DIY群,一起讨论。
回复 支持 反对

使用道具 举报

anyway132 发表于 2017-7-14 17:09 | 显示全部楼层 来自: 广东省佛山市 电信
Timelysnow 发表于 2017-6-5 16:05
嗯,我也看了源码,现在问题解决了,谢谢大家。

请问stellarium的源代码在那个文件夹?
回复 支持 反对

使用道具 举报

本版积分规则

快速回复 返回顶部 返回列表